我本来想在软件中实现当导航到满足条件的URL时则将其重定向,可是我发现这样子竟然不行(因为该URL可能在框架中,我只想改变该框架的内容而不想改变其他框架的内容):procedure TForm1.WebBrowser1BeforeNavigate2(Sender: TObject;
  const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
  Headers: OleVariant; var Cancel: WordBool);
begin
  {这里略去判断URL的片断}
   URL:='http://hwxk.com';
end;谁能解决?

解决方案 »

  1.   

    在BeforeNavigate2里对URL的修改是无效的,可以叫BUG,这里的URL其实应该声明为const比较好。要重定向呢,可以通过发消息实现(不能直接在BeforeNavigate2里做),看下面的测试程序:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, OleCtrls, SHDocVw;type
      TForm1 = class(TForm)
        WebBrowser1: TWebBrowser;
        procedure WebBrowser1BeforeNavigate2(Sender: TObject;
          const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
          Headers: OleVariant; var Cancel: WordBool);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        g_pDisp: IDispatch;
        g_URL, g_Flags, g_TargetFrameName, g_PostData, g_Headers: OleVariant;
        procedure Redirect(var Message: TMessage); message WM_USER+1;
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.WebBrowser1BeforeNavigate2(Sender: TObject;
      const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
      Headers: OleVariant; var Cancel: WordBool);
    begin
      if Pos('google', URL) > 0 then begin
        g_pDisp := pDisp;
        g_URL := 'http://www.yahoo.com/';
        g_Flags := Flags;
        g_TargetFrameName := TargetFrameName;
        g_PostData := PostData;
        g_Headers := Headers;
        PostMessage(Handle, WM_USER+1, 0, 0);
        Cancel := True;
      end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      WebBrowser1.Navigate('d:\frame.html');
    end;procedure TForm1.Redirect(var Message: TMessage);
    begin
      (g_pDisp as IWebBrowser2).Navigate2(g_URL, g_Flags, g_TargetFrameName, g_PostData, g_Headers);
    end;end.
      

  2.   

    function StringToVarArray(const S: string): Variant;
    begin
    Result := Unassigned;
    if S <> '' then
    begin
    Result := VarArrayCreate([0, Length(S) - 1], varByte);
    Move(Pointer(S)^, VarArrayLock(Result)^, Length(S));
    VarArrayUnlock(Result);
    end;
    end;