博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
from close /destory
阅读量:5283 次
发布时间:2019-06-14

本文共 2541 字,大约阅读时间需要 8 分钟。

orm.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的无意错误引用。

 

转载于:https://www.cnblogs.com/moonwind/p/4487458.html

你可能感兴趣的文章
161017、SQL必备知识点
查看>>
kill新号专题
查看>>
MVC学习系列——Model验证扩展
查看>>
HDU 4122
查看>>
Suite3.4.7和Keil u3自带fx2.h、fx2regs.h文件的异同
查看>>
打飞机游戏【来源于Crossin的编程教室 http://chuansong.me/account/crossincode 】
查看>>
[LeetCode] Merge Intervals
查看>>
Linux编程简介——gcc
查看>>
2019年春季学期第四周作业
查看>>
rotate the clock
查看>>
Python并发编程04/多线程
查看>>
CF461B Appleman and Tree
查看>>
CF1215E Marbles
查看>>
BZOJ2339 HNOI2011卡农(动态规划+组合数学)
查看>>
octave基本操作
查看>>
axure学习点
查看>>
WPF文本框只允许输入数字[转]
查看>>
dom4j 通用解析器,解析成List<Map<String,Object>>
查看>>
第一个项目--用bootstrap实现美工设计的首页
查看>>
使用XML传递数据
查看>>