全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1428
推到 Plurk!
推到 Facebook!

我使用forstyle=MDIform 但child form 在閉關後,再開就會出現error

 
fgchiu
一般會員


發表:6
回覆:5
積分:2
註冊:2003-04-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-04-17 10:39:41 IP:61.231.xxx.xxx 未訂閱
我這個小程式是目前只做好一個form 但在開關就有問題 目前只做了發票資料的進貨發票    用一步一步的trace  發現問題發生在判別mdi child form 是否還存在的副程式 bool OpenForm(TForm *WForm) {         int i;         bool FormExist;            //判斷Form是否已經被建立         if (WForm==NULL) return False;         //FormExist=false;         for (i=0;iFormCount;i ) if (Screen->Forms[i]->ClassType()==WForm->ClassType()){ FormExist=true; break; } if (FormExist==False) return FormExist; //每次第二次開啟時這一行就不會成立 但當main_menu 的第三大項和第四大項的位置對調 程式就不會出現問題,這行就會成立 我找不出錯誤在那....請大家幫幫我 //如果此Form已被建立,再判斷此Form狀態是否在最小化or隱藏 //如果是則把Form顯示出來 if (WForm->WindowState==wsMinimized) ShowWindow(WForm->Handle,SW_SHOWNORMAL); else ShowWindow(WForm->Handle,SW_SHOWNA); if (!WForm->Visible) WForm->Visible=true; //把游標的焦點轉移到此Form上 WForm->BringToFront(); WForm->SetFocus(); return true; }
附加檔案:28835_作業區.rar
chrischung73
一般會員


發表:5
回覆:13
積分:3
註冊:2004-03-30

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-04-20 18:28:34 IP:211.21.xxx.xxx 未訂閱
您的專案我無法打開或且執行 但我模擬您的程式, 寫了一個小的測試程式 可能與您的問題不相符, 不過我想應該會有參考價值 範例說明 (也很抱歉, 我的範例不知如何上傳, 但很簡單, 所以說明如下) 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() 時, 要注意所傳入的視窗指標是否指向您所要的. 希望文有對題, 對您有所幫助
系統時間:2024-07-05 10:17:07
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!