我在窗体释放的时候写
procedure TForm1.FormDestroy(Sender: TObject);
begin
  inherited;
  A.Free;//A是我在Create时创建的一个对象
end;
模态窗体可以通过
frm := TForm1.Create(Self) do
try
  ......
finally
  frm.Free;//不管怎么样,这里都会执行,会响应Detroy事件,会把A释放掉
end;如但是我是非模态窗体,
  frm := TForm1.Create(Self);
  frm.Show;
另外
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;
这样当我的这个窗体单元出现异常时,就不会执行Destroy里面的东西,要怎么做啊,急死我了!

解决方案 »

  1.   

    frm := TForm1.Create(Self);
    try
      frm.Show;
    finally
      frm.Free;
    end;
      

  2.   


    no free,but "action:=cafree" is ok
      

  3.   

    如果你用self参数,就不用你自己释放了,self自己会帮你释放的
    frm := TForm1.Create(Self);
      frm.Show;
    -------
    frm:=TForm1.Create(nil);
    try
      frm.showModal;
    finally
      frm.free;
    end;--------------------
    Action := caFree;//用在MDI的子窗体中,普通窗体的不需要
    -------------------
    To: BeyondStudio(Alan) ( ) 
    //下面的代码能用吗?窗口一闪而过哦
    frm := TForm1.Create(Self);
    try
      frm.Show;
    finally
      frm.Free;
    end;
      

  4.   

    Form1 := TForm1.Create(Self);
    try
      Form1.ShowModal;
    finally
      Form1.Free;
    end;
      

  5.   

    消息方法
    WM_FreeObject = WM_User + $10;
    // free object message
        procedure WMFreeObject(var Message: TMessage); message WM_FreeObject;procedure TMainForm.WMFreeObject(var Message: TMessage);
    begin
      try TObject(Message.WParam).Free; except end;
    end;在FormCloseQuery中
    // post free object message to main form
           PostMessage(MainForm.Handle, WM_FreeObject, Integer(Self), 0);这样就可以完美解决SHowForm的Free问题我的LYFTP就是这样的http://lysoft.7u7.net可以结贴的了
      

  6.   

    我的习惯是将创建对象的代码放在窗体的OnCreate之外,甚至是在窗体创建之前,如果出错窗体就不显示或者根本不创建。
    我想对于楼主的问题,这应该也是一个最简单而又完美的方案。
      

  7.   

    我上面的话只说了一半,显得不太对题。
    不管创建对象的代码放在何处,关键是要用Try...except包起来,在出现异常时释放对象并跳过创建或显示窗体的代码,而原来OnDestory中的释放代码视不同写法或仍需保留、或移至OnClose处。目的是保证有且只有一处释放代码被执行。(出现异常时窗体没有创建或者显示,自然不会执行OnClose或OnDestory。)
      

  8.   

    用消息是比较折中的方法了 ;推荐 ly_liuyang(Liu Yang) 的方法
    if frm<>null then 
    being
      frm.free;
      frm := null;
    end;要注意判断,不要释放已经释放的指针;
      

  9.   

    ly_liuyang的方法不行,并不是说窗体Close异常时不能正常Destroy,我这个窗体实际上是在DLL中如果有一个按钮按下去出现异常导致窗体非正常关闭,它并不会进入CloseQuery事件里面,所以还是无解
      

  10.   

    如果你用self参数,就不用你自己释放了,self自己会帮你释放的
    frm := TForm1.Create(Self);
      frm.Show;
    -------
    frm:=TForm1.Create(nil);
    try
      frm.showModal;
    finally
      frm.free;
    end;--------------------
    Action := caFree;//用在MDI的子窗体中,普通窗体的不需要
    -------------------
    To: BeyondStudio(Alan) ( ) 
    //下面的代码能用吗?窗口一闪而过哦
    frm := TForm1.Create(Self);
    try
      frm.Show;
    finally
      frm.Free;
    end;
      

  11.   

    回复人: BeyondStudio(Alan) ( ) 信誉:100  2004-01-05 21:12:00  得分:0 
     
     
      frm := TForm1.Create(Self);
    try
      frm.Show;
    finally
      frm.Free;
    end;
      
     
    老兄,你的这段代码也太有趣了吧.....一晃而过
      

  12.   

    楼主,换一下
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
     A.Free;//A是我在Create时创建的一个对象<----- 放上面来
     inherited;
    end;