模式窗體與非模式窗體
阿新 • • 發佈:2018-12-15
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 tryForm9:=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.
模式窗體與非模式窗體