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

動態產生的視窗

答題得分者是:Zard
myelf
一般會員


發表:22
回覆:11
積分:6
註冊:2004-12-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-01-08 01:23:23 IP:163.28.xxx.xxx 未訂閱
1) 請問動態產生出來的視窗我依舊要去做delete的動作嗎? 例如 TForm *temp = new TForm(this); temp->Show(); 那我之後是否還要去執行delete temp的動作 ? 2) 為了節省資源,我可以給每次產生出來的動態視窗一個屬於自己的ID 若該動態視窗沒被關閉的話就重複利用這樣子嗎? 謝謝
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-01-08 02:09:59 IP:61.62.xxx.xxx 未訂閱
1) 請問動態產生出來的視窗我依舊要去做delete的動作嗎? 例如 TForm *temp = new TForm(this); temp->Show();    那我之後是否還要去執行delete temp的動作 ? 是的. 基本上任何程式動態產生的資源都需自行做釋放. 2) 為了節省資源,我可以給每次產生出來的動態視窗一個屬於自己的ID 若該動態視窗沒被關閉的話就重複利用這樣子嗎? 其實動態產生的Form在被delete釋放前都可以重複使用, 例如:
Form2在Form1的OnCreate動態產生, 按下Form1的Button會顯示出來, 如果Form2被關閉, 仍可再按Button1顯示之.
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  Form2 = new TForm2(this);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Form2->Show();
}
//---------------------------------------------------------------------------
myelf
一般會員


發表:22
回覆:11
積分:6
註冊:2004-12-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-01-08 02:14:27 IP:163.28.xxx.xxx 未訂閱
引言: 1) 請問動態產生出來的視窗我依舊要去做delete的動作嗎? 例如 TForm *temp = new TForm(this); temp->Show(); 那我之後是否還要去執行delete temp的動作 ? 是的. 基本上任何程式動態產生的資源都需自行做釋放.
再次請教,那我該在哪裡做釋放的動作呢?Form2 Destroy的時候嗎? 還是說我new完後直接delete? (我想應該要在它關閉的時候釋放,但卻不知道程式碼該加在哪裡比較正確..)
引言: 2) 為了節省資源,我可以給每次產生出來的動態視窗一個屬於自己的ID 若該動態視窗沒被關閉的話就重複利用這樣子嗎? 其實動態產生的Form在被delete釋放前都可以重複使用, 例如:
Form2在Form1的OnCreate動態產生, 按下Form1的Button會顯示出來, 如果Form2被關閉, 仍可再按Button1顯示之.
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  Form2 = new TForm2(this);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Form2->Show();
}
//---------------------------------------------------------------------------
有辦法識別之前new出來的嗎? 如果我new了十個視窗,該怎麼區別這10個呢? 感謝
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-01-08 02:26:46 IP:61.62.xxx.xxx 未訂閱
再次請教,那我該在哪裡做釋放的動作呢?Form2 Destroy的時候嗎? 還是說我new完後直接delete? (我想應該要在它關閉的時候釋放,但卻不知道程式碼該加在哪裡比較正確..) 對於這種問題, 只要把持一個原則, 由誰分配就由誰釋放, 這樣做比較不容易出錯, 例如我上面給你的例子, Form2是由Form1在Form1 Create產生, 你就可以把釋放Form2的動作放到Form1的OnDestroy. 有辦法識別之前new出來的嗎? 如果我new了十個視窗,該怎麼區別這10個呢? 可視的VCL都有一個Tag屬性可以利用, 你可以在動態產生時為每一個Form給予一個特別的數字, 用這個數字來區分Form, 你可以參考這篇 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=58921
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-01-08 03:28:17 IP:211.76.xxx.xxx 未訂閱
1) 釋放動態配置的物件應該避免在OnDestroy裡面釋放。最好是在Class的Destructor裡釋放。(同理Creates物件最好放在Constructor)。 這是Delphi和BCB的不同點,理由可以參考borland的TeamB guide。 http://www.bcbdev.com/articles/suggest.htm#oncreate 另外如果動態配置的物件是VCL的Component, 第一個參數是傳入Owner(如例子中的this指標) 這時如果Owner被釋放時,程式也一定會把他的Child釋放。 因此以這個例子來看,不必寫delete的code,動態配置出來的 Form也會他的Onwer釋放。 如果不放心的話,可以在動態配置出來的Form的Destructor裡下一個 debug的breakpoint,關閉後就可以確定有釋放了。 發表人 - pwipwi 於 2005/01/08 03:29:56
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-01-08 10:34:36 IP:61.64.xxx.xxx 未訂閱
引言: 1) 釋放動態配置的物件應該避免在OnDestroy裡面釋放。最好是在Class的Destructor裡釋放。(同理Creates物件最好放在Constructor)。 這是Delphi和BCB的不同點,理由可以參考borland的TeamB guide。 http://www.bcbdev.com/articles/suggest.htm#oncreate 另外如果動態配置的物件是VCL的Component, 第一個參數是傳入Owner(如例子中的this指標) 這時如果Owner被釋放時,程式也一定會把他的Child釋放。 因此以這個例子來看,不必寫delete的code,動態配置出來的 Form也會他的Onwer釋放。 如果不放心的話,可以在動態配置出來的Form的Destructor裡下一個 debug的breakpoint,關閉後就可以確定有釋放了。 發表人 - pwipwi 於 2005/01/08 03:29:56
嗯, pwipwi大大說的沒錯. 我又忘了我是在BCB版了 發表人 -
系統時間:2024-06-30 14:52:10
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!