我使用webbrowser控件浏览某网页,但如果打开失败或者无法连接服务器时,就会显示:此程序无法显示网页......
我不想webbrowser显示这个提示,想先检测一下网页是否能够打开,或者当失败时跳到自己本地的出错提示页或者图片,该如何判断? 

解决方案 »

  1.   

        procedure Navigate(const URL: WideString; var Flags: OleVariant); overload;
        procedure Navigate(const URL: WideString; var Flags: OleVariant; var TargetFrameName: OleVariant); overload;
        procedure Navigate(const URL: WideString; var Flags: OleVariant; 
                           var TargetFrameName: OleVariant; var PostData: OleVariant); overload;
        procedure Navigate(const URL: WideString; var Flags: OleVariant; 
                           var TargetFrameName: OleVariant; var PostData: OleVariant; 
                           var Headers: OleVariant); overload;看下这几个方法怎么用,那些var标识的参数是有用的,我认为Headers是可以知道有没有打开了,Flags那些不知道是什么,找找看有没有demo
      

  2.   

    谢谢!
    我也弄不明白这些方法是怎么用的,都是些参数,navigate命令没有返回值,也不会触发异常,所以不好判断网页是否能打开。
      

  3.   

    var 标识的参数和返回值也一样的,看看这些参数是干什么用的,可能可以找到你要的东西
      

  4.   

    ping 一下 多好 判断了就
      

  5.   

    to:pengderun 无从下手呀。
    to:chinawcs 您是说从程序里先ping一下?这只能保证网络能通,还是没办法保证网页能正常打开的,而且在页面间跳转的时候,我不能每次刷新的时候都ping一下吧。
      

  6.   

    在DocumentComplete事件中判断下标题
    uses MSHTML;
    procedure TForm1.wb1DocumentComplete(Sender: TObject;
      const pDisp: IDispatch; var URL: OleVariant);
    begin
      ShowMessage(IHtmlDocument2(wb1.Document).title);
    end;
      

  7.   

    to:pathletboy  您是说判断如果返回的页面标题包含 “导航已取消” 、 “无法显示该网页” 的字样,就转到自己本地定义的出错页面是吧。
    这个标题是不是和ie版本有关呀,我这么写了下试试,在我的电脑是可行的,就是不知道到别的电脑上还行不行。谢谢!
    if (Pos('导航已取消', wb.OleObject.document.title) > 0) or (Pos('无法显示', wb.OleObject.document.title) > 0) then
    begin
       ......
    end;
      

  8.   

    或者你看看
    IHtmlDocument2(wb1.Document).url
    或者你判断url,看看是不是更通用些。
      

  9.   

    找个idhttp获取网站http头的例子给你参考下:
    procedure Button1Click(Sender: TObject);
    var
      http : TIdHttp;
      url : string;
      code : integer;
    begin
      url := 'http://www.WEBSITE.com';
      http := TIdHTTP.Create(nil);
      try
        try
          http.Head(url);
          code := http.ResponseCode;
        except
          on E: EIdHTTPProtocolException do
            code := http.ResponseCode; 
        end;
        ShowMessage(IntToStr(code));
      finally
        http.Free();
      end;
    end; 这个ResponseCode返回200就是OK,具体代码表示什么你可以搜索http头状态码,你先判断OK了再用webbrower去打开页面,或者你能找到webbrower取http头的方法也可以,我也不知道可不可以。
      

  10.   


    function TForm1.CheckInternetOnline: Boolean; // 检查互联网是否在线
    var
      ConnectState: DWORD;
      StateSize: DWORD;
    begin
      ConnectState := 0;
      StateSize := sizeof(ConnectState);
      Result := false;
      // Use WinInet.pas;
      if InternetQueryOption(nil, INTERNET_OPTION_CONNECTED_STATE, @ConnectState,
        StateSize) then
        Result := (ConnectState and INTERNET_STATE_DISCONNECTED) <> 2;
      if Result then
        Result := InternetCheckConnection('http://www.baidu.com', 1, 0);
    end;
    把里面的网址 换成你要访问的 地址  
      

  11.   

    TO10# pengderun  我粘贴这段代码试了下,会产生异常。
    TO12# chinawcs 这个方法不错,单独在按钮单击事件里执行是不错的。可是放在webbrowser控件的wbBeforeNavigate2事件中,会报错溢出,放在wbDocumentComplete事件中,都会导致程序无响应。这个检测应该放在哪里呢?
      

  12.   

    如果你想判断webbrowser是否加载成功呢,就别用别的组件判断,别的组件访问成功了,不代表你webbrowser也访问成功,说极端点,别的组件访问该网页成功了,下一刻轮到你的webbrowser访问,网页出点问题就有可能失败。
      

  13.   

    to:pathletboy  你说得有道理,还是应该检测webbrowser是否加载成功,所以现在我还是用我在7楼所用的代码,在我的电脑上是可行的,不过,总觉得不太理想。
      

  14.   

    delphi版块还真是挺冷清的哈。