TForm类

本文介绍了Delphi中两种窗体类型:模式窗体和无模式窗体的区别及使用方法。模式窗体阻止用户与其他窗体交互,直到关闭;而无模式窗体允许用户自由切换。文章还详细说明了如何通过代码创建这两种窗体并处理它们的生命周期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

显示给用户的窗体有两种:有模式和无模式的。具体使用哪一种窗体,取决于是否希望用户能够同时与这个窗体和其他窗体交互。

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值。

常量
mrNone0
mrOkidOk
mrCancelidCancel
mrAbortidAbort
mrRetryidRetry
mrIgnoreidIgnore
mrYesidYes
mrNoidNo
mrAllmrNo+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实例变量被覆盖后,无法再引用这个窗体实例指针。

 

转载于:https://www.cnblogs.com/chuangyiyuan/p/4905196.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值