2016-02-29 68 views
2

在我的应用程序中,我想将网站中的所有文本复制到字符串变量中。由于Indy的一些问题,我想使用webbrowser组件。delphi 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上手动创建一个web浏览器。 现在我想在运行时创建它。我尝试下面的代码:

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引发的异常类$ 0000005与消息“访问冲突在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

的组件提供所需的可见的(即,拥有者的形式)或其他它不会呈现页面,因此文件将是零。把浏览器放在一个看不见的形式... – whosrdaddy

+0

@whosrdaddy:我怎样才能看到它? (请参阅编辑开始帖子) – Teun

+0

只需在设计模式下使用浏览器创建第二个表单,并将表单可见属性设置为false,然后在运行时创建该表单... – whosrdaddy

回答

-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);