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的無意錯誤引用