[轉]Delphi Form的釋放和隱藏:free,hide,close

來源:互聯網
上載者:User

標籤:

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.