首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

关于FreeAndNil的有关问题

2012-02-19 
关于FreeAndNil的问题一个form1为MDIForm,一个form2为MDIChild,点击form1中的按钮,打开form2,在form2的clo

关于FreeAndNil的问题
一个form1为MDIForm,一个form2为MDIChild,
点击form1中的按钮,打开form2,在form2的close事件中写如下代码

Delphi(Pascal) code
procedure TForm2.FormClose(Sender: TObject;  var Action: TCloseAction);begin  FreeAndNil(Form1);end;

报内存地址的错误。

如果改为
Delphi(Pascal) code
procedure TForm2.FormClose(Sender: TObject;  var Action: TCloseAction);begin  Action:=caFree;  Form1:=nil;end;

则不报错。
是何原因呢?

[解决办法]
什么乱七八糟的

应该是
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
Form2 := nil;
end;

子窗体关闭怎么能把主窗体给释放(FreeAndNil)呢, nil只是把指针置空而已,不是真正的释放。
[解决办法]
楼主是希望子窗体关闭时,主窗体也同时关闭?
[解决办法]
贴一下完整的代码吧!
[解决办法]
首先Form1:=nil;不是释放窗体,只是把指针置空而已。
然后就是你在Form2的close事件里把Form1给释放掉了,Form2还在,当然会报错了。
[解决办法]
探讨
首先Form1:=nil;不是释放窗体,只是把指针置空而已。
然后就是你在Form2的close事件里把Form1给释放掉了,Form2还在,当然会报错了。

[解决办法]
Form1是主窗体,Form2是子窗体,在Form2的Close事件调用FreeAndNil去释放Form1,有点乱套了,form1引用form2,form2引用form1,最好不要这样交叉引用。如果你是要释放MDIChild窗体,直接在Form2的Close事件,写上FreeAndNil(self)也可以,不过一般直接把Action设置为Free.
[解决办法]
procedure TForm2.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
FreeAndNil(Form1);
end;


报内存地址的错误。

如果改为
Delphi(Pascal) code
procedure TForm2.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action:=caFree;
Form1:=nil;
end;

~~~~~~~~~~~~~~~~~~~
楼主因为你改正确了所以不会报错。:)
freeandnil不要再MDI窗体里面用,在其他窗体里也不要把freeandnil写在 close事件里。
在MDI窗体里如果要最小化窗体可以用self.close,如果需要彻底的关闭该子窗体(内存释放),可以在close事件里再加 action := cafree;

右上角自带关闭和self.close是一个道理的。只要close事件里不要用freeandnil,那应该是都不会报错的。

[解决办法]
procedure TForm2.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
FreeAndNil(Form2);
end;

系统在调用OnClose后,也就是运行你的FormClose之后,还要根据Action参数来判断,默认情况下
会执行Hide(MDIChild),也就是FreeAndNil(Form2);之后还要执行Form2.Hide,当然会地址错误,
因此不要在FormClose中执行本身的Free,Delphi专门搞了个参数Action,就是为了在Form事件中实现隐藏或者释放.




[解决办法]
delphi2007 不报错
[解决办法]
首先Form1:=nil;不是释放窗体,只是把指针置空而已。
然后就是你在Form2的close事件里把Form1给释放掉了,Form2还在,当然会报错了。
[解决办法]
如果是这样的话,你直接在Form2的OnDestroy事件写上Form2 := nil就可以了,不要写在OnClose事件里面。

热点排行