application.onException 可以捕捉到raise的提示框异常信息,读取过来,
但是我怎么才能捕捉到类似showmessage('hehe')的提示框信息
如:
tryexcept
  on e: Excetpion do
    showmessage(e.message);
end;
如何把e.message读取到我们要显示的Edit1中呢?

解决方案 »

  1.   

    把下面的代码复制过去试一下。注意,编译后,脱离Delphi环境运行exe文件。procedure TForm1.Button3Click(Sender: TObject);
    var i : integer;
    begin
      try
        i := strtoint('a');
        showmessage('no error');
      except
        on e: Exception do
        showmessage(e.message);
      end;
    end;
      

  2.   

    楼主的代码没有错。可能你没有脱离Delphi运行Exe并触发了异常的缘故。var I : integer;
    begin
      try
        I := StrToInt('a');
        Edit1.text := 'No Error';
      except
        on E : Exception do
        Edit1.Text := E.Message;
      end;
    end;
      

  3.   

    都误会我的意思了,我没那么菜吧
    其中Edit1是放在主窗体上面的
    procedure TForm1.ErrException(Sender: TObject; E: Exception);
    begin
      Edit1.Text := E.Message;
    end;constructor TForm1.Create(AOwner: TComponent);
    begin
      inherited;
      Application.OnException := ErrException;
    end;然后每次要我只要
    tryexcept
      raise Exception.create('msg');//这里Edit1.text 自然会显示msg,
      //如果用 on e: Exception do
      //  showmessage(e.message); 则不能自动显示到Edit1上
    end明白我的意思了吗?
      

  4.   

    on e: Excetpion do
    showmessage(e.message);这个应该是把异常截取自己处理了吧,不会触发onException事件了。
      

  5.   

    FindWindow (EnumWindows) 找到 ShowMessage 的窗口句柄,然后操作之.
      

  6.   

    我这边的测试是,同一把所有的包中的错误都显示到主窗体中的一个Edit1上!
    不知道有没有人明白我的意思?
      

  7.   

    也不一定是ShowMessage的对话框,根源是 e:exception
      

  8.   

    现学现卖了:请问楼主要的,是下面这样吗?......
        { Private declarations }
      public
        { Public declarations }
        procedure TryExcepts(Sender: TObject; E: Exception);
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.TryExcepts(Sender: TObject; E: Exception);
    begin
      if E.Message = '' then
        ;
      else
        Edit1.Text := E.Message;
    end;
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Application.OnException := TryExcepts;
    end;procedure TForm1.Button1Click(Sender: TObject);//测试 1
    var
      I : integer;
    begin
        I := StrToInt('a'); 
    end;procedure TForm1.Button2Click(Sender: TObject);//测试2
    var
      I : integer;
      S : TStringList;
    begin
      S := TStringList.Create;
      S.Text := 'line1' + #10 + 'line2' + #10 +'line3' + #10 +'line4';
      for I := 0 to 5 do
        showmessage(S[I]);//  5 越界
      S.Free;
    end;
      

  9.   

    if E.Message = '' then
        ;   <------------------------去掉这个分号
      else
      

  10.   

    汗.... 我上面的代码就是把所有的异常都显示到主窗体的Edit里去....你试一下吧...或许与你想要的实现方式不一样...
      

  11.   

    终于明白了.....你不是要读异常信息,而是要读ShowMessage模式窗口的内容......
      

  12.   

    procedure TForm1.ErrException(Sender: TObject; E: Exception);
    begin
      Edit1.Text := E.Message;
    end;constructor TForm1.Create(AOwner: TComponent);
    begin
      inherited;
      Application.OnException := ErrException;
    end;也不一定是ShowMessage的对话框,根源是 e:exception
    ==================================================
    楼主,你这不已经实现了么?
      

  13.   

    ShowMessage窗口弹出来的东西可不是 Exception 哦,只是个提示而已,无法捕捉。
      

  14.   

    然后每次要我只要
    tryexcept
      //raise Exception.create('msg');//这里Edit1.text 自然会显示msg,
      //如果用 on e: Exception do
      //  showmessage(e.message); 则不能自动显示到Edit1上  on e: Exception do
      begin
        showmessage(e.message); 
        raise; 
      end;
    end;
      

  15.   

    如果你要捕捉ShowMessage的输出,你需要勾上MessageBox这个api,这已经不是异常捕捉的问题了。
      

  16.   

    替换单元文件Dialogs,用自己的ShowMessage
      

  17.   

    尽量不要动Dialogs文件,直接application.onexception就可以了,太刁钻的exception比如runtime error之类的就别on了,自己逮不住,就让windows处理算了
      

  18.   

    看到楼主的问题 我感觉到中国的软件业为什么是这个样了异常都被你拦掉处理了 你又不向上再复抛一次 application的onExcept 哪来的处发呀
      

  19.   

    楼主的问题不是捕捉异常,而是捕捉对话框信息.可以考虑baseyueliang的方法,并用消息来实现信息的传递.
      

  20.   

    delphi有个自带的控件,可以捕获所有异常