Delphi中的窗体创建与销毁
Delphi中的窗体,有模式窗体与非模式窗体两种。两种窗体的调用方式不同,模式窗体使用ShowModal显示,非模式窗体使用Show显示。当显示模式窗体的时候你是不能操作本程序的其他窗体的,你不能把焦点从模式窗体转到其他窗体上。而非模式窗体则没有这种限制,你可以从一个非模式窗体切换到另外一个非模式窗体上。两种窗体的区别仅仅在调用的方式上有区别。
窗体的创建:
当使用Delphi的IDE New一个窗体后,在Project1.dpr文件中,会出现一句
1
|
Application . CreateForm(TForm2, Form2); |
意思是当程序启动的时候会创建TForm2类的Form2实例,也就是窗体2。这一过程是自动的,不管你是否调用显示Form2,
Form2已经存在了,其OnCreate事件也已经触发了。这时候,如果你想显示Form2,那么可以显式调用Form2的Show或ShowModal方法,以非模式或模式显示窗体。
如果你不想随程序启动而创建窗体,而是动态的创建窗体,那么,你可以删除上面的那句代码,然后在程序中你想动态创建窗体的地方加上以下代码:
1
2
|
//需要在头部引用TForm2所在的单元文件,并声明Form2变量。 Application . CreateForm(TForm2, Form2); |
或者使用
1
2
|
//和上面一样,需要引用并声明。注意,一定不要直接这样写Form2.Create Form2 := TForm2 . Create(Application); |
两者没有特别大的区别,一般情况下是通用的。两者的主要区别在于,触发OnCreate事件的时候,第一种方法Form2变量已经指向了新生成的实例,外部代码可以直接调用Form2这个变量了,而第二种方法先调用TForm2的Create方法,再给Form2这个变量赋值,在OnCreate时Form2变量还是未定义的。这点区别比较小,基本上不会遇到,但是如果不明白其中的道理,又遇到这个问题的话会浪费你很多时间来调试的。
窗体销毁:
有创建,就必须有销毁,不然的话会产生内存泄漏。
当我们调用Form的Close或者点击窗体右上角的X时,窗体真的已经释放了么?答案是否定的,如果你想验证的话……你可以去看源码。对于程序自动生成的窗体,在程序结束的时候会自己释放,对于这种窗体,我不建议进行手动释放,除非你确定释放后绝对不会再用到这个窗体了,不然就会产生内存访问错误。
对于动态生成的窗体,一旦不再使用,一定要手动释放资源,不然你会看到程序占有内存疯狂上涨,然后就被任务管理器干掉了~手动释放主要有两种方式,第一种是显示调用Form.Free这个方法。对于上面用的例子Form2来说:
1
2
|
Form2 . Free; Form2 := nil ; |
至于为什么要将变量Form2赋值为nil,是为了防止此后的代码通过Form2变量访问已经被释放的TForm2实例。
另一种方法是在窗体的OnClose事件中将变量Action设置为caFree。
1
2
3
4
5
|
procedure TForm2 . FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caFree; // TCloseAction = (caNone, caHide, caFree, caMinimize); Form2 := nil ; end ; |
这两种方法没有什么本质区别,可以根据实际情况来使用,但是一定不要忘记在释放资源后将变量指向空,不然很容易出现非法访问的情况。实际上在TForm2的FormClose中写Form2 := nil 是无用的,应该写在创建Form2的单元中,因为这两个Form2变量是不同的,TForm2所在单元的Form2变量是一个私有变量,别人是访问不到的,别人可以访问到的,也就是可能触发非法访问的是在TForm2所在单元外的Form2变量(有点绕口令了,不知道大家看懂没有……)。
Delphi中的窗体创建与销毁的更多相关文章
- 有谁知道Delphi中"窗口"的创建过程?
求助:有谁知道Delphi中窗口的创建过程,此“窗口”不仅仅指 TForm 类型, 还包括一般的窗口控件,如TButton,TEdit等等,希望有能够十分详细的运作 过程,比如说CreatPara ...
- Delphi中DLL的创建和使用(转)
Delphi中DLL的创建和使用 1.DLL简介: 2.调用DLL: 3.创建DLL: 4.两个技巧: 5.初始化: 6.例外处理. 1.DLL简介 ...
- Delphi中DLL的创建和使用
参考:http://blog.csdn.net/ninetowns2008/article/details/6311663 结合这篇博客:http://www.cnblogs.com/xumenger ...
- 在Delphi中如何动态创建dbf数据库(二)?
unit Form_ToChangCSVforDBFU; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics ...
- 在Delphi中如何动态创建dbf数据库(一)?
table2.Close; table2.Active:=false; table2.Exclusive:=true; table2.TableName:='h:\gzkd\sds'; table2. ...
- Delphi窗体创建释放过程及单元文件小结(转)
Delphi窗体创建释放过程及单元文件小结 Delphi中的窗体,有模式窗体与非模式窗体两种.两种窗体的调用方式不同,模式窗体使用ShowModal显示,非模式窗体使用Show显示.当显示模式窗体的时 ...
- 在Delphi中创建线程,请一定使用BeginThread()代替CreateThread()创建线程!(更好的管理异常)
在Delphi中创建线程,请一定使用BeginThread()代替CreateThread()创建线程! 如果直接使用Win32的API函数CreateThread()创建多个线程,也是可以创建的.但 ...
- Delphi中关于菜单的几个技巧
-- 1将菜单项移到菜单栏的最右边 在一些应用程序中,常把一些特殊的菜单项放在菜单栏的最右边(如WPS2000 中的"定制界面"菜单,一些应用程序的帮助菜单),这些菜单项放在菜单栏 ...
- Delphi MDI 子窗体的创建和销毁 [zhuan]
1.如果要创建一个mdi child,先看是否有这个child 存在,如果有,则用它,如果没有再创建 //该函数判断MDI 子窗体是否存在,再进行创建和显示function isInclude(for ...
随机推荐
- 把一个 int 数字 n 格式化成16进制的字符串(前面补零成0位)
例如,输入n=10,要求输出 0x0000000A; C++: sprintf( buffer, "0x%08X", n); C#: string s = string.F ...
- TIdTCPClient 详解
转发地址:http://blog.csdn.net/cowcga/article/details/6198382 关于TIdTCPClient的几种方法 收藏 其实Indy比较简单,但是可以提供的方法 ...
- ms10_046_shortcut_icon_dllloader漏洞利用和ettercap dns欺骗
ms10_046_shortcut_icon_dllloader漏洞利用过程 msf > use exploit/windows/browser/ms10_046_shortcut_icon_d ...
- POJ 2296 Map Labeler
二分答案 + 2-SAT验证,判断正方形是否相交写起来有点烦,思路还是挺简单的. #include<cstdio> #include<cstring> #include< ...
- mysql----快速删除数据表(drop,truncate.delete)
概念: 三者均可删除数据表 TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行.但 TRUNCATE TABLE 比 DELETE 速度快 ...
- NSMutableDictionary
NSDictionary *dic = @{@"name":@"yj", @"age":@"24", @"ho ...
- (六)Jquery Mobile主题及插件的使用
二.自定义主题 根据js自带的主题,提取出来进行更改 来自为知笔记(Wiz)
- CodeForces 598E Chocolate Bar
区间DP预处理. dp[i][j][k]表示大小为i*j的巧克力块,切出k块的最小代价. #include<cstdio> #include<cstring> #include ...
- express4.x中路由中间件和挂载路径的关系
express4.x 中一个路由中间件可以挂载到多个路由上,一个路由也可以绑定多个路由中间件,如: //多个路由匹配一个路由中间件 app.use(['/gre+t', '/hel{2}o'], gr ...
- CentOS 7 安装配置 NFS
CentOS 7 安装配置 NFS 环境 nps 192.168.1.97 client 192.168.1.98 一.yum 安装 yum -y install nfs-utils rpcbind ...