为什么我用子窗体中的一个按钮来关闭这个子窗体会报错呢?
而在主窗体的菜单里去关闭就不会。具体情况如下:
在菜单里打开一个子窗体: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 ,也是关于多文档的问题,还没人回答正确,可以一并看看。我一起结贴。多谢!

解决方案 »

  1.   

    close
    的时候加 action := cafree;destory
    的时候加 free;
      

  2.   

    在窗体的Formclose事件中加入以下语句:
    Action:=cafree;
      

  3.   

    创建错误
    frmChild := TfrmChild.Create(self);
      

  4.   

    先看你创建方式,是在程序里动态创件还是选ATUOCREATE FORM鍀。如果做法正确,请参阅其它人鍀说法。
      

  5.   

    对了,我想起来了,你可以用release试试,应该这个可以的。
      

  6.   

    procedure TForm1.Button1Click(Sender: TObject);
    begin
     form2:=TFORM2.Create(APPLICATION)  ;
     FORM2.SHOW; 
    end;
    procedure TForm2.Button1Click(Sender: TObject);
    begin
    FORM2.Release ;
    end;
      

  7.   

    同bjskyhorse() ;
    因为,release是在所有的事件或句柄结束以后,才释放所占用的内存
    你再Onclose里面用free,要知道Onclose也是一个事件阿,form这是还占着一个句柄呢,你给他Free掉了,然后系统完成了这个事件,突然发现这个事件和它的“拥有者”,那个form已经不见了,蒸发了,是不是很恐怖的一件事?然后程序受不了着眼前的现实了,自杀了
      

  8.   

    现在, 你先
    中加入:Free;
    了, 
    OnClose接下来调用自己, 就发现自己已经是空的, 就出错了!
      

  9.   

    procedure TfrmChild.BitBtn1Click(Sender: TObject);
    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;
      

  10.   

    奇怪了,昨天我用Action := caFree也报错,今天没报错了!
      

  11.   

    不如查查你的两个frmChild是不是同一个,如果在子窗体中的frmChild不是创建时的那个,当然出错
      

  12.   

    对不起,我说错了,应该还是创建时的问题,而且在OnClose事件中用Action := caFree
      

  13.   

    受教了,我今天也碰到了类似的问题,不过直接在 Onclose中用Free也行。
      

  14.   

    onclose的事件中。。加入。。
    action:=cafree;
    frmChild:=nil;
      

  15.   

    try
        frmChild := TfrmChild.Create(self);
        frmChild.Show;
      finally
        freeandnil(frmChild);
      end;
    仅供参考  
    产生错误的原因有可能是
    1、窗口已经创建,而在frmChild中引用frmChild.button1.caption之类的
    2、没有创建而引用,如没有TfrmChild.Create(self),在别的窗口中引用frmChild