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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM