標籤:
form.Free - 釋放Form佔用的所有資源。Free後,Form指標不能再使用,除非對Form重新賦值。 form.Hide - 隱藏Form。可以調用form.Show再一次顯示。 form.close - 關閉Form,實際的結果取決於OnCloseQuery和OnClose,如果OnCloseQuery的CanClose為False,不執行任何操作,如果為True,進一步考察OnClose的Action的值: caNone: 不執行任何操作 caHide: 隱藏視窗,同form.Hide caFree: 釋放Form佔用的資源,同form.Free caMinimize: Form最小化。 caFree最主要應用於MDI(多表單)中,因為子表單關閉時預設的動作是Hide,即隱藏,所以如果希望其釋放所佔用的資源時,就要設定關閉動作,也就是在OnClose事件中加一句Action:=caFree;而Application.Terminate是關閉整個應用程式。 Create是從繼承下來的方法,作用是給對象執行個體分配記憶體,文法為:Formname:=Tformname.Create(Application); //參數Application表示此表單的擁有者為Application。 Show是顯示已經建立的視窗。文法為: Formname.Show; 另外:Show是無模式顯示表單,ShowModal是模式顯示表單。建立form的順序: 1.formcreate 2.formactive 3.formshow implementation分割代碼的範圍。implementation防止外部參考單元涉及,任意單元如果訪問該單元,只能引用該單元的interface節,對於implementation內聲明但沒有在interface中聲明的函數或過程,其他引用該單元的單元都不能調用,同樣,implementation內聲明的變數,只能在該單元內被使用。FormDestroy 和 FormClose 區別和聯絡: (1).視窗的所有資源真正釋放時調用 FormDestroy。當你關閉視窗時,VCL會調用FormClose,如果你在FormClose裡寫Action = caFree,那麼VCL會繼續調用FormDestroy;如果你將Action的值賦為其它任何值,VCL不會真正釋放視窗資源(如果Action=caNone則什麼事都不做,視窗保持原狀),這時就不會調用 FormDestroy 。(2).看這個程式:將Form2改為available,然後在TForm2.FormClose 寫 action := caFree; 在TForm2.FormDestroy 寫 Form2 := nil;然後這樣使用Form2 if not Assigned(Form2) then Form2 := TForm2.Create(Self); Form2.Show;// Form2.ShowModal ; 第一種情況:在FormClose中調用Form1.Close,則會調用到TForm.OnClose,其中又調用到了FormClose,所以就死遞迴了。一死遞迴,當然就棧溢出(Stack Overflow)。 第二種情況:在FormClose調用Form1.Free,這樣會調用TForm.Destroy,TForm.Destroy會判斷自己是否與Application.MainForm相同,如果是,則會將Application.MainForm置為nil,TForm.Destroy然後觸發FormDestroy,在FormDestroy中Form1被置成了nil。FormClose是由TForm.Close調用的,本來在FormClose之後,比較它自己是否Application.MainForm,如果是,就調用Application.Terminate結束應用程式。但這時雖然Self還是非nil,它只是Close方法中的一個隱藏變數,而Application.MainForm已經為nil,所以即使MainForm已經不存在了,但應用程式還是存在,只是看不見它了。Application本身也是一個視窗,但它的大小為0。所以只能用別的辦法來關閉應用程式了(Ctrl+Alt+Del或在Delphi IDE中按Ctrl+F2)。 忠告: 盡量不要用Free方法來關閉表單,尤其是主表單,應該用Close方法。在FormCreate, FormShow, FormActivate, FormCloseQuery, FormClose, FormDestroy各事件中不要調用關閉、釋放或銷毀表單的方法。 不要在方法或事件中直接引用Form1這類全域執行個體變數,如果別人用下列方法建立表單,用Form1變數就沒有作用了: var myFormVar: TForm1; begin myFormVar := TForm1.Create(Application); myFormVar.Show; // 用myFormVar用一些事 myFormVar.Close; end; 因為這時候TForm1.FormClose中啟動並執行其實是myFormVar而不是Form1。 在FormDestroy中可以改成這樣: if Self=Form1 then Form1 := nil; 用這個方法來防止別的程式對Form1的無意錯誤引用
[轉]Delphi Form的釋放和隱藏:free,hide,close