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