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

最新文章

  1. javaweb优化
  2. java-集合2
  3. lua UT测试工具
  4. Django配置与静态文件
  5. 鸟哥笔记:postfix的一些重要配置文件
  6. java重构、重载、重写
  7. aggregation(2):adaptive Boosting (AdaBoost)
  8. [Node.js] Use "prestart" in scripts
  9. 曲演杂坛--SQLCMD下执行命令失败但没有任何错误提示的坑
  10. jquery toggle 替换的实现
  11. MongoDB--架构搭建(主从、副本集)之副本集
  12. Ubuntu下使用网易云音乐
  13. 利用纯粹的CSS3替代小图标---向右箭头
  14. k8s教程
  15. org.hibernate.InvalidMappingException: Could not parse mapping document from resource com/domain/book.hbm.xml 联网跑一跑
  16. 前端视频插件Aliplayer播放器简单使用(基于地址播放)
  17. PHP实用系统函数之数组篇
  18. Embarcadero RAD Studio 2016 Product Approach and Roadmap
  19. day 26 网络知识 01
  20. pipline --学习 (-)

热门文章

  1. Linux 任务计划 crontab 配置概要与常见问题
  2. Pycharm+Python3+python工程打包成exe+在windows下自动定时运行
  3. Java NIO:IO与NIO的区别
  4. django 接受 ajax 传来的数组对象
  5. SpringBoot开发案例之整合Dubbo分布式服务
  6. Git 使用vi或vim命令打开、关闭、保存文件
  7. orleans发送广播消息
  8. DOM操作 JS事件 节点增删改查
  9. Spring集成Quarz开发环境搭建
  10. OSS网页上传和断点续传(终结篇)