如何判断一个Form已经释放? ( 积分: 20 )

  • 主题发起人 主题发起人 net_morning
  • 开始时间 开始时间
N

net_morning

Unregistered / Unconfirmed
GUEST, unregistred user!
主Form中,
全局变量myFormVar:TFTEST;
button1事件中,
myFormVar:=TFTEST.create;
myFormVar.showModal;

点button1执行后,弹出一模特窗口,点关闭(close事件里action := caFree),应该是释放了该Form

button2事件中,
assigned(myFormvar) 为true
(myFormvar < > nil) 为true
 
在myFormVar的onDestroy事件里添加
myFormVar := nil;

不然既使你myFormVar释放,但是myFormVar还是指向内存地址
Assigned是判断指针非空
 
谢谢hxy2002,在myFormVar的onDestroy事件里添加
myFormVar := nil;
还是一样。
在调用的Form里面赋值是没问题的,但程序的代码无法判断是否子Form关闭了
 
我试了下可以的
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
T: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
T := TForm1.Create(nil);
T.SetBounds(0, 0, 100, 100); //区别主Form
T.ShowModal;
//T.Free; //因为是ShowModal,所以可以在这里Free
//T := nil;

{
T := TForm1.Create(nil);
try //最好用try..finally..end,可以保证T能正常释放
T.SetBounds(0, 0, 100, 100);
T.ShowModal;
finally
FreeAndNil(T);
end;
}
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Caption := BoolToStr(Assigned(T), True);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
T := nil;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;

end.
 
如果是父子形的窗口在OnClose事件中先写Action := Cafree;然后写myFormVar := nil;
 
谢谢各位大侠。
真奇怪,如果直接使用Form2变量就可以,如果定义全局变量yyy:TForm2,就不行。
 
多人接受答案了。
 
后退
顶部