关闭窗体并释放资源问题!!(100分)

  • 主题发起人 主题发起人 DelphiMing
  • 开始时间 开始时间
D

DelphiMing

Unregistered / Unconfirmed
GUEST, unregistred user!
我想将窗体关闭后下次打开时是重新建立的,而不是将一Hide的窗体重新Show出来.
但我用Assigned(Form1)总是找到Form1.怎么办.?
我在窗体的Creat时用
Windows.SetParent(Form1.Handle,MainForm.Panel.Handle);
函数使我的窗体容入一个Panel里
最后用Close关闭窗体,但发现窗体并未释放.
用Assigned(Form1)仍可找到它.
我又分别用下面的试
1 Close;
2 Destroy;
3 Release;
4 free;
要不是关闭时出错就是关了再打开就出错.并且Assigned(Form1)总是找到.
而为了满足界面设计的要求,我必须用
Windows.SetParent(Form1.Handle,MainForm.Panel.Handle);.
讲问富翁们有什么方法吗?
 
子窗体:
procedure TForm1.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action := caFree;
end;
试试看!
 
在FormClose事件里面加入“Form1:=nil;”语句
 
Form1 关闭有默认动作 模态的是隐藏 非模态的是最小化
所以在在窗体关闭且其属主并不释放的时候 你需要手动释放资源 才能实现窗体的释放
Form1如果是全局的且是show出来的 要在这个窗体关闭时加入Action := caFree;
在销毁时间ondestory事件加入 Form1 := nil;

Form1如果是在showmodule出来的 则在改代码后面加入 Form1 := nil;
 
正确的方法应该是综合楼上两们的方法:
procedure TForm1.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action := caFree;
Form1:=nil;”
end;
这是最安全的。
 
to: royal1442
这的窗体不是MDI窗体.
to: bigqiang
Form1:=nil;我试了,不会弹出错误了,但Assigned(Form1)还是找到Form1
 
你的Form1是局部变量 还是全局变量?
 
procedure TForm1.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action := caFree;
Form1.free;
end;
 
我是用继承的,我在BaseForm中的一个关闭按钮中加
Close;
Self:=nil;
不会弹出错误了,但Assigned(BaseForm1)还是找到BaseForm1
 
用FreeAndNil(Form1);试试看啊
 
Self:=nil;不会使你的BaseForm1也为nil的
 
看这个代码
From1部分
procedure TForm1.Button1Click(Sender: TObject);
begin
if Assigned(Form2) then
ShowMessage('Form2!');
Form2 := TForm2.Create(nil);
Form2.Show;
end;

From2部分
procedure TForm2.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action := caFree;
end;

procedure TForm2.FormDestroy(Sender: TObject);
begin
//Form2 := nil;

Self := nil;
end;
Destroy事件中Form2 和Self 分别为nil时Assigned(Form2)结果时候完全不一样的
 
To royal1442
我在父窗体或子窗体都试过了,
父窗体中关闭再打开出错FreeAndNil(Self);
子窗体中没有出错了FreeAndNil(BaseForm1);但父窗体的CloseQuery没有被调用到(因为要注释掉父窗体的Close;这样才不会弹出错误)
 
To: Avalon
谢谢你的测试.
我的不是MDI窗体,我只是调用
Windows.SetParent(Form1.Handle,MainForm.Panel.Handle);
这个函数将它容入一个Panel里面.
所以它的关闭事情件是没有var Action: TCloseAction这个参数的!
 
用freeandnil(form1)
 
看这个代码
From1部分
procedure TForm1.Button1Click(Sender: TObject);
begin
if Assigned(Form2) then
ShowMessage('Form2!');
try
Form2 := TForm2.Create(nil);
try
Form2.Show;
finally
form2.FreeOnRelease;
end;
except
//
end;
end;

From2部分
procedure TForm2.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action := caFree;
end;
 
搞定了
在窗体中不用Close;
在子窗体中用
Close;
freeandnil(form1) ;
 
散分了
人人分
 
To: Avalon
我的不是MDI窗体,我只是调用
Windows.SetParent(Form1.Handle,MainForm.Panel.Handle);
这个函数将它容入一个Panel里面.
所以它的关闭事情件是没有var Action: TCloseAction这个参数的!

非MDI窗体的close事件有var Action: TCloseAction这个参数,楼主你看错了吧
我这么写没什么问题,显示关闭都很正常,每次都重新creat:
FORM1:
procedure TForm1.Button1Click(Sender: TObject);
begin
if not assigned(form2) then
form2:=tform2.Create(nil);
form2.Show;
end;

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

procedure TForm2.FormDestroy(Sender: TObject);
begin
form2:=nil;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
Windows.SetParent(Handle,form1.Panel1.Handle);
end;
 
Sorry,的确是我睇错了[:D],但form2:=nil;可不可以直接在父类窗体中一次过写好啊
 

Similar threads

回复
0
查看
1K
不得闲
S
回复
0
查看
681
SUNSTONE的Delphi笔记
S
S
回复
0
查看
768
SUNSTONE的Delphi笔记
S
后退
顶部