線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1551
推到 Plurk!
推到 Facebook!

動態視窗MDI會出錯??

尚未結案
小蟲
一般會員


發表:23
回覆:35
積分:11
註冊:2004-08-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-27 14:25:25 IP:211.78.xxx.xxx 未訂閱
大家好~我想請問一個怪問題~ 剛剛我學會了動態產生視窗 我想把它運用在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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-27 16:06:43 IP:203.70.xxx.xxx 未訂閱
小蟲您好 小弟測試結果不會有錯押 除了這些程式碼以外沒有其他的嗎? 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
小蟲
一般會員


發表:23
回覆:35
積分:11
註冊:2004-08-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-27 16:47:58 IP:211.78.xxx.xxx 未訂閱
ENIX007大大 已經沒有了ㄚ 我就只用了上面這些 沒別的了~~ 但是我剛剛也重開機過了!! 還是一樣納 這是我新建的專案 我附上錯誤訊息好了
ENIX007
高階會員


發表:28
回覆:274
積分:185
註冊:2003-11-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-27 16:54:56 IP:203.70.xxx.xxx 未訂閱
小蟲您好 那可能要麻煩您上傳專案了... 因為我照您的說法做了一個一模一樣的專案,按了數十次按鈕也沒發生問題 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
小蟲
一般會員


發表:23
回覆:35
積分:11
註冊:2004-08-26

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-27 17:12:22 IP:211.78.xxx.xxx 未訂閱
http://myweb.hinet.net/home8/aki0921/TEST.rar 我上傳在這上面 我剛剛又是了很多但是當是一樣 10~20次就會出現錯誤 麻煩你嚕!! 謝謝
小蟲
一般會員


發表:23
回覆:35
積分:11
註冊:2004-08-26

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-08-27 17:17:08 IP:211.78.xxx.xxx 未訂閱
抱歉~~剛剛忘了說 我發現用滑鼠點按鈕會比較快出錯 用ENTER案會比較慢 有時還不會出來 所以建議用滑鼠按
ENIX007
高階會員


發表:28
回覆:274
積分:185
註冊:2003-11-27

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-08-27 18:37:06 IP:203.70.xxx.xxx 未訂閱
小蟲您好 這與之前那篇有個很不一樣的地方 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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-08-27 19:36:37 IP:211.78.xxx.xxx 未訂閱
ENIX007大大!! 我雖然把FORM2給砍掉!! 但是我都沒有呼叫他 他應該不會出錯吧?? 我剛剛也把DELETE FORM2改成FORM2->CLOSE(); 但是用滑鼠點還是會出錯!! 我在想會不會是MID他本身有什麼限制?? ><"好難理解喔 不過還是要謝謝大大的幫忙~~ 我在努力找答案看看好嚕 ^^
小蟲
一般會員


發表:23
回覆:35
積分:11
註冊:2004-08-26

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-08-28 17:11:58 IP:211.78.xxx.xxx 未訂閱
><"有沒有人知道為什麼會這樣!! 我想好久了喔!!快要風了 我在想ENTER跟滑鼠點~~ 應該沒有差別的阿? 還是說他們兩個事件處理的方式不同? 我到底該怎麼做內? 有人可以幫幫我媽? 謝謝
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-08-28 22:26:47 IP:61.142.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-08-29 09:51:37 IP:211.78.xxx.xxx 未訂閱
謝謝andychang1690大大的熱心幫忙 我剛剛已經上傳好了.不過上面的下載點還可以下載內?? 我一直沒殺掉~ 謝謝幫忙︿︿ http://delphi.ktop.com.tw/topic.php?TOPIC_ID=55563
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-08-29 11:01:30 IP:61.142.xxx.xxx 未訂閱
小蟲: 將你的Project/Options/Linker 屬性頁不選中Use dynamic RTL選項試試看! 關於Use dynamic RTL你可以參考 http://delphi.ktop.com.tw/topic.php?topic_id=54922 Andy Chang
------
Andy Chang
小蟲
一般會員


發表:23
回覆:35
積分:11
註冊:2004-08-26

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-08-29 12:21:14 IP:211.78.xxx.xxx 未訂閱
andychang1690大大: 我已經將你說的 Project/Options/Linker 屬性頁 Use dynamic RTL 點選掉 但是他還是出現錯誤 而且平律變高了~ 有時點三次 有時點五次就出現了 按ENTER還是不會錯 好怪喔~~ 我剛剛找了好多文章怎麼大家都沒遇到我這種問題內? 呼~~ 謝謝andychang1690的幫忙
justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-08-29 22:26:24 IP:221.169.xxx.xxx 未訂閱
使用 delete 刪除自己的記憶體空間,似乎粗暴了點 請改用 Release 他會在適當的時機將自己刪除掉 這樣就正常了    ex:
delete Form2;
改成
Form2->Release();
至於為什麼按Enter不會當掉.. 只有天知道了... ^^"
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-08-30 08:35:05 IP:202.104.xxx.xxx 未訂閱
小蟲:對不起原因為我使用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

發送簡訊給我
#16 引用回覆 回覆 發表時間:2004-08-30 09:04:26 IP:203.70.xxx.xxx 未訂閱
小蟲您好 又被您騙了 請仔細看您第一篇的描述 <>< 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

發送簡訊給我
#17 引用回覆 回覆 發表時間:2004-08-30 09:36:25 IP:61.218.xxx.xxx 未訂閱
謝謝各位大大的幫忙~~ 真的很感謝︿︿ 原來是我一開始就做錯了!! 我不應該這麼暴力的 呼~~ 就justdo大大說的一點都沒錯改好後就不會出錯了 剛剛測試點了150下都OK 所以我想應該沒問題了 謝謝!! 不過還是不知道這是什麼原因照成這樣的 有機會等我找到再告訴各位大大~ 謝謝你們的幫忙
ENIX007
高階會員


發表:28
回覆:274
積分:185
註冊:2003-11-27

發送簡訊給我
#18 引用回覆 回覆 發表時間:2004-08-30 14:00:38 IP:203.70.xxx.xxx 未訂閱
引言: 不過這裡倒是有個很奇怪的問題,那就是開了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

發送簡訊給我
#19 引用回覆 回覆 發表時間:2004-08-30 15:01:57 IP:211.78.xxx.xxx 未訂閱
謝謝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

發送簡訊給我
#20 引用回覆 回覆 發表時間:2004-08-30 15:28:34 IP:203.70.xxx.xxx 未訂閱
小蟲您好 設計時期在物件檢視器(Object Inspector)選擇Events頁籤,找到OnMouseUp (此時是選擇Button的狀態),在其右邊空白處點左鍵2下,BCB就自動幫您生出來囉, 其餘依此類推 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
小蟲
一般會員


發表:23
回覆:35
積分:11
註冊:2004-08-26

發送簡訊給我
#21 引用回覆 回覆 發表時間:2004-08-30 17:01:36 IP:211.78.xxx.xxx 未訂閱
ENIX007大大我會了 真的很謝謝你~跟你那熱心的同事!! BCB真的好多東西要學喔 看來我要多加由了 謝謝
系統時間:2024-04-29 4:34:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!