我也觉得是这问题,可能是释放的不干净的原因。那么:如何在关闭form2时释放窗口呢?
1.在用按纽关闭时:form.close;或if application.messagebox('确认退出?','确认框',49)= 1 then
close  的时候应该如何释放?2。按右上角的小X关闭时又是如何释放?
我在rocedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if Application.MessageBox('确认退出?','确认框',MB_OKCANCEL+MB_ICONQUESTION)=IDOK then
canclose:=true
else
canclose:=false
end;
这种情况下如何释放?

解决方案 »

  1.   

    由于action := caFree 所以在关闭窗口时,对象Form2已经释放,但是变量Form2中还保留着原来的指针,所以这时变量Form2<> nil 所以在not Assigned(form2)判断中为假,但是在form2.show中却发现form2对象实际已经不存在,所以出错。如果form2对象可以访问form2变量的话,在OnDestroy中加一句form2 := nil ;
    但我不喜欢这种编法
      

  2.   

    比较好的控制是showmodal,如果你用的是一个个窗口显示的话!
      

  3.   

    To chenjiong(准程序员)if not Assigned(form2) then begin 
      form2:=Tform2.Create(Application);
      form2.OnDestroy := Form2Destroy;
    end;
    form2.Show;procedure Form2Destroy(sender : TObject);
    begin
      form2 := nil;
    end;如果在Tform2的定义中没有用到OnDestroy的话我建议你这样试试
      

  4.   

    简单的:
    if not Assigned(form2) then form2:=Tform2.Create(Application);
    form2.Show;在创建出的窗口的onclose中加入:
    action:=cafree;
    form2:=nil;
      

  5.   

    heifei():好象上回你讲过的,在我的另一帖子里。
      

  6.   

    还有最后一问:在创建时,如何用finally来进行程序的运行保护?在if not Assigned(form2) then form2:=Tform2.Create(Application);
    form2.Show;或if not Assigned(form2) then begin 
      form2:=Tform2.Create(Application);
      form2.OnDestroy := Form2Destroy;
    end;
    form2.Show;这种代码写法里?
      

  7.   

    通常,我不喜欢用form2之类的变量来保存。
    例子:
      var 
        i:Integer;
        b: Boolean;
      begin
        //b := false;
        for i := 0 to MDIChildCount-1 do
          if MDICHildren[i] is TForm2 then
          begin
            MDIChildren[i].BringToFront;
            b := true;
            break;
          end;
        if not b then
          TForm2.Create(Application).Show;
      end
      

  8.   

    你这里好像用不上finally ,try ... except ... end 倒可以用用。
    if not Assigned(form2) then
      try
        form2:=Tform2.Create(Application);
        form2.OnDestroy := Form2Destroy;
      except
        form2.free;
        form2 := nil;
        raise;
      end;form2.Show;
      

  9.   

    onclose
      action:=cafree;
    ondetroy
      form2:=nil;