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

Create,CreateForm有何微細分别?

尚未結案
chkkevin
一般會員


發表:34
回覆:64
積分:19
註冊:2007-05-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-09-10 11:01:15 IP:218.254.xxx.xxx 訂閱
不好意思問一下一點基本的問題:~

1.) procedure TMain.testform1Click(Sender: TObject);
var
testForm:TtestForm;
begin
testForm:=TtestForm.Create(application);
testForm.Show;
end;

1.) procedure TMain.testform1Click(Sender: TObject);
var
testForm:TtestForm;
begin
testForm:=TtestForm.Create(self);
testForm.Show;
end;

2.)procedure TMain.ActionList1Click(Sender: TObject);
begin
try
if testForm=nil then
begin
application.CreateForm(TtestForm,testForm);
testForm.Show;
end;
except
testForm.Free;
testForm:=nil;
end;
end;

三都method能夠動態造出Form,從外觀上沒有分别,但不知内部有否分野呢?
煩請解答,謝謝~
------
獨學無友則孤陋寡聞,相識滿天下能知天下事
小弟是來自香港的~~多多指教
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-09-10 12:39:54 IP:61.67.xxx.xxx 未訂閱
剛開始學Delphi時,我也曾提過這樣的疑問,但漸漸的不再去浪費時探尋這些過程,只要能完成專案才是最重要的,曾經ktop的前輩回答這是老外的用法上不同,不過在我的觀念認知上,就這個個案來說應該是一樣的,它的物件父子繼承關係都是TMain, 但如果你把第二個procedure TMain.testform1Click(Sender: TObject); 改為 procedure TForm1.testform1Click(Sender: TObject) 的話,那就有一點不同,就是這個procedure 是繼承TForm1來源,它的屬性是由TForm1跟下來的
其實類似這類的用語,還有
query1.open, query.active:= true
form1.close, form1.free, freeandnil(form1), form1.destory...
希望我描述的觀念是正確的,如果有錯還請大家指教,因為已經很久不再去探尋這類的觀念問題了
編輯記錄
P.D. 重新編輯於 2007-09-10 12:40:22, 註解 無‧
chkkevin
一般會員


發表:34
回覆:64
積分:19
註冊:2007-05-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-09-10 13:38:29 IP:218.254.xxx.xxx 訂閱
謝謝回答的想也是這個分别吧~

不過,提及form1.close, form1.free, freeandnil(form1), form1.destory...,就想知道他們有點分别:~
form1.close,又是不是等於form1.free呢?
form1.free可以拆構form1的reference 和instant
form1.close又沒有這種功能呢?


------
獨學無友則孤陋寡聞,相識滿天下能知天下事
小弟是來自香港的~~多多指教
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-09-10 13:40:52 IP:59.124.xxx.xxx 未訂閱
1. 1.) 與 2.) 的差別在於 testForm 的 Owner, 前者為 TApplication, 後者為 TMain

2.TApplication.CreateForm 與 TForm.Create 的主要區別在於
TApplication.CreateForm 會檢查傳入的參數是不是第一個由 CreateForm 所建立的 TForm 的後代
如果是的話, 它會將其設定會為 Application 的 MainForm

您可以檢視 delphi 的 help 或 vcl 的 source 中得知
danny
版主


發表:100
回覆:522
積分:595
註冊:2002-03-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-09-18 11:49:41 IP:203.79.xxx.xxx 訂閱
>form1.close,又是不是等於form1.free呢?
close 不等於 free
close 是將 Form 關閉, 但還在記憶體中, 但可以在 close method 中順便 free (必須指定 Action := caFree, 通常使用在 MDI), SDI 通常是誰 Create 就誰 Free
free 是將 Form 從記憶體中釋放掉, 但不會觸發 close method, 如果你必須執行 close method 的程序, 就必須先 close 再 free


procedure TCustomForm.Close;
var
CloseAction: TCloseAction;
begin
if fsModal in FFormState then
ModalResult := mrCancel
else
if CloseQuery then
begin
if FormStyle = fsMDIChild then
if biMinimize in BorderIcons then
CloseAction := caMinimize else
CloseAction := caNone
else
CloseAction := caHide;
DoClose(CloseAction);
if CloseAction <> caNone then
if Application.MainForm = Self then Application.Terminate
else if CloseAction = caHide then Hide
else if CloseAction = caMinimize then WindowState := wsMinimized
else Release;
end;
end;


===================引 用 chkkevin 文 章===================
謝謝回答的想也是這個分别吧~

不過,提及form1.close, form1.free, freeandnil(form1), form1.destory...,就想知道他們有點分别:~
form1.close,又是不是等於form1.free呢?
form1.free可以拆構form1的reference 和instant
form1.close又沒有這種功能呢?


------
將問題盡快結案也是一種禮貌!
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-09-22 02:30:56 IP:61.64.xxx.xxx 訂閱
TtestForm.Create(application); 指定其 Owner 為 application
TtestForm.Create(self); 指定其 Owner 為該範圍內的元件,該例為 TMain

application.CreateForm(TtestForm,testForm); 指的是,由 Application 來代為建立 Form,傳入欲建立的 From 的 Class(YYY) 與存放 From 的變數(XXX)
由 Application 來代為執行 XXX := YYY.Create(application); 並指定 Application 自己為 Owner

Close 會關閉 Form,同時呼叫事件 OnCLoseQuery ,此時物件並未釋放,如無指定 CloseAction 為 caFree (如 danny 所述) ,則進行 Hide 動作,若有就會使用釋放,要注意的是,若是Main Form 做Close,就一定會釋放,並結束程式(此時不需指定 caFree),參考 danny 所貼出之 Source

Free ,如果會呼叫 Destory,Destory 會呼叫 OnDestory (其實還會呼叫 BeforeDestruction,如果有的話),你可以想成 Free 會先檢查物件指標是否為 nil 後進行一連串的動作來釋放物件,在呼叫 Destory 的過程中,會有一些節點,也就是機會,讓你安插程式碼,做一些必要的動作,例如釋放你自己宣告的物件,記憶體空間,凡有藉要有還,所以 Free --> BeforeDestruction --> Destory start --> OnDestory --> Destory Continue --> Free Complieted

這也是為何設計 Destory 時 inherited Destroy; 要放最後面,一旦真的進入 Destory ,就無法回頭囉,才會在中間,設計一些機制,給你使用
若是將自己釋放程序改至 inherited Destroy; 之後,就會發生,違規存取,因為物件(記憶體空間)已釋放

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