关于模态窗体的问题,一关闭就死机,怎么回事?
有两个窗体,form1为主窗体,form2为模态窗体。将form2在自动建立窗体的列表中移除。在form1中有一个按钮button1,点击它显示form2。
procedure TForm1.Button1Click(Sender: TObject);
begin
  try           //不知道有没有必要用异常处理?
    form2:=Tform2.Create(application);
    form2.ShowModal;
  except
    form2.Free;
  end;
end;
在form2中有一个按钮button2,点击它关闭form2。
procedure TForm2.Button1Click(Sender: TObject);
begin
  form2.free;
end;
可是一点击button2就死机。为什么,书上写的是用free来关闭模态窗体的啊。如果改为close就没事,why?free与release有什么区别?form2:=Tform2.Create(application);中的application是什么意思,改为nil行不行?
请各位老师指教,谢谢了!

解决方案 »

  1.   

    不要用Free,用Close;
    调用Close时,系统会自动将它Free掉,
    如果仅仅是关闭Form2,
    procedure TForm2.Button1Click(Sender: TObject);
    begin
      form2.Close;
    end;
    如果是退出程序
    procedure TForm2.Button1Click(Sender: TObject);
    begin
      form1.Close;
    end;现在的书啊,害死人!
    记住,书没有CSDN好!!呵呵~~~
      

  2.   

    Create():
    Self在Delphi中总是代表实例本类
    application代表的是整个运行程序
    create()中传递的是AOwner参数,及所有者的意思,也就是这个AOwner负责该
    创建对象的释放。[谁建立谁释放原则]也就是说控件的所有者如果调用了Free方法删除自己,那么他所拥有的控件也一样要调用Free方法删除自己
      

  3.   

    关闭时用close的话form2是不会真的Free掉的,这样会有内存泄漏的!
      

  4.   

    模态窗口与别的窗口不同,模态窗体Close时就会返回一个值,然后自动将自身占用的资源释放,所以只有当模态窗体Close返回一个值后,才会把操纵权交给别的窗口,当你调用Free方法时,它只是将自身的资源释放,并没有返回一个值,也就是并没有把操纵权交给别的窗口,所以你直接调用Free后,你也就没法操纵别的窗口了,出现"死机",所以只要是模态窗口关闭时就要调用Close方法就行了,不必但心它不会自动释放资源.
      

  5.   

    哎呀,说错了,模态窗口调用Close方法是不会自动释放资源的,向下面这样子就OK啦:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
        form2.ShowModal;
        form2.Free;
    end;在form2中有一个按钮button2,点击它关闭form2。
    procedure TForm2.Button1Click(Sender: TObject);
    begin
      form2.Close;
    end;
      

  6.   

    哎呀,又错了,漏了一句代码:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
        form2:=Tform2.Create(application);
        form2.ShowModal;
        form2.Free;
    end;在form2中有一个按钮button2,点击它关闭form2。
    procedure TForm2.Button1Click(Sender: TObject);
    begin
      form2.Close;
    end;
      

  7.   

    我想知道的是:showmodal之后就free可以吗?为什么?模态窗体到底是怎么回事?
      

  8.   

    1. ShowModal之后可以free掉,例
       frm1 := TForm1.Create(self);  
       frm1.ShowModal;
       frm1.Free;
    2. 没有为什么,Modal窗口都返回了,在Modal窗口该干的都干完了,没用
       的东西就扔进垃圾桶啦。
    3. 所谓Modal的窗口与普通的窗口区别在于,当一个父窗口有一个Modal的
       子窗口时,Modal窗口不关闭,焦点无法回到父窗口,也就是程序会在
       ShowModal那句停下来,等Modal窗口关闭以后再往下执行。
       非Modal窗口则相反,系统显示非Modal窗口之后立即返回,执行show的
       后面一句程序,当然系统焦点也可以回到父窗口啦。
      

  9.   

    楼上的兄弟们已经讲得比较细了,我在补充一点,如果你想在关闭Form2时释放Form2所占资料,请在Form2.OnClose事件中增加一句:
    Action:=caFree;再强调一下,也不知这是不是你想要知道的原理:
    在Form2.button1Click()中只能用Close(关闭),而不能用Free(释放),就像你可以命令的右手握刀去砍掉你的左手,却不能叫右手拿刀砍掉你的右手。不知上面的比喻是否恰当!!