我使用forstyle=MDIform 但child form 在閉關後,再開就會出現error |
|
fgchiu
一般會員 發表:6 回覆:5 積分:2 註冊:2003-04-15 發送簡訊給我 |
我這個小程式是目前只做好一個form 但在開關就有問題
目前只做了發票資料的進貨發票 用一步一步的trace
發現問題發生在判別mdi child form 是否還存在的副程式
bool OpenForm(TForm *WForm)
{
int i;
bool FormExist; //判斷Form是否已經被建立
if (WForm==NULL) return False;
//FormExist=false;
for (i=0;i
附加檔案:28835_作業區.rar
|
chrischung73
一般會員 發表:5 回覆:13 積分:3 註冊:2004-03-30 發送簡訊給我 |
您的專案我無法打開或且執行
但我模擬您的程式, 寫了一個小的測試程式
可能與您的問題不相符, 不過我想應該會有參考價值 範例說明 (也很抱歉, 我的範例不知如何上傳, 但很簡單, 所以說明如下)
1. Form1為一個 fsMDIForm
2. Form2為一個 fsMDIChild
3. Form1中有兩個Button皆能用來開啟 Form2, 其一用您的method OpenForm 開啟, 另一則是以 new TForm2(Application) 方式開啟
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (!OpenForm(Form2))
{
Form2 = new TForm2(Application);
Form2->Caption="OpenForm";
}
}
//---------------------------------------------------------------void __fastcall TForm1::Button2Click(TObject *Sender)
{
Form2 = new TForm2(Application);
Form2->Caption="New Form";
}
//---------------------------------------------------------------
測試方式如下:
Step1.按下 "OpenForm" Button1 開啟 Form2
Step2.按下 "New Form" Button2 開啟 Form2, 然後再將它關閉
Step3.重覆步聚1. 按下 "OpenForm" button 開啟 Form2
您是否期待, 在Step3時並 '不會' 重覆開啟 Form2 但結果不然, 原因是:
1.Unit2.cpp 中所宣告的 TForm2 *Form2; 是一個global指標, 以範例而言, 它是指向最新開啟的視窗
2.續上, 當Step2執行完畢時, Form2指標已知是垃圾了, 除非全部 Form2視窗全關閉才有可能清除為NULL
3.續上, 當Step3執行時, 傳入WForm的指標當然也是錯誤的(雖然如此, 但WForm->ClassType()不一定會發生錯誤),
因此即使Step1中的視窗存在, 但仍舊return false且開啟新視窗 為了證明 Step2關閉後, 的確會造成 Step3的錯誤, 請在OpenForm()第一行敍述後加上 step4, 再重新執行step1. step2. step3
bool OpenForm(TForm *WForm) {
....
if (WForm==NULL) return False;
ShowMessage(WForm->Caption); //Step4
...
} 結論是使用 OpenForm() 時, 要注意所傳入的視窗指標是否指向您所要的. 希望文有對題, 對您有所幫助
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |