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

動態產生視窗產生的問題

答題得分者是:dllee
iiskiki
一般會員


發表:8
回覆:10
積分:3
註冊:2007-10-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-11-14 22:49:53 IP:140.131.xxx.xxx 訂閱
最近我設計了一個程式
想要套用"C Builder6完全攻略"這本書的14章"動態產生視窗"
但當我照著書中的方法完成動態產生視窗執行時
當成是一執行道Timer這行程式時
就會跳出錯誤的視窗
(為套用前!程式是正常的)

難道是說使用動態產生視窗
就不能使用Timer這個元件嗎??(不會吧....)

------
嘿~大家好
編輯記錄
taishyang 重新編輯於 2007-11-15 14:05:14, 註解 無‧
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-11-15 08:11:27 IP:220.134.xxx.xxx 訂閱
書我是沒看過,不過動態視窗與任何元件應該沒有關係。
重點是您使用視窗前是否正確 new 出它後再使用它,
最常發生的問題就是沒 new 就用,自然是發生 Exception。


VMASK - ViewMove Automation Software KernelVMIO-Server/SECS/GEMdllee's blogdllee's StatPlus
------
http://www.ViewMove.com
iiskiki
一般會員


發表:8
回覆:10
積分:3
註冊:2007-10-03

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-11-15 13:17:42 IP:140.131.xxx.xxx 訂閱
不好意思~
我不太明白您的意思...
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 KernelVMIO-Server/SECS/GEMdllee's blogdllee's StatPlus
------
嘿~大家好
iiskiki
一般會員


發表:8
回覆:10
積分:3
註冊:2007-10-03

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-11-15 13:19:36 IP:140.131.xxx.xxx 訂閱
不好意思~
我不太明白您的意思...
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 KernelVMIO-Server/SECS/GEMdllee's blogdllee's StatPlus
------
嘿~大家好
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-11-15 18:45:12 IP:59.105.xxx.xxx 訂閱
我猜想,如果您在 
client2->Timer1->Enabled=true;
這一行設中斷點,您會發現,client2 是 NULL
如果我猜
對的話,我再告訴你可能的狀況



VMASK - ViewMove Automation Software KernelVMIO-Server/SECS/GEMdllee's blogdllee's StatPlus
------
http://www.ViewMove.com
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-11-15 19:23:57 IP:123.193.xxx.xxx 訂閱
當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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-11-15 22:25:44 IP:140.131.xxx.xxx 訂閱
恩!!結果真的...client2=NULL
這是怎麼一回事?

===================引 用 dllee 文 章===================
我猜想,如果您在
client2->Timer1->Enabled=true;
這一行設中斷點,您會發現,client2 是 NULL
如果我猜
對的話,我再告訴你可能的狀況



VMASK - ViewMove Automation Software KernelVMIO-Server/SECS/GEMdllee's blogdllee's StatPlus
------
嘿~大家好
iiskiki
一般會員


發表:8
回覆:10
積分:3
註冊:2007-10-03

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-11-15 22:28:17 IP:140.131.xxx.xxx 訂閱
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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-11-16 11:09:34 IP:210.66.xxx.xxx 訂閱
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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-11-16 11:27:27 IP:220.134.xxx.xxx 訂閱
哈哈... 我猜對了 

因為您沒有提供完整的原始碼,不過您應該也是以 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 KernelVMIO-Server/SECS/GEMdllee's blogdllee's StatPlus
------
http://www.ViewMove.com
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#11 引用回覆 回覆 發表時間:2007-11-16 11:38:11 IP:210.66.xxx.xxx 訂閱
我也有不少痛苦的經驗喔
===================引 用 dllee 文 章===================
哈哈... 我猜對了

因為您沒有提供完整的原始碼,不過您應該也是以 block 的方式貼上來,沒有特別整理。
由第一個 Block 我猜想您的 code 是這樣的:
(略)
這樣看得出問題了吧 jow 因為我以前也犯過... 哈哈...



VMASK - ViewMove Automation Software KernelVMIO-Server/SECS/GEMdllee's blogdllee's StatPlus
編輯記錄
jow 重新編輯於 2007-11-16 11:57:47, 註解 無‧
iiskiki
一般會員


發表:8
回覆:10
積分:3
註冊:2007-10-03

發送簡訊給我
#12 引用回覆 回覆 發表時間:2007-11-16 16:04:06 IP:140.131.xxx.xxx 訂閱
原來錯再我多加入的*Tclient2 *client2

謝謝各位的幫忙~~
------
嘿~大家好
系統時間:2024-04-27 2:20:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!