Create,CreateForm有何微細分别? |
尚未結案
|
chkkevin
一般會員 發表:34 回覆:64 積分:19 註冊:2007-05-17 發送簡訊給我 |
不好意思問一下一點基本的問題:~
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 發送簡訊給我 |
剛開始學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 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
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 發送簡訊給我 |
>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 發送簡訊給我 |
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; 之後,就會發生,違規存取,因為物件(記憶體空間)已釋放 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |