TForm类
显示给用户的窗体有两种:有模式和无模式的。具体使用哪一种窗体,取决于是否希望用户能够同时与这个窗体和其他窗体交互。
1.当打开一个模式窗体后,用户无法与应用程序的其他部分交互,知道用户关闭了这个窗体。模式窗体通常是对话框,就好像delphi本身的对话框应用。事实上,大多数情况下应当使用模式窗体。要显示一个模式窗体,只要调用ShowModal()就可以了。
下面的代码演示了怎样创建TmodalForm的实例,并把它作为模式窗体打开:
Begin
//创建TModalForm的实例
ModalForm:=TModalForm.Create(Application);
try
if ModalForm.ShowModal=mrOk then //显示这个窗体
{do something}; //执行一些代码
finally
ModalForm.Free; //释放窗体的实例
ModalForm:=nil; //把窗体变量设为nil
end;
end;
上面的代码演示了怎样动态创建TModalForm的实例以及把实例赋值给ModalForm变量。
注意:如果需要动态创建一个窗体的实例,就要把这个窗体从Project Options对话框的Auto-Create框中去掉。如果窗体的实例已经存在,可以调用ShowModal()函数打开它,其他代码可以删掉,变成下面这样:
begin
if ModalForm.ShowModal=mrOk then //如果ModalForm已经存在
{do something};
end;
ShowModal()函数的返回值是ModalForm的ModalResult属性值。缺省情况下,ModalResult属性的值为0,相当于预定义的常量mrNone.如果ModalResult属性被赋值为其他非零值,则窗体将关闭。
可以在运行时对窗体的ModalResult进行赋值:
begin
ModalForm.ModalResult:=100; //Assigning a value to ModalResult 使窗体关闭
end;
预定义的Modal Result值。
| 常量 | 值 |
| mrNone | 0 |
| mrOk | idOk |
| mrCancel | idCancel |
| mrAbort | idAbort |
| mrRetry | idRetry |
| mrIgnore | idIgnore |
| mrYes | idYes |
| mrNo | idNo |
| mrAll | mrNo+1 |
2.打开无模式窗体
要打开一个无模式窗体,可以调用Show()。
Begin
//检查无模式窗体的实例是否已经存在,防止一个窗体的多个实例的存在。
if not Assigned(Modeless) then
Modeless :=TModeless.Create(Application);//创建窗体
Modeless.Show //显示无模式窗体
end;
要特别注意窗体的实例:当通过窗体的系统菜单或者窗体上的Close按钮关闭这个窗体时,窗体并没有真正从内存中释放。它仍然还在内存中,出发关闭了主窗体(即应用程序)。如果希望用户关闭了窗体就在内存中释放它,必须处理它的onclose事件,并且把Action参数设为caFree,这样,VCL就会在这个窗体关闭时释放它。
procedure TModeless.FormClose(Sender:object;
var Action:TCloseAction);
begin
action:=caFree; //当关闭时,释放窗体实例
end;
上述代码解决了窗体实例在内存释放的问题。不过,还有一个问题,注意下面这行代码:
if not Assigned(Modeless)then begin
这行代码检查TModeless 的实例是否已经由Modeless变量引用,这实际上就是检查Modeless是否为nil.尽管第一次进入例程的时候,Modeless可能是nil,但第二次进入这个例程的时候,它已经不是nil,这是因为VCL并没有把Modeless变量设为nil.因此,必须手工把这个变量设成nil。
与模式窗体不同的是,无法在代码中判断无模式窗体什么时候将删除。因为,无法在创建窗体实例的例程中删除窗体的实例。用户有可能在应用程序郑州运行的任何时候关闭无模式窗体。因此,无模式窗体本身一定要把Modeless变量设为nil,而且最好在处理窗体的NoDestroy事件的处理过程中设置这个变量:
procedure TModeless.FormDestroy(Sender:TObject);
begin
Modeless:=nil;//把Modeless变量设为nil
end;
这样就能保证每次关闭窗体时,Modeless变量总是被设为nil,从而防止Assigned()函数失败,记住,同一时刻只能创建TModeless的一个实例。
注意 对于无模式窗体来说,要避免出现下列有缺陷的代码:
begin
Form1:=TForm1.Create(Application);
Form1.show;
end;
上述代码会导致每次都创建窗体的实例,重复了被Form1引用的以前的实例,从而消耗了大量的内存。尽管通过Screen.Forms可以访问这些实例,但最好还是尽量避免使用上述代码。向构造器Create()传递nil造成无法在Form1实例变量被覆盖后,无法再引用这个窗体实例指针。
TForm类的更多相关文章
- TForm类有关属性简介
http://www.cnblogs.com/pchmonster/archive/2012/01/02/2310377.html
- Java类的继承与多态特性-入门笔记
相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...
- 【温故Delphi】之VCL消息机制小结
TObject消息分派 procedure Dispatch(var Message); virtual; #负责分派消息到特定VCL组件的事件处理函数 procedure DefaultHandle ...
- Delphi 的知识体系
第一部分 快速开发的基础 第1章 Delphi 5下的Windows编程 1 1.1 Delphi产品家族 1 1.2 Delphi是什么 3 1.2.1 可视化开 ...
- 一个简单的MDI示范程序(Delphi)
http://www.cnblogs.com/pchmonster/archive/2012/01/07/2316012.html 最为一个巩固之前有关窗体和对象的有关知识,下面就建立一个简单的MDI ...
- Delphi OO
深入Delphi编程(OOP) 日期:2007年11月9日 作者:左轻侯 人气: 2595 查看:[大字体 中字体 小字体] 刚刚接触的Delphi的朋友,可能最感兴趣的就是它丰富.强大的VCL(可视 ...
- Delphi下的RTTI函数大全
http://ljz9425.blog.163.com/blog/static/369148572008111635253858/ Delphi下的RTTI(下) 2008-12-16 15:52:5 ...
- 应用程序的关闭退出(在FMX中,Activity替代了Form的概念)
在VCL中,关闭程序的主窗体也就意味着程序的主循环结束,主程序自然而然结束.所以在主窗体中使用窗体的关闭函数(Close)即可,如下: procedure TfrmMain.btncloseClick ...
- Delphi 2007体验!
Delphi 2007体验! baidu 内容摘要:CodeGear(From Borland) 公司公布了最新的Delphi 2007 For Win32版本号.作为一个 Delphi 的使用者,第 ...
随机推荐
- css中margin重叠和一些相关概念(包含块containing block、块级格式化上下文BFC、不可替换元素 non-replaced element、匿名盒Anonymous boxes )
平时在工作中,总是有一些元素之间的边距与设定的边距好像不一致的情况,一直没明白为什么,最近仔细研究了一下,发现里面有学问:垂直元素之间的margin有有互相重叠的情况:新建一个BFC后,会阻止元素与外 ...
- html5中的postMessage解决跨域问题
解决跨域问题的方法有很多,如:图像ping(简单).jsonp(缺点是不能实现跨域post).CROS(CORS的本质让服务器通过新增响应头Access-Control-Allow-Origin,通过 ...
- JAVA基础--线程
sleep和wait的区别: 1. sleep是Thread的方法, wait是object的方法 2. sleep占着CPU睡觉, wait等待CPU,不占用CPU 线程是一个程序内部的顺序控制流 ...
- JAVA基础--异常
异常的分类: 1. Throwable: 根类 1) Error:系统错误, 由java虚拟机生成并抛出, 无法处理 2) Exception: 所有异常类的父类, 可以处理的错误, 可以catch到 ...
- BNU OJ 51005 BQG's Quadrilateral Bricks
#include<cstdio> #include<cstring> #include<cmath> #include<vector> #include ...
- [iOS Animation]-CALayer 图层性能
图层性能 要更快性能,也要做对正确的事情. ——Stephen R. Covey 在第14章『图像IO』讨论如何高效地载入和显示图像,通过视图来避免可能引起动画帧率下降的性能问题.在最后一章,我们将着 ...
- 歪国人DIY的MINI四轴
歪国人DIY的MINI四轴 Crazyflie 2.0 自己仿Crazyflie.CrazyPony
- LPC1768IAP(详解,有上位机)
之前说了stm32的iap编程,今天天气真好,顺手就来说说lpc1788的iap编程(没看前面的请查看stm笔记下的内容) 首先是flash的算法,lpc1768并没有寄存器来让我们操作flash,他 ...
- springMVC+Hibernate配置
本文描述下 sypro 项目中使用 springMVC+Hibernate配置,初学SpringMVC做下简单整理解. 1.web项目首先我们要使用 web.xml文件将 spring配置引入进来 & ...
- 总结分享十大iOS开发者最喜爱的库 分类: ios相关 app相关 2015-04-03 16:43 320人阅读 评论(0) 收藏
该10大iOS开发者最喜爱的库由"iOS辅导团队"成员Marcelo Fabri组织投票选举而得,参与者包括开发者团队,iOS辅导团队以及行业嘉宾.每个团队都要根据以下规则选出五个 ...