我在窗体释放的时候写
procedure TForm1.FormDestroy(Sender: TObject);
begin
inherited;
A.Free;//A是我在Create时创建的一个对象
end;
模态窗体可以通过
frm := TForm1.Create(Self) do
try
......
finally
frm.Free;//不管怎么样,这里都会执行,会响应Detroy事件,会把A释放掉
end;如但是我是非模态窗体,
frm := TForm1.Create(Self);
frm.Show;
另外
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
这样当我的这个窗体单元出现异常时,就不会执行Destroy里面的东西,要怎么做啊,急死我了!
procedure TForm1.FormDestroy(Sender: TObject);
begin
inherited;
A.Free;//A是我在Create时创建的一个对象
end;
模态窗体可以通过
frm := TForm1.Create(Self) do
try
......
finally
frm.Free;//不管怎么样,这里都会执行,会响应Detroy事件,会把A释放掉
end;如但是我是非模态窗体,
frm := TForm1.Create(Self);
frm.Show;
另外
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
这样当我的这个窗体单元出现异常时,就不会执行Destroy里面的东西,要怎么做啊,急死我了!
try
frm.Show;
finally
frm.Free;
end;
no free,but "action:=cafree" is ok
frm := TForm1.Create(Self);
frm.Show;
-------
frm:=TForm1.Create(nil);
try
frm.showModal;
finally
frm.free;
end;--------------------
Action := caFree;//用在MDI的子窗体中,普通窗体的不需要
-------------------
To: BeyondStudio(Alan) ( )
//下面的代码能用吗?窗口一闪而过哦
frm := TForm1.Create(Self);
try
frm.Show;
finally
frm.Free;
end;
try
Form1.ShowModal;
finally
Form1.Free;
end;
WM_FreeObject = WM_User + $10;
// free object message
procedure WMFreeObject(var Message: TMessage); message WM_FreeObject;procedure TMainForm.WMFreeObject(var Message: TMessage);
begin
try TObject(Message.WParam).Free; except end;
end;在FormCloseQuery中
// post free object message to main form
PostMessage(MainForm.Handle, WM_FreeObject, Integer(Self), 0);这样就可以完美解决SHowForm的Free问题我的LYFTP就是这样的http://lysoft.7u7.net可以结贴的了
我想对于楼主的问题,这应该也是一个最简单而又完美的方案。
不管创建对象的代码放在何处,关键是要用Try...except包起来,在出现异常时释放对象并跳过创建或显示窗体的代码,而原来OnDestory中的释放代码视不同写法或仍需保留、或移至OnClose处。目的是保证有且只有一处释放代码被执行。(出现异常时窗体没有创建或者显示,自然不会执行OnClose或OnDestory。)
if frm<>null then
being
frm.free;
frm := null;
end;要注意判断,不要释放已经释放的指针;
frm := TForm1.Create(Self);
frm.Show;
-------
frm:=TForm1.Create(nil);
try
frm.showModal;
finally
frm.free;
end;--------------------
Action := caFree;//用在MDI的子窗体中,普通窗体的不需要
-------------------
To: BeyondStudio(Alan) ( )
//下面的代码能用吗?窗口一闪而过哦
frm := TForm1.Create(Self);
try
frm.Show;
finally
frm.Free;
end;
frm := TForm1.Create(Self);
try
frm.Show;
finally
frm.Free;
end;
老兄,你的这段代码也太有趣了吧.....一晃而过
procedure TForm1.FormDestroy(Sender: TObject);
begin
A.Free;//A是我在Create时创建的一个对象<----- 放上面来
inherited;
end;