动态创建Form后,如何保证在被创建的FORM关闭(close)时,被创建的FORM能自动从内存中释放?(100分)

H

ham9v

Unregistered / Unconfirmed
GUEST, unregistred user!
各位好:
我有一个关于释放FORM问题向大家请教:
一个Application中有两个Form:Form1和Form2,其中Form1是主窗体,在Form1上两个Button:Button1和Button2,其中
Procedure TForm1.button1click(sender:TObject);
begin
form2:=tform2.create(self);
form2.show;
end;

procedure TForm1.button2click(sender:TObject);
begin
form2:=tform2.create(application);
form2.show;
end;
在Form2上有一Button1,其中
procedure TForm2.button2click(sender:TObject);
begin
close;
end;
我的问题是
1、依次执行form1.button1click->form2.button1click后form2可以从内存中释放吗?如果执行form1.button2click->form2.button1click后form2可以从内存中释放吗?
2、若将form2.show改成form2.showmodal后再分别执行以上两个执行过程,form2的释放情况会有变化吗?
多谢!!!
3、动态创建Form后,如何保证在被创建的FORM关闭(close)时,被创建的FORM能自动从内存中释放?
 
在onclose中
action:=cafree
 
只要不是MDI子窗体(formstyle=fsmdichild),窗体close都能正常释放资源,
不过在onclose事件中最好加上一句form2:=nil
不加也无关紧要。
 
form2.free;
form2.nil;
 
跟show和showmodal以及create(self)和create(application)没什么关系吗?
 
模式窗体

modalForm:=TmodalForml.Create(Application);
try
modalForm.showmodal;
..
finally
modalform.free;
modalform:=nil;
end;

无模式窗体
if not assigned(form) the
form:=Tform.create(Application)
form.show

formclose中Action:=cafree;

formdestroy中form:=nil;
 
建议:
with tform2.create(application) do
begin
Show;
Free;
end;
 
如果是普通窗体
Form:=TForml.Create(Application);
try
Form.showmodal;
finally
form.free;
form:=nil;
end;
如果是MDI窗体
在窗体的ONCLOSE事件中加:ACTION:=CAFREE;
 
Close并不会释放资源,而只是隐藏窗体.
可以通过在FORM1关闭时检查FORM2的赋值来决定是否需要执行FORM2.FREE.
 
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree ;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Form1:=nil;
end;

 
多谢各位,我明白了,再次感谢各位的帮助!!!
 
顶部