動態產生視窗產生的問題 |
答題得分者是:dllee
|
iiskiki
一般會員 發表:8 回覆:10 積分:3 註冊:2007-10-03 發送簡訊給我 |
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
書我是沒看過,不過動態視窗與任何元件應該沒有關係。
重點是您使用視窗前是否正確 new 出它後再使用它, 最常發生的問題就是沒 new 就用,自然是發生 Exception。 ■ VMASK - ViewMove Automation Software Kernel ■ VMIO-Server/SECS/GEM ■ dllee's blog ■ dllee's StatPlus ■
------
http://www.ViewMove.com |
iiskiki
一般會員 發表:8 回覆:10 積分:3 註冊:2007-10-03 發送簡訊給我 |
不好意思~
我不太明白您的意思... new ?? 我有把我要new的視窗 移到 Available forms 以下是我主視窗要new的程式部份 [code cpp] Tclient1 *client1; client1 = new Tclient1(Application); client1->Show(); Tclient2 *client2; client2 = new Tclient2(Application); client2->Show();[/code] 在client1跟client2的OnClose中也分別都有做釋放的動作 [code cpp] void __fastcall Tclient1::FormClose(TObject *Sender, TCloseAction &Action) { Action = caFree; }[/code] 但我不明白程式執行到(兩個視窗程式都有用到timer元件來傳遞訊息) [code cpp] board1->Canvas->Brush->Color=clBlack; board1->Canvas->Ellipse(temp1,temp2,temp1 33,temp2 33); client2->Timer1->Enabled=true;//執行到這就會跳出警告視窗 look->Timer1->Enabled=true; form_enable=0;[/code] 這到底是怎麼一回事呢?? ===================引 用 dllee 文 章=================== 書我是沒看過,不過動態視窗與任何元件應該沒有關係。 重點是您使用視窗前是否正確 new 出它後再使用它, 最常發生的問題就是沒 new 就用,自然是發生 Exception。 ■ VMASK - ViewMove Automation Software Kernel ■ VMIO-Server/SECS/GEM ■ dllee's blog ■ dllee's StatPlus ■
------
嘿~大家好 |
iiskiki
一般會員 發表:8 回覆:10 積分:3 註冊:2007-10-03 發送簡訊給我 |
不好意思~
我不太明白您的意思... new ?? 我有把我要new的視窗 移到 Available forms 以下是我主視窗要new的程式部份 [code cpp] Tclient1 *client1; client1 = new Tclient1(Application); client1->Show(); Tclient2 *client2; client2 = new Tclient2(Application); client2->Show();[/code] 在client1跟client2的OnClose中也分別都有做釋放的動作 [code cpp] void __fastcall Tclient1::FormClose(TObject *Sender, TCloseAction &Action) { Action = caFree; }[/code] 但我不明白程式執行到(兩個視窗程式都有用到timer元件來傳遞訊息) [code cpp] board1->Canvas->Brush->Color=clBlack; board1->Canvas->Ellipse(temp1,temp2,temp1 33,temp2 33); client2->Timer1->Enabled=true; //執行到這就會跳出警告視窗 look->Timer1->Enabled=true; form_enable=0;[/code] 這到底是怎麼一回事呢?? ===================引 用 dllee 文 章=================== 書我是沒看過,不過動態視窗與任何元件應該沒有關係。 重點是您使用視窗前是否正確 new 出它後再使用它, 最常發生的問題就是沒 new 就用,自然是發生 Exception。 ■ VMASK - ViewMove Automation Software Kernel ■ VMIO-Server/SECS/GEM ■ dllee's blog ■ dllee's StatPlus ■
------
嘿~大家好 |
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
我猜想,如果您在
client2->Timer1->Enabled=true; 這一行設中斷點,您會發現,client2 是 NULL 如果我猜對的話,我再告訴你可能的狀況 ■ VMASK - ViewMove Automation Software Kernel ■ VMIO-Server/SECS/GEM ■ dllee's blog ■ dllee's StatPlus ■
------
http://www.ViewMove.com |
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
當client2所指向的Form關閉並釋放掉佔用的記憶體時,
你的物件指標client2並無法得知, 所以client2內含的位址 是指向一塊被釋放的記憶體.... 參考一下這一篇 http://delphi.ktop.com.tw/board.php?cid=168&fid=914&tid=91166#2 |
iiskiki
一般會員 發表:8 回覆:10 積分:3 註冊:2007-10-03 發送簡訊給我 |
恩!!結果真的...client2=NULL
這是怎麼一回事? ===================引 用 dllee 文 章=================== 我猜想,如果您在 client2->Timer1->Enabled=true; 這一行設中斷點,您會發現,client2 是 NULL 如果我猜對的話,我再告訴你可能的狀況 ■ VMASK - ViewMove Automation Software Kernel ■ VMIO-Server/SECS/GEM ■ dllee's blog ■ dllee's StatPlus ■
------
嘿~大家好 |
iiskiki
一般會員 發表:8 回覆:10 積分:3 註冊:2007-10-03 發送簡訊給我 |
client2跟client1是同時開啟的
並沒有關閉 所以不致於釋放記憶體吧?! ===================引 用 jow 文 章=================== 當client2所指向的Form關閉並釋放掉佔用的記憶體時, 你的物件指標client2並無法得知, 所以client2內含的位址 是指向一塊被釋放的記憶體.... 參考一下這一篇 http://delphi.ktop.com.tw/board.php?cid=168&fid=914&tid=91166#2
------
嘿~大家好 |
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
dllee版大說的是尚未Create前物件的錯誤引用,
我要說的是當你動態產生的Form在Close時設定 成caFree, 可是你原先用來指向該Form的變數 (client1,client2), 並不會知道該Form已經Free掉了! ................ ===================引 用 iiskiki 文 章=================== client2跟client1是同時開啟的 並沒有關閉 所以不致於釋放記憶體吧?! ===================引 用 jow 文 章=================== 當client2所指向的Form關閉並釋放掉佔用的記憶體時, 你的物件指標client2並無法得知, 所以client2內含的位址 是指向一塊被釋放的記憶體.... 參考一下這一篇 http://delphi.ktop.com.tw/board.php?cid=168&fid=914&tid=91166#2
編輯記錄
jow 重新編輯於 2007-11-16 11:10:52, 註解 無‧
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
哈哈... 我猜對了
因為您沒有提供完整的原始碼,不過您應該也是以 block 的方式貼上來,沒有特別整理。 由第一個 Block 我猜想您的 code 是這樣的: [code cpp] { // ... Tclient1 *client1; client1 = new Tclient1(Application); client1->Show(); Tclient2 *client2; client2 = new Tclient2(Application); client2->Show(); // ... } [/code] 這樣看得出問題了吧 jow 因為我以前也犯過... 哈哈... client1/2 是 new 出來了,不過,client1/2 的指標只在這個 block 內是可用的。 而您在 Timer 內使用 client1/2 可以 compile 過,想必 client1/2 是整體的變數或是 Form 內的變數, 但您的程式並沒有 new 過它,它自然是 NULL。 改成這樣,才能真正 new 出您的要 client1/2 [code cpp] // Tclient1 *client1; client1 = new Tclient1(Application); client1->Show(); // Tclient2 *client2; client2 = new Tclient2(Application); client2->Show(); [/code] 問題就解決囉 ===================引 用 iiskiki 文 章=================== 恩!!結果真的...client2=NULL 這是怎麼一回事? ===================引 用 dllee 文 章=================== 我猜想,如果您在 client2->Timer1->Enabled=true; 這一行設中斷點,您會發現,client2 是 NULL 如果我猜對的話,我再告訴你可能的狀況 ■ VMASK - ViewMove Automation Software Kernel ■ VMIO-Server/SECS/GEM ■ dllee's blog ■ dllee's StatPlus ■
------
http://www.ViewMove.com |
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
我也有不少痛苦的經驗喔
===================引 用 dllee 文 章=================== 哈哈... 我猜對了 因為您沒有提供完整的原始碼,不過您應該也是以 block 的方式貼上來,沒有特別整理。 由第一個 Block 我猜想您的 code 是這樣的: (略) 這樣看得出問題了吧 jow 因為我以前也犯過... 哈哈... ■ VMASK - ViewMove Automation Software Kernel ■ VMIO-Server/SECS/GEM ■ dllee's blog ■ dllee's StatPlus ■
編輯記錄
jow 重新編輯於 2007-11-16 11:57:47, 註解 無‧
|
iiskiki
一般會員 發表:8 回覆:10 積分:3 註冊:2007-10-03 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |