clio4177
一般會員

 發表:28 回覆:21 積分:9 註冊:2002-07-17
發送簡訊給我
|
各位大大:
請問我用MDI設計撰寫程式,首先是先進入login的畫面,但經過登入確認後,卻無法關閉login這個子畫面,請問該如何解決?我的程式碼如下:
void __fastcall TEDDMLogin::OKClick(TObject *Sender)
{
input_uname= Edit1->Text;
input_pword= Edit2->Text;
if(time_check <= 3)
{
if ((input_uname == "guest") && (input_pword == "555"))
{
MainForm->ToolButton13->Enabled= true;
MainForm->ToolButton14->Enabled= true;
MainForm->ToolButton15->Enabled= true;
time_check= 0;
EDDMLogin->Action= caFree; //關閉這個子視窗
}
else
{
Edit1->Text="";
Edit2->Text="";
ShowMessage("The Username or Password is not correct.");
time_check= time_check ;
}
}
else
{
ShowMessage("The EDDM login is over 3 times.");
EDDMLogin->Action= caFree; //關閉這個子視窗
}
}
|
dllee
站務副站長
    
 發表:321 回覆:2519 積分:1711 註冊:2002-04-15
發送簡訊給我
|
引言:
各位大大:
請問我用MDI設計撰寫程式,首先是先進入login的畫面,但經過登入確認後,卻無法關閉login這個子畫面,請問該如何解決?我的程式碼如下:
void __fastcall TEDDMLogin::OKClick(TObject *Sender)
{
input_uname= Edit1->Text;
input_pword= Edit2->Text;
if(time_check <= 3)
{
if ((input_uname == "guest") && (input_pword == "555"))
{
MainForm->ToolButton13->Enabled= true;
MainForm->ToolButton14->Enabled= true;
MainForm->ToolButton15->Enabled= true;
time_check= 0;
EDDMLogin->Action= caFree; //關閉這個子視窗
}
else
{
Edit1->Text="";
Edit2->Text="";
ShowMessage("The Username or Password is not correct.");
time_check= time_check ;
}
}
else
{
ShowMessage("The EDDM login is over 3 times.");
EDDMLogin->Action= caFree; //關閉這個子視窗
}
}
對不起,請問一下,為什麼
EDDMLogin->Action= caFree; //關閉這個子視窗
這樣就可以關閉子視窗呢?
我只知道,在 TForm 的 OnClose 事件中,有可能用到 caFree 這個東西,如下是 BCB 的 Online Help
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
if (MessageDlg("Close application ?", mtConfirmation, TMsgDlgButtons() << mbYes << mbNo,0) == mrYes)
Action = caFree;
else
Action = caMinimize;
}
我想,如果您要關閉視窗,只需要
EDDMLogin->Close(); //關閉這個子視窗
這樣就可以了。 沒空更新的網頁...
http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------ http://www.ViewMove.com
|
clio4177
一般會員

 發表:28 回覆:21 積分:9 註冊:2002-07-17
發送簡訊給我
|
dell 您好:
因為我之前也是使用
EDDMLogin->Close();
會發生無法關閉的現象,其次即使利用Hide來隱藏視窗也會發生錯誤!!
所以想請教各位大大,類似這種問題該如何解決?
|
tech_state
版主
    
 發表:44 回覆:638 積分:641 註冊:2003-02-10
發送簡訊給我
|
clio4177, 您好
我修改了一下您的code,您再試試看這樣是否符合您的需求。
EDDMLogin->Action= caFree; //關閉這個子視窗
改為
Close();
然後在EDDMLogin的OnClose的Event裡增加
Action = caFree;
=================================
涵養怒中氣。謹防順口言。留心忙裡錯。珍惜有時錢。
是非終日有,不聽自然無
天下本無事,庸人自擾之
|
dllee
站務副站長
    
 發表:321 回覆:2519 積分:1711 註冊:2002-04-15
