为什么我用子窗体中的一个按钮来关闭这个子窗体会报错呢?
而在主窗体的菜单里去关闭就不会。具体情况如下:
在菜单里打开一个子窗体:frmChild := TfrmChild.Create(Application);
在frmChild中一个button里加入代码:Close;在frmChild的onClose中加入:Free;
但是会报错:'Access violation at address 00000000. Read of address 00000000'
在主窗体的菜单里的代码:frmChild.Free;是没问题的。
高手看看我的代码错在哪里?怎么改进?或者有什么好的其他的方法。
另外还有一个贴子:http://expert.csdn.net/Expert/topic/2854/2854145.xml?temp=.4284632 ,也是关于多文档的问题,还没人回答正确,可以一并看看。我一起结贴。多谢!
而在主窗体的菜单里去关闭就不会。具体情况如下:
在菜单里打开一个子窗体:frmChild := TfrmChild.Create(Application);
在frmChild中一个button里加入代码:Close;在frmChild的onClose中加入:Free;
但是会报错:'Access violation at address 00000000. Read of address 00000000'
在主窗体的菜单里的代码:frmChild.Free;是没问题的。
高手看看我的代码错在哪里?怎么改进?或者有什么好的其他的方法。
另外还有一个贴子:http://expert.csdn.net/Expert/topic/2854/2854145.xml?temp=.4284632 ,也是关于多文档的问题,还没人回答正确,可以一并看看。我一起结贴。多谢!
的时候加 action := cafree;destory
的时候加 free;
Action:=cafree;
frmChild := TfrmChild.Create(self);
begin
form2:=TFORM2.Create(APPLICATION) ;
FORM2.SHOW;
end;
procedure TForm2.Button1Click(Sender: TObject);
begin
FORM2.Release ;
end;
因为,release是在所有的事件或句柄结束以后,才释放所占用的内存
你再Onclose里面用free,要知道Onclose也是一个事件阿,form这是还占着一个句柄呢,你给他Free掉了,然后系统完成了这个事件,突然发现这个事件和它的“拥有者”,那个form已经不见了,蒸发了,是不是很恐怖的一件事?然后程序受不了着眼前的现实了,自杀了
中加入:Free;
了,
OnClose接下来调用自己, 就发现自己已经是空的, 就出错了!
begin
//如果有数据集,先关闭数据集,否则容易出现地址错误
Close;
end;
procedure TfrmChild.FormClose(Sender: TObject; var Action: TCloseAction);
begin Action := caFree;
end;procedure TfrmChild.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := True;
end;
action:=cafree;
frmChild:=nil;
frmChild := TfrmChild.Create(self);
frmChild.Show;
finally
freeandnil(frmChild);
end;
仅供参考
产生错误的原因有可能是
1、窗口已经创建,而在frmChild中引用frmChild.button1.caption之类的
2、没有创建而引用,如没有TfrmChild.Create(self),在别的窗口中引用frmChild