使用 Delphi 在运行时创建 TWebBrowser

6

我有一个在运行时创建并在后台使用的TWebBrowser对象,也就是说,它不可见。问题是,在Delphi2009中,像OnDocumentComplete这样的事件不起作用或者没有触发。有什么建议吗?

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  FWebBrowser:= TWebBrowser.Create(Self);
  FWebBrowser.RegisterAsBrowser:= True;
  FWebBrowser.OnDocumentComplete:= WhenDocIsCompleted;
end;

procedure TfrmMain.WhenDocIsCompleted(ASender: TObject; const pDisp: IDispatch;
  var URL: OleVariant);
begin
  ShowMessage('Doc is completed!');
end;

有什么重要区别在Navigate和Navigate2之间吗?我如何在这里启用cookies?
提前致谢。

1
这并不是你问题的答案,但如果你不是用TWebBrowser来显示的话,为什么要使用它呢?使用HTTP客户端组件(如Indy的TIdHTTP)或WinInet API获取数据不是更好吗?WinInet API使用与IE相同的设置。请参见https://dev59.com/xXI-5IYBdhLWcg3wf4dD。 - Lars Truijens
1
我使用了TidHTTP和TidCokkieManager,但是cookie问题仍然存在,所以我认为TWebBrowser可能是一个解决方案,但经过测试发现它也有同样的问题。 - Billiardo Aragorn
那么问题是什么呢?是关于cookies还是事件?也许最好将这两个问题分开来讨论。 - Lars Truijens
5个回答

7
TWinControl(FWebBrowser).Parent := Form1;  // Parent property is read-only unless cast

2

请求OnDocumentComplete问题:

WebBrowser1.HandleNeeded;

或者在你的情况下:
FWebBrowser.HandleNeeded;

在调用 webBrowser.Navigate 之前


2

您可能遇到这个问题是因为TWebBrowser在内部与父窗体的句柄紧密配合,以获取从Windows发送的消息。尝试使用带有TWebBrowser的隐藏窗体(也可以在运行时创建),并/或者研究HandleAllocated和HandleNeeded方法是否能帮助您解决问题。


1
procedure TForm1.ReCreateBrowser();
begin
    if(WebBrowser <> NIL) then
    begin
       WebBrowser.Stop;
       WebBrowser.Destroy;
    end;

    WebBrowser        := TWebBrowser.Create(Form1);
    TWinControl(WebBrowser).Name   := 'WebBrowser';
    TWinControl(WebBrowser).Parent := Form1; //set parent...can be panel, tabs etc
    WebBrowser.Silent := true;  //don't show JS errors
    WebBrowser.Visible:= true;  //visible...by default true

    //don't set width/heigh/top/left before TWinControl(WebBrowser).Parent := Form1;
    WebBrowser.Top    := 10;
    WebBrowser.Left   := 10;
    WebBrowser.Height := 600;
    WebBrowser.Width  := 800;
    WebBrowser.OnDocumentComplete  := WebBrowserDocumentComplete;
  //WebBrowser.OnNavigateComplete2 := WebBrowserNavigateComplete2;
end;

1
一个完美地与网页 cookies 协同工作的组件是来自 EmbeddedWB 的 TEmbeddedWB,而且它是免费的。

我很长时间无法访问EmbeddedWB网站。我有源代码,并在Delphi 2010中使用,我还改进了一些部分并修复了一些错误。 - Cesar Romero
请查看Wayback的存档以获取“最新”的下载,因为该网站在2009-04之后停止存在。 - AmigoJack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接