發送簡訊給我
|
引言:
dell 您好:
因為我之前也是使用
EDDMLogin->Close();
會發生無法關閉的現象,其次即使利用Hide來隱藏視窗也會發生錯誤!!
所以想請教各位大大,類似這種問題該如何解決?
因為沒有您的 code 只能由您提供部分的 code 來判斷,有可能是您的
EDDMLogin
根本就不能用。
也許在 .cpp 的前面可以看到 TEDDMLogin *EDDMLogin;
void __fastcall TEDDMLogin::TEDDMLogin( 這樣,這個 EDDMLogin 在整個 .cpp 中都可以使用,甚至別的 .cpp 只要有 include 該 header 檔也可以用,但如果不小心用,就會發生 exception!!
發生的原因是,如果這個表單是您自己 new 的,而不是由 project 幫您 new 的,這時,如果您不是用 EDDMLogin = new TEDDMLogin(Application); 而是另外宣告的話,如: TEDDMLogin *LoginForm= new TEDDMLogin(Application); 這時,使用 EDDMLogin 就會 exception。
在 .cpp 中,最好使用 this 來取代 EDDMLogin ,例如: this->Close(); 當然,這個 this 是可以省略的,也就如 tech_state 版主所說的方法,用 Close() 就可以了。如果您的 OnClose 本來就沒有用,那就不必特別去寫 Action=caFree; 沒空更新的網頁...
http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------ http://www.ViewMove.com
|
clio4177
一般會員

 發表:28 回覆:21 積分:9 註冊:2002-07-17
發送簡訊給我
|
dllee:
以下是我的MDI主頁的程式碼:
//---------------------------------------------------------------------------
#include
#pragma hdrstop #include "EDDMMain.h"
#include "About.h"
#include "login.h"
//--------------------------------------------------------------------
#pragma resource "*.dfm"
TMainForm *MainForm; //-------------------------------------------------------------------- __fastcall TMainForm::TMainForm(TComponent *Owner)
: TForm(Owner)
{
}
//-------------------------------------------------------------------- void __fastcall TMainForm::CreateMDIChild(String Name)
{
TMDIChild *Child;
//--- create a new MDI child window ----
Child = new TMDIChild(Application);
Child->Caption = Name;
if (FileExists (Name))
Child->Memo1->Lines->LoadFromFile(Name);
}
//------------------------------------------------------------------- void __fastcall TMainForm::FormShow(TObject *Sender)
{
ToolButton13->Enabled= false; //功能鍵false
ToolButton14->Enabled= false;
ToolButton15->Enabled= false;
ToolButton16->Enabled= false;
ToolButton19->Enabled= false;
ToolButton20->Enabled= false; TEDDMLogin *EDDMLogin; //呼叫EDDMLogin頁面
EDDMLogin = new TEDDMLogin(Application);
} 而下面是EDDMLogin的程式碼: //-------------------------------------------------------------------- #include
#pragma hdrstop #include "login.h"
#include "EDDMMain.h"
//--------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TEDDMLogin *EDDMLogin; int time_check=0; //參數宣告
String input_uname,input_pword;
String set_uname,set_pword;
//--------------------------------------------------------------------
__fastcall TEDDMLogin::TEDDMLogin(TComponent* Owner)
: TForm(Owner)
{
}
//-------------------------------------------------------------------- void __fastcall TEDDMLogin::BitBtnOK1Click(TObject *Sender)
{
input_uname= Edit1->Text;
input_pword= Edit2->Text;
set_uname= "guest"; //內定之使用者及密碼
set_pword= "5555"; if(time_check <= 3)
{
if ((input_uname == set_uname) && (input_pword == set_pword))
{
MainForm->ToolButton13->Enabled= true;
MainForm->ToolButton14->Enabled= true;
MainForm->ToolButton15->Enabled= true;
MainForm->ToolButton16->Enabled= true;
MainForm->ToolButton19->Enabled= true;
MainForm->ToolButton20->Enabled= true;
time_check= 0;
EDDMLogin->Close(); //關閉EDDMLogin頁面
//出現無法關閉此頁面的情形
}
else
{
Edit1->Text="";
Edit2->Text="";
ShowMessage("The Username or Password is not correct. Please Check it.");
time_check= time_check ;
}
}
else
{
ShowMessage("The EDDM login is over 3 times. The EDDM will be close.");
MainForm->Close(); //關閉EDDM主頁
} }
//--------------------------------------------------------------------
void __fastcall TEDDMLogin::BitBtnCancle2Click(TObject *Sender)
{
EDDMLogin->Close(); //關閉EDDM及EDDMLogin的頁面
MainForm->Close();
}
//-------------------------------------------------------------------- void __fastcall TEDDMLogin::FormShow(TObject *Sender)
{
TMainForm *MainForm;
MainForm= new TMainForm(Application);
}
//-------------------------------------------------------------------- 如上述程式碼中,當完成Login辨識後,則進入EDDM主頁中但是卻無法關閉這個EDDMLogin頁面。但如果辦事錯誤超過3次或取消登入時,整個EDDM畫面都可以正常關閉,唯獨無法單獨關閉EDDMLogin這個畫面。請問該如何處理這個問題??
|
dllee
站務副站長
    
 發表:321 回覆:2519 積分:1711 註冊:2002-04-15
發送簡訊給我
|
引言:
dllee:
以下是我的MDI主頁的程式碼:
//---------------------------------------------------------------------------
#include
#pragma hdrstop #include "EDDMMain.h"
#include "About.h"
#include "login.h"
//--------------------------------------------------------------------
#pragma resource "*.dfm"
TMainForm *MainForm; // 如同我說的這個 MainForm 已是 Global 變數 //-------------------------------------------------------------------- __fastcall TMainForm::TMainForm(TComponent *Owner)
: TForm(Owner)
{
}
//-------------------------------------------------------------------- void __fastcall TMainForm::CreateMDIChild(String Name)
{
TMDIChild *Child;
//--- create a new MDI child window ----
//每一個 Child 都是動態載入的,在 TMDIChild 中您就看不到
// TMDIChild *MDIChild; 的整體變數,因為用那個鐵死,所以
// BCB 就沒幫您放。
Child = new TMDIChild(Application);
Child->Caption = Name;
if (FileExists (Name))
Child->Memo1->Lines->LoadFromFile(Name);
}
//------------------------------------------------------------------- void __fastcall TMainForm::FormShow(TObject *Sender)
{
ToolButton13->Enabled= false; //功能鍵false
ToolButton14->Enabled= false;
ToolButton15->Enabled= false;
ToolButton16->Enabled= false;
ToolButton19->Enabled= false;
ToolButton20->Enabled= false; TEDDMLogin *EDDMLogin; //呼叫EDDMLogin頁面
// 在此您又自行定義了 EDDMLogin 這個變數,它與 EDDMLogin.cpp 的那個整體變數同名
// C 在這樣的狀況下,會將目前這個 EDDMLogin 視為區域變數,只在
// TMainForm::FormShow() 內有效
// 也就是說,這個 EDDMLogin 與 EDDMLogin.cpp 的那個不同,
// 也表示說,您在 EDDMLogin.cpp 中直接使用 EDDMLogin 是危險的,
// 因為它根本就沒有被 new 過!
// 當然,這還要看您的 Project 是如何設定在,在 Project Option 中
// 可以設定那些表單是自動 new ,那些是自己 new,如果您已設成自己 new
// 那只要在 EDDMLogin.cpp 中直接使用 EDDMLogin 就是 Exception!!
EDDMLogin = new TEDDMLogin(Application);
// 另外,您只有 new 並沒有 show 它?! } 而下面是EDDMLogin的程式碼: //-------------------------------------------------------------------- #include
#pragma hdrstop #include "login.h"
#include "EDDMMain.h"
//--------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TEDDMLogin *EDDMLogin; // 如同我說的這個 EDDMLogin 已是 Global 變數 int time_check=0; //參數宣告
String input_uname,input_pword;
String set_uname,set_pword;
//--------------------------------------------------------------------
__fastcall TEDDMLogin::TEDDMLogin(TComponent* Owner)
: TForm(Owner)
{
}
//-------------------------------------------------------------------- void __fastcall TEDDMLogin::BitBtnOK1Click(TObject *Sender)
{
input_uname= Edit1->Text;
input_pword= Edit2->Text;
set_uname= "guest"; //內定之使用者及密碼
set_pword= "5555"; if(time_check <= 3)
{
if ((input_uname == set_uname) && (input_pword == set_pword))
{
// 在此使用 MainForm 如果沒有問題,表示您的 MainForm 應該是 Application 已 new 出
MainForm->ToolButton13->Enabled= true;
MainForm->ToolButton14->Enabled= true;
MainForm->ToolButton15->Enabled= true;
MainForm->ToolButton16->Enabled= true;
MainForm->ToolButton19->Enabled= true;
MainForm->ToolButton20->Enabled= true;
time_check= 0;
EDDMLogin->Close(); //關閉EDDMLogin頁面
//出現無法關閉此頁面的情形
// 應使用 Close() 或 this->Close()
}
else
{
Edit1->Text="";
Edit2->Text="";
ShowMessage("The Username or Password is not correct. Please Check it.");
time_check= time_check ;
}
}
else
{
ShowMessage("The EDDM login is over 3 times. The EDDM will be close.");
// 因為您的 MainForm 是正常由 Application new 出來的,所以可以正常關閉
MainForm->Close(); //關閉EDDM主頁
} }
//--------------------------------------------------------------------
void __fastcall TEDDMLogin::BitBtnCancle2Click(TObject *Sender)
{
EDDMLogin->Close(); //關閉EDDM及EDDMLogin的頁面
// 改 Close() 或 this->Close()
MainForm->Close();
}
//-------------------------------------------------------------------- void __fastcall TEDDMLogin::FormShow(TObject *Sender)
{
// 這段應該全部都是多餘的程式碼,全部都可以刪除!
// 與 TMainForm::FormShow() 相同的問題!!
TMainForm *MainForm;
MainForm= new TMainForm(Application); }
//--------------------------------------------------------------------
如上述程式碼中,當完成Login辨識後,則進入EDDM主頁中但是卻無法關閉這個EDDMLogin頁面。但如果辦事錯誤超過3次或取消登入時,整個EDDM畫面都可以正常關閉,唯獨無法單獨關閉EDDMLogin這個畫面。請問該如何處理這個問題??
您可以看一下您的專案主 cpp 檔,就是那個沒有表單,只有 .cpp 的那個檔,您可以看到類似:
//---------------------------------------------------------------------
#include
#pragma hdrstop
//---------------------------------------------------------------------
USEFORM("Main.cpp", MainForm);
USEFORM("ChildWin.cpp", MDIChild);
USERES("mdiapp.res");
USEFORM("EDDMLogin.cpp", EDDMLogin);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
Application->Initialize();
Application->CreateForm(__classid(TMainForm), &MainForm);
Application->CreateForm(__classid(TEDDMLogin), &EDDMLogin);
Application->Run(); return 0;
}
//---------------------------------------------------------------------
如果看到像是上面的 code 表示 MainForm 及 EDDMLogin 都是 Application 已 new 出,只要有 include 它們的 header 檔,就可以直接使用 MainForm 及 EDDMLogin。如果您的 code 真的如上,則所有您自己 new 的都刪除, MainForm 會在 Application->Run(); 時自動秀出,在它秀出時,如同您攔下 OnShow ,再加入
if(EDDMLogin->ShowModal()!=mrOk) // 如果 Login 不成功,則
Close(); // 主表單關閉,也就等於 Application 關閉
而您在 EDDMLogin.cpp 中原本要使用 Close() 的地方,則改用
ModalResult = mrOk; // 表示正常 Login ,會自動關閉 EDDMLogin 視窗
或
ModalResult = mrCancel; // 表示 Login 失敗,也會自動關閉 EDDMLogin 視窗 我猜想,您應該是已經會一些 C/C 但剛接觸 BCB 吧,建議您先看看一些入門的書,會比較快進入狀況,因為您的問題似乎... 與眾不同 >沒空更新的網頁...
href="http://dllee.adsldns.org">http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell.... 發表人 - dllee 於 2003/06/29 09:55:56
------ http://www.ViewMove.com
|