模式窗体与非模式窗体

Posted jijm123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模式窗体与非模式窗体相关的知识,希望对你有一定的参考价值。

非模式窗体从创建到销毁都需要代码来维护,防止内存未安全释放。

模式窗体就比较省心一些,只需要在代码段的try…finally中创建并维护即可。

下面用例子来说明一下两类窗体如何调用:

 

主窗体程序:

unit Main;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,ModalForm,ModalessForm;
 
type
  TForm8 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form8: TForm8;
 
implementation
 
{$R *.dfm}
 
procedure TForm8.Button1Click(Sender: TObject);
begin
  try
    Form9:=TForm9.Create(Application);
    Form9.ShowModal;
  finally
    Form9.Free; //窗体的清理放在同一代码段的try...finaally中,而不是在ModalForm中的Destroy方法里。
    Form9:=nil;
  end;
 
end;
 
procedure TForm8.Button2Click(Sender: TObject);
begin
  if not Assigned(Form10) then  //防止出现多个窗体实例
  Form10:=TForm10.Create(Application); //窗体的创建方式
 
  Form10.Show;
end;
 
end.

模式窗体:

unit ModalForm;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;
 
type
  TForm9 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form9: TForm9;
 
implementation
 
{$R *.dfm}
 
 
end.

非模式窗体:

unit ModalessForm;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;
 
type
  TForm10 = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form10: TForm10;
 
implementation
 
{$R *.dfm}
 
procedure TForm10.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action:=caFree;
end;
 
procedure TForm10.FormDestroy(Sender: TObject);
begin
  Form10:=nil; //这里是Form10设为nil而不是TForm10,否则将无法再次创建窗体。
end;
 
end.

 

以上是关于模式窗体与非模式窗体的主要内容,如果未能解决你的问题,请参考以下文章

有关模式窗体和无(非)模式窗体的区别

急急急! c# winform开发模式窗体的一个问题

窗体是否处于设计模式阶段

winform 模式窗体最小化,父窗体也最小化,该怎样做?

WPF 在MVVM模式下弹出子窗体的方式

delphi 窗体的创建和释放