【问题标题】:delphi webbrowser copy text from websitedelphi webbrowser 从网站复制文本
【发布时间】:2023-03-10 02:38:01
【问题描述】:

在我的应用程序中,我想将网站中的所有文本复制到一个字符串变量中。由于 Indy 的一些问题,我想使用 webbrowser 组件。

以下代码非常适合我:

procedure TForm1.Button1Click(Sender: TObject);
begin
  WebBrowser1.Navigate('www.tribalwars.nl');
  while WebBrowser1.Busy do
    Application.ProcessMessages;
  Memo1.Lines.Add((WebBrowser1.Document as IHTMLDocument2).body.innerText);
end;

但是,在上面的示例中,我使用了在 Form1 上手动创建的 WebBrowser。 现在我想在运行时创建它。我尝试了以下代码:

procedure TForm1.Button2Click(Sender: TObject);
var Web: TWebBrowser;
begin
  Web := TWebBrowser.Create(nil);
  Web.Navigate('www.tribalwars.nl');
  while Web.Busy do
    Application.ProcessMessages;
  Memo1.Lines.Add((Web.Document as IHTMLDocument2).body.innerText); //This line raises the error mentioned below
  Web.Free;
end;

不幸的是,它不断引发以下错误:

Project Project1.exe 引发异常类 $C0000005,并带有消息“0x005d9b4f 处的访问冲突:读取地址 0x00000000”。

我想我正在尝试使用尚未创建的东西,或者在那个方向的某个地方。 我希望有人能帮我解决这个问题!

编辑:whosrdaddy 提到我应该让这个组件可见。我怎样才能做到这一点?我试过这个,但它不起作用:

procedure TForm1.Button2Click(Sender: TObject);
var Web: TWebBrowser;
begin
  Web := TWebBrowser.Create(nil);
  Web.Left := 50;
  Web.Top := 50;
  Web.Width := 50;
  Web.Height := 50;
  Web.Visible := True;

  Application.ProcessMessages;
  Web.Navigate('www.tribalwars.nl');
  while Web.Busy do
    Application.ProcessMessages;
  Memo1.Lines.Add((Web.Document as IHTMLDocument2).body.innerText);
  Web.Free;
end;

【问题讨论】:

  • 组件必须是可见的(即所有者表单),否则它不会呈现页面,因此 Document 将为 nil。将浏览器放在一个不可见的窗体上...
  • @whosrdaddy:我怎样才能让它可见? (见编辑开始帖子)
  • 只需在设计模式下使用浏览器创建第二个表单并将表单可见属性设置为 false,然后在运行时创建该表单...
  • 事后看来,我现在看到了您的问题,您的浏览器缺少父级。只需添加 TWinControl(Web).Parent := Self; .Create 之后将解决您的问题...

标签: delphi twebbrowser


【解决方案1】:

问题是当您动态创建 TWebBrowser 并将 NIL 作为所有者传递时,不幸的是父级也是 NIL。显示任何内容都需要非 NIL 父级。

通常你会这样做:

变量 pnlBrowser:TPanel; 网页:TWebBrowser;

Web := TWebBrowser.Create(nil); Web.Parent := pnlBrowser;

但是,不幸的是,您也不能(直接)执行此操作(如果您尝试,则会收到错误消息“只读属性”)。

但幸运的是,有一种方法可以规避这个问题:

TWinControl(Web).Parent := pnlBrowser; // 这工作正常!

我不知道为什么 TWebBrowser 类的父属性是只读的。

阅读 Delphi 文档,也

TControl(Web).Parent := pnlBrowser; // 这也应该有效

附注:

如果您有 TmsMediaPlayer 组件(Microsoft Windows Media Player 的 ActiveX 版本),使用 Delphi 的 Parent 属性设置 parent 将停止任何视频播放,但直接通过 windows API 调用设置则不会。

如果您想使用 TWebBrowser 播放视频,动态更改 Parent 属性也可能会停止任何视频播放。如果是这样,则值得尝试直接使用 Windows API 调用更改父级,以避免停止在 Web 浏览器中播放视频。

【讨论】:

    【解决方案2】:

    1) 尝试将您的TWebBrowser 组件更改为TEmbeddedWB - 参数/事件是相同的 + 很多额外的你可以使用... 2)我认为问题在于您创建的浏览器在导航后的就绪状态 - 它没有完全加载(+也许它没有分配父级)

    尝试使用以下代码(替换您的 TWebBrowser 组件名称):

    Web.Navigate('www.tribalwars.nl')
    

    repeat application.processmessages; until web.readystate=4;

    Memo1.Lines.Add((Web.Document as IHTMLDocument2).body.innerText);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 2018-01-03
      • 2013-10-15
      • 2021-09-02
      相关资源
      最近更新 更多