Hallo Andi,
solange keine Frames im Spiel sind, ist dein Ansatz tragbar. Bei Frames ist der WebBrowser nur noch der Lieferant des Manteldokuments und dieses muss auf seine Frames hin untersucht werden. Jeder Frame hat ein zugehöriges Window und dieses liefert dir dann das Document. Natürlich könntest du die eine Zeile durch ein Code-Ungetüm ersetzen, aber mir gefällt es besser, wenn die Gesamtfunktionalität in kleinere Blöcke zerlegt wird, die man auch unabhängig voneinander verwenden kann.
Ich verwende GetFrameDoc() um auf einen bestimmten Frame eines FrameSet zuzugreifen:
Delphi-Quellcode:
function GetFrameDoc(doc: IHTMLDocument2; v: OleVariant): IHTMLDocument2;
var
win: IHTMLWindow2;
u: IUnknown;
ec: IHTMLElementCollection;
begin
u := doc.frames.item(v);
if Assigned(u)
and Succeeded(u.QueryInterface(IHTMLWindow2, win))
then Result := win.Document
else Result :=
nil;
end;
Den
HTML-Code des so ermittelten Document besorge ich mir dann mit DocToStrings():
Delphi-Quellcode:
function DocToStrings(doc: IDispatch; s: TStrings): Boolean;
var
ps: IPersistStreamInit;
sa: IStream;
ms: TStream;
begin
if Succeeded(doc.QueryInterface(IPersistStreamInit, ps)) then
begin
ms := TMemoryStream.Create;
sa := TStreamAdapter.Create(ms, soReference) as IStream;
Result := Succeeded(ps.Save(sa, true));
ms.Position := 0;
s.LoadFromStream(ms);
ms.Free;
end;
end;
Und aufgerufen wird das Ganze dann etwa so:
Delphi-Quellcode:
procedure TDemoForm.ExtractButtonClick(Sender: TObject);
var
doc: IHTMLDocument2;
s: TStrings;
begin
doc := GetFrameDoc(WebBrowser.Document as IHTMLDocument2, 'MAIN');
if Assigned(doc) then
begin
s := TStringList.Create;
if DocToStrings(doc, s)
then ShowMessage(s.Text)
else ShowMessage('Rats!');
s.Free;
end;
end;
Grüße vom marabu