最近写一个程序.
在窗体关闭时调用一个过程A.过程是对XML的写操作.里面有出错处理.
过程A代码一部分如下.    
    result := false;
    try
        (这里是对XML结点的操作)
         代码行1
        代码行2
        代码行3
        代码行4
        result := true;
    except
        raise(TMyException.Create('TfrmReportDisplay_SetReportFormat_002','Set Set XML Error',0));
        AXMLDoc.Active := false;
        exit;
    end;
TMyException 是我自己定义的一个出错处理类.假设当执行到代码行3的时候程序出错(我这里一般为对象为空).就会执行出错处理.
但在窗体Close时调用过程A,出错时窗体无法关闭.自己想的的解决方法: 通过过程A的返回值关闭窗体(网上有朋友说有Message消息直接关闭窗体),试过了也无效.求如何在这种情况下如何正常关闭窗体.

解决方案 »

  1.   

    你需要处理这个异常,或者你在Application.OnException中处理
      

  2.   

    在A 中捕获异常,别扔出去,然后处理异常.最后关闭窗口,用
    PostQuitMessage退出
      

  3.   

    回复lake_cx 和 akirya
    你们的意思是不是"我没有处理这个异常,一直抛出,从而导致调用的窗体无法关闭?"
      

  4.   

    对,如果一定要给你解释原因的话,我可以告诉你当点击关闭窗体时,会收到WM_CLOSE消息
    它映射到
    procedure WMClose(var Message: TWMClose); message WM_CLOSE;然后调用Close方法
    procedure TCustomForm.WMClose(var Message: TWMClose);
    begin
      Close;
    end;这是Close方法
    procedure TCustomForm.Close;
    var
      CloseAction: TCloseAction;
    begin
      if fsModal in FFormState then
        ModalResult := mrCancel
      else
        if CloseQuery then
        begin
          if FormStyle = fsMDIChild then
            if biMinimize in BorderIcons then
              CloseAction := caMinimize else
              CloseAction := caNone
          else
            CloseAction := caHide;
          DoClose(CloseAction);//这一句就是调用你的OnClose事件了
          if CloseAction <> caNone then
            if Application.MainForm = Self then Application.Terminate
            else if CloseAction = caHide then Hide
            else if CloseAction = caMinimize then WindowState := wsMinimized
            else Release;
        end;
    end;你抛出了异常DoClose(CloseAction);后面就不会再执行了,因此Hide或Release不会被调用,导致窗体不能关闭。
      

  5.   

    明白了
    今天早上的时候按照楼上的思路去看了一下,问题真的是这样.
    哈哈``
    现在看看TCustomForm.Close里的过程``还真是这样.结贴.