Einzelnen Beitrag anzeigen

marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Webbrowser html code ziehen aber aus richtigem Frame

  Alt 8. Apr 2006, 16:30
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
  Mit Zitat antworten Zitat