关于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是主窗体,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事件里面。