zoukankan      html  css  js  c++  java
  • 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的无意错误引用

  • 相关阅读:
    BZOJ5212 ZJOI2018历史(LCT)
    BZOJ5127 数据校验
    253. Meeting Rooms II
    311. Sparse Matrix Multiplication
    254. Factor Combinations
    250. Count Univalue Subtrees
    259. 3Sum Smaller
    156. Binary Tree Upside Down
    360. Sort Transformed Array
    348. Design Tic-Tac-Toe
  • 原文地址:https://www.cnblogs.com/China3S/p/3286016.html
Copyright © 2011-2022 走看看