delphi webbrowser copy text from website

2

In my application I want to copy all the text from a website into a string variable. Because of some issues with Indy, I want to use the webbrowser component.

The following code works perfectly for me:

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;

However, in the example above I use a WebBrowser that has been manually created on my Form1. Now I want to create it during runtime. I tried the following code:

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;

Unfortunately it keeps raising the following error:

Project Project1.exe raised exception class $C0000005 with message 'access violation at 0x005d9b4f: read of address 0x00000000'.

I guess I'm trying to use something that hasn't been created yet, or somewhere in that direction. I hope someone can help me get this to work!

EDIT: whosrdaddy mentioned that I should make this component visible. How can I do that? I tried this, but it doesn't work:

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;
delphi
twebbrowser
asked on Stack Overflow Feb 29, 2016 by Teun • edited Feb 29, 2016 by Teun

2 Answers

0

The problem is that when you create TWebBrowser dynamically and pass NIL as the owner, unfortunately the parent is also NIL. a non -NIL parent is needed to display anything.

Normally you would do this:

var pnlBrowser : TPanel; Web : TWebBrowser;

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

BUT, unfortunately, you cannot (directly) do this either (you get an error message "read-only property" if you try).

But luckily, there IS a way to circumvent the problem:

TWinControl(Web).Parent := pnlBrowser; // this works OK!

I have no idea WHY the parent property of the TWebBrowser class is read-only.

Reading the Delphi documentation, also

TControl(Web).Parent := pnlBrowser; // this should also work

as a side note:

If you have TmsMediaPlayer component (the ActiveX version of Microsoft Windows Media Player), setting parent using the Delphi's Parent property will stop any video playing, but setting it directly through a windows API call does not.

IF you want to use your TWebBrowser to play videos, changing the Parent property on the fly may also stop any video playing. If so it is worth trying to change the parent using windows API call directly instead to avoid stopping a video playing in the web browser.

answered on Stack Overflow Nov 25, 2018 by AHiismak
-1

1) try to change Your TWebBrowser component to TEmbeddedWB - the parameters/events are the same + lots of extras You can use... 2) I think the problem is with the readystate of your created browser after navigation - its not loaded completely (+maybe it has not assigned parent)

try use the following code (replace Your TWebBrowser component name):

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

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

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

answered on Stack Overflow May 30, 2016 by IanF

User contributions licensed under CC BY-SA 3.0