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的更多相关文章

  1. [转]Delphi Form的释放和隐藏:free,hide,close

    form.Free - 释放Form占用的所有资源.Free后,Form指针不能再使用,除非对Form重新赋值. form.Hide - 隐藏Form.可以调用form.Show再一次显示. form ...

  2. Delphi 窗体的释放和判断窗体是否存在

    常规释放和关闭: Form.Free   -   释放Form占用的所有资源.Free后,Form指针不能再使用,除非对Form重新赋值.   Form.Hide   -   隐藏Form.可以调用f ...

  3. Delphi窗体创建释放过程及单元文件小结(转)

    Delphi窗体创建释放过程及单元文件小结 Delphi中的窗体,有模式窗体与非模式窗体两种.两种窗体的调用方式不同,模式窗体使用ShowModal显示,非模式窗体使用Show显示.当显示模式窗体的时 ...

  4. uniGUI动态建立Form及释放

    uniGUI动态建立Form及释放 (2015-10-01 14:51:12) 转载▼   分类: uniGUI 用uniGUI开发的项目中,难免要遇到动态建立一个Form,再释放掉,与传统Delph ...

  5. delphi xe6 窗口 visible 不能隐藏 解决

    delphi xe6 窗口 visible 不能隐藏 解决 在工程代码里面加上 Application.ShowMainForm := false;

  6. Delphi Form显示在第二个显示器中的方法

    Delphi 中窗体Form显示在第二个显示器中的方法: 假定要显示在扩展的第二个显示器的Form的名称为frmFloat,则除了要设置该form的top.left.width.height为Scre ...

  7. 继承中的隐藏(hide)重写(Override)和多态(Polymorphism)

    继承中的隐藏:(不要使用隐藏,语法没有错误但是开发项目时会被视为错误) 在继承类中完全保留基类中的函数名 //基类,交通工具 class Vehicle { public void Run() { C ...

  8. Delphi Setlength 内存释放总结

    https://blog.csdn.net/lotusyangjun/article/details/8203521 一.在Setlength 被调用次数不多时,可直接使用以下代码进行释放var aa ...

  9. delphi Form属性设置 设置可实现窗体无最大化,并且不能拖大拖小

    以下设置可实现窗体无最大化,并且不能拖大拖小BorderIcon 设为---biMax[False] biHelp [False]BorderStyle 设为---bsSingle 参考------- ...

随机推荐

  1. Win7玩游戏偶尔自动跳转到桌面的解决办法[转]

    新装的win7旗舰版SP1,怎么玩wow (魔兽世界.极品飞车.全屏游戏.按键精灵.挂机)总是过一会就自己返回桌面了.刚开始以为是显卡的毛病,更新了驱动还是一样(在这之前,排除病毒,其他驱动问题).因 ...

  2. Yii2.0高级框架数据库增删改查的一些操作

    yii2.0框架是PHP开发的一个比较高效率的框架,集合了作者的大量心血,下面通过用户为例给大家详解yii2.0高级框架数据库增删改查的一些操作 --------------------------- ...

  3. java中使用session的一些细节

    获取session的时候会产出一个sessionid并且发给客户端,第二次回发的时候再根据该sessionid获取session.如果cookies被禁用,则需要通过URL传入. asp.net下的s ...

  4. [ActionScript 3.0] AS3 绘制星形

    package { import flash.display.Sprite; import flash.events.Event; /** * @author Frost.Yen * @E-mail ...

  5. docker错误

     错误:cannot enable tty mode on non tty input 错误产生: root@machine1:/data# echo test|docker exec -i 68 ...

  6. Sqoop增量从MySQL中向hive导入数据

    sqoop job --create incretest -- import --connect jdbc:mysql://10.8.2.19:3306/db --table table1 --use ...

  7. Hadoop 2.6.0动态添加节点

    文章出自:http://my.oschina.net/leoleong/blog/477508 本文主要从基础准备,添加DataNode和添加NodeManager三个部分详细说明在Hadoop2.6 ...

  8. VS打包资源文件,转自推酷,请小星同学查看

    上篇博客把收费系统的总体设计进行了一遍讲解,讲解的同时掺杂了些有关.NET编译机制的总结.程序编写测试完成后接下来我们要做的是打包部署程序,但VS2012让人心痛的是没有了打包工具.不知道出于什么原因 ...

  9. 【LOB】使用USER_LOBS视图获得当前用户包含LOB字段的表

    包含LOB类型字段的表往往需要特殊关照,如何快速的获得包含LOB对象的数据库表?使用DBA_LOBS.ALL_LOBS和USER_LOBS视图可以很方便地获得包含BLOB或CLOB字段的表. 简单看一 ...

  10. GroupId和ArtifactId

    <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --><dependency> ...