用的是DELPHI7,程序有几个窗体组成,分别为主窗体Form1,子窗体Form2、Form3(子窗体用于从数据库中查询)。Form1的类型为fsnormal,Form2、Form3的l类型也为fsnormal。在主窗体Form1上有两个Button,
点击时执行以下代码创建子窗体:
if not Assigned(Form2) then
      Application.CreateForm(TForm2, Form2);现在有一个问题,如果点击Button按钮创建子窗体Form2、Form3并执行相关查询,之后不关闭Form2、Form3,而直接关闭主窗体Form1,程序报错。而如果先关闭子窗体Form2、Form3,再关闭主窗体Form1,程序可正常退出,这是为什么呢??
请问怎样在点击关闭主窗体前把之前打开的子窗体先关闭掉再关闭主窗体呢??

解决方案 »

  1.   

    子窗体都是show显示的吗?
    不清楚你的子窗体在关闭的时候做了什么事情。最好贴点代码。
      

  2.   

    单对窗体,直接关form1是可以的
    是不是form2,3中有其它的需要释放的没释放
    跟踪调试下看具体是哪几行代码引起的
      

  3.   

    建议养成良好的习惯,哪里用哪里释放,用过就释放
    Aform := TForm2.create(application);
    try
      aform.showmodal;
    finally
      aform.free;
    end;
      

  4.   

    您需要用 freeandnil()去彻底的关闭一个窗体
      

  5.   

    应该这样写
    if  Assigned(Form2) then freeandnil(form2);
    Application.CreateForm(TForm2, Form2);
      

  6.   

    是不是在close中将action等于cafree了
      

  7.   

    关闭Form1前,先关闭并释放Form2,Form3
      

  8.   

    在Form2,Form3的Close事件中我是这样写的:
    Action := cafree;
      

  9.   


    请问是在Form1的OnClose事件中添加:
    freeandnil(form2);
    freeandnil(form3);
    吗?是这样释放吗?
      

  10.   

    您还需要看看工程文件dproj,view source ,看看是不是程序启动同时已经创建了3个窗体。
      

  11.   

    for i := MDIChildCount downto  0 do
        MDIChildren[i].Free;
    可以类似于这种方法处理。
      

  12.   

    close;关闭之前将所有DLL也释放掉即可
      

  13.   

    在Form1的OnClose事件中关闭其他的窗体。
      

  14.   

    关键要看其他的窗体都是谁生成的,Owner是谁?