1. 程式人生 > >模式窗體與非模式窗體

模式窗體與非模式窗體

sse begin 內存 end graphic show ati afr code

非模式窗體從創建到銷毀都需要代碼來維護,防止內存未安全釋放。

模式窗體就比較省心一些,只需要在代碼段的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.

模式窗體與非模式窗體