動態視窗MDI會出錯?? |
尚未結案
|
小蟲
一般會員 發表:23 回覆:35 積分:11 註冊:2004-08-26 發送簡訊給我 |
大家好~我想請問一個怪問題~
剛剛我學會了動態產生視窗
我想把它運用在MDI上面!!
可是他卻會出現錯誤訊!!
我建了四各FORM
FORM在Formstyle設FSMDIFORM
其他都設FSMDICHILD
我把FORM1跟FORM2放入AUTO-CREATE FORMS
form3跟form4放入available forms中
form2按鈕打入
Form3 = new TForm3(Application);
Form3->Show();
delete Form2;
form3按鈕打入
Form4 = new TForm4(Application);
Form4->Show();
delete Form3;
form4按鈕打入
Form3 = new TForm3(Application);
Form3->Show();
delete Form4;
執行時都沒問題
開開關關也都可以
但是當你按差不多10~20次的時候他就會出現錯誤訊息了
妳把錯誤訊息關掉
又可以在開開關關10~20次??
位什麼內?
我是哪裡用錯了??
可否告知ㄧ下@@
謝謝
|
ENIX007
高階會員 發表:28 回覆:274 積分:185 註冊:2003-11-27 發送簡訊給我 |
|
小蟲
一般會員 發表:23 回覆:35 積分:11 註冊:2004-08-26 發送簡訊給我 |
|
ENIX007
高階會員 發表:28 回覆:274 積分:185 註冊:2003-11-27 發送簡訊給我 |
|
小蟲
一般會員 發表:23 回覆:35 積分:11 註冊:2004-08-26 發送簡訊給我 |
|
小蟲
一般會員 發表:23 回覆:35 積分:11 註冊:2004-08-26 發送簡訊給我 |
|
ENIX007
高階會員 發表:28 回覆:274 積分:185 註冊:2003-11-27 發送簡訊給我 |
小蟲您好
這與之前那篇有個很不一樣的地方
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=55432
您這裡使用了
引言:form2按鈕打入 Form3 = new TForm3(Application); Form3->Show(); delete Form2;在Form2的ButtonClick()中delete Form2,這會造成Click事件返回時找不到 位址,因為Form2已被刪除了... 如果您把CodeGuard打開,會發現每次都一定會當!!! 如果真要這樣寫,應該把 delete Form2; 改為 Form2->Close(); 然後在Close()事件中 Action = caFree; 這樣刪除才安全 不過這裡倒是有個很奇怪的問題,那就是開了CodeGuard後,使用滑鼠按按鈕, 一定會當(正常現象),但按Enter鍵卻能正常關閉!!! 這問題小弟就無能為力了< > 小弟一開始測試就是按著 > 參考看看< > 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~ |
小蟲
一般會員 發表:23 回覆:35 積分:11 註冊:2004-08-26 發送簡訊給我 |
|
小蟲
一般會員 發表:23 回覆:35 積分:11 註冊:2004-08-26 發送簡訊給我 |
|
andychang1690
資深會員 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
引言: http://myweb.hinet.net/home8/aki0921/TEST.rar 我上傳在這上面 我剛剛又是了很多但是當是一樣 10~20次就會出現錯誤 麻煩你嚕!! 謝謝小蟲: http://myweb.hinet.net/home8/aki0921/TEST.rar 我無法下載,若可以的話也可以將整個Project上傳至[會員求助區] http://delphi.ktop.com.tw/forum.asp?FORUM_ID=97 並請將連結Post上來!謝謝。 Andy Chang 發表人 - andychang1690 於 2004/08/28 22:30:11
------
Andy Chang |
小蟲
一般會員 發表:23 回覆:35 積分:11 註冊:2004-08-26 發送簡訊給我 |
|
andychang1690
資深會員 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
|
小蟲
一般會員 發表:23 回覆:35 積分:11 註冊:2004-08-26 發送簡訊給我 |
|
justdo
高階會員 發表:2 回覆:359 積分:222 註冊:2004-08-17 發送簡訊給我 |
|
andychang1690
資深會員 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
小蟲:對不起原因為我使用BCB5所以必須改變你的程式測試。
而且環境粗糙一些,我贊成justdo大所言使用 delete 刪除自己的記憶體空間,似乎粗暴了點。使用ENIX007大的方式改為
Close();
然後在Close()事件中
Action = caFree;
這樣刪除才安全這點測試我發現沒問題!
使用justdo大所言改用
Release();
我也沒問題!
我測試環境是
Project/Options/Packages屬性頁不選中Builder with runtime packages選項
Project/Options/Linker 屬性頁不選中Use dynamic RTL選項
Use debug libraries 及 Create debug information 勾選
Project/Options/Compiler 我選擇Fulldebug
而且最有意思是我使用小蟲原程式於BCB的Run(F9)居然沒問題!但
於Windows單獨執行就出現問題。
看來可能要請其他大大解釋了! Andy Chang
------
Andy Chang |
ENIX007
高階會員 發表:28 回覆:274 積分:185 註冊:2003-11-27 發送簡訊給我 |
小蟲您好
又被您騙了
請仔細看您第一篇的描述
<>< face="Verdana, Arial, Helvetica">引言: 我建了四各FORM
FORM在Formstyle設FSMDIFORM
其他都設FSMDICHILD
我把FORM1跟FORM2放入AUTO-CREATE FORMS
form3跟form4放入available forms中
form2按鈕打入
Form3 = new TForm3(Application);
Form3->Show();
delete Form2;
form3按鈕打入
Form4 = new TForm4(Application);
Form4->Show();
delete Form3;
form4按鈕打入
Form3 = new TForm3(Application);
Form3->Show();
delete Form4;
上述每一個FORM都是在自己的Click()事件中刪除自己,這一定會出問題的...
原因是當您按下按鈕時,並不是只觸發Click()事件而已!!
還附帶MouseUp(),MouseDown()等等...只要有任何一個事件在delete之後的,
就會因為找不到相對應記憶體(因已被您delete了...)而出錯!!
而使用Close()後的Action=caFree或者是Release(),它會在所有事件完成後才進行
記憶體釋放動作(BCB自行管理),所以不會有問題...
以您的程式而言,每一個Form都改成Close()後Action = caFree或Release(),
就沒有問題了...
之前的SDI討論中您都是刪別的Form(例如Form2中刪除Form1)...這是最大的不同點...
小弟認為這是問題癥結所在...
至於Enter為何不出錯,我想這是BCB內部函式處理順序不同吧,雖然Click()事件
都會觸發,但按Enter另外會觸發的是KeyUp(),KeyDown()等等,整體的處理程序
是不同的...
不過小弟還是認為要避免這種寫法,太危險了(指使用 > 附上另一篇討論( href="http://delphi.ktop.com.tw/topic.php?TOPIC_ID=55432">http://delphi.ktop.com.tw/topic.php?TOPIC_ID=55432
小弟認為這與MDI無關,SDI與MDI差別只在於FormClose()時的預設動作,SDI是Hide(),
MDI是Minimize(),二者都不是釋放記憶體,因此才必須在Close()事件中加入
Action = caFree的方式來做(詳情請見BCB OnClose() Help) 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~ 發表人 - ENIX007 於 2004/08/30 09:10:08
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~ |
小蟲
一般會員 發表:23 回覆:35 積分:11 註冊:2004-08-26 發送簡訊給我 |
|
ENIX007
高階會員 發表:28 回覆:274 積分:185 註冊:2003-11-27 發送簡訊給我 |
引言: 不過這裡倒是有個很奇怪的問題,那就是開了CodeGuard後,使用滑鼠按按鈕, 一定會當(正常現象),但按Enter鍵卻能正常關閉!!! 這問題小弟就無能為力了關於這個問題,經由小弟一位熱心的同事測試結果發現,使用BCB附的WinSight32 工具監看訊息,當滑鼠按下按鈕後,若delete Form寫在Click()事件的話,當 delete完會因為呼叫Button的OnMouseUp()事件而導致記憶體存取錯誤,因此 如果將delete Form寫在OnMouseUp()的話,就沒有問題了(但還是建議不要這樣做) 而按 class="code"> TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { Form2->Show(); delete Form1;//設定中斷點 } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { Caption = "M_UP";//設定中斷點 } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1KeyUp(TObject *Sender, WORD &Key, TShiftState Shift) { Caption = "K_UP";//設定中斷點 } //--------------------------------------------------------------------------- void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { Caption = "Close";//設定中斷點 } 執行後 1.以滑鼠按按鈕,trace結果-->先執行delete後,執行OnKeyUp(),錯誤!! 2.按下Enter,trace結果-->執行完delete,就結束了!! 以上,參考看看 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~ |
小蟲
一般會員 發表:23 回覆:35 積分:11 註冊:2004-08-26 發送簡訊給我 |
謝謝ENIX007的熱心幫忙!!
讓我又學到測試的方法!!
但是我可以在問一下嗎?
為什麼我你給我的程式COPY進去
想試試看
但是他卻說我出錯
Button1MouseUp..Button1KeyUp..FormClose
要去哪裡叫出來內?
抱歉我才剛學不清楚他的用法
謝謝~~
引言: void __fastcall TForm1::Button1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { Caption = "M_UP";//設定中斷點 } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1KeyUp(TObject *Sender, WORD &Key, TShiftState Shift) { Caption = "K_UP";//設定中斷點 } //--------------------------------------------------------------------------- void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { Caption = "Close";//設定中斷點 }[/code] |
ENIX007
高階會員 發表:28 回覆:274 積分:185 註冊:2003-11-27 發送簡訊給我 |
|
小蟲
一般會員 發表:23 回覆:35 積分:11 註冊:2004-08-26 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |