delphi webbrowser从网站复制文本

时间:2016-02-29 19:35:38

标签: delphi twebbrowser

在我的应用程序中,我想将网站中的所有文本复制到字符串变量中。由于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;

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

项目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;

2 个答案:

答案 0 :(得分:0)

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

通常,您会这样做:

var   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属性设置父项将停止任何视频播放,但是直接通过Windows API调用进行设置则不会。

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

答案 1 :(得分:-1)

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

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

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

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

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