Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Webbrowser html code ziehen aber aus richtigem Frame (https://www.delphipraxis.net/67046-webbrowser-html-code-ziehen-aber-aus-richtigem-frame.html)

Andi1982ka 8. Apr 2006 15:06


Webbrowser html code ziehen aber aus richtigem Frame
 
Hallo,

ich benutze folgende Funktion um mir den HTML-Code aus dem TWebBrowser zu ziehen:

Delphi-Quellcode:
function TForm1.WB_GetHTMLCode(WebBrowser: TWebBrowser; ACode: TStrings): Boolean;
var
  ps: IPersistStreamInit;
  ss: TStringStream;
  sa: IStream;
  s: string;
begin
  ps := WebBrowser.Document as IPersistStreamInit;
  s := '';
  ss := TStringStream.Create(s);
  try
    sa := TStreamAdapter.Create(ss, soReference) as IStream;
    Result := Succeeded(ps.Save(sa, True));
    if Result then ACode.Add(ss.Datastring);
  finally
    ss.Free;
  end;
end;
Allerdings habe ich bei seiten mit frames dann nur den Code des Framesets! Kann ich in dieser zeile

Delphi-Quellcode:
ps := WebBrowser.Document as IPersistStreamInit;
nicht irgendwie Sagen dass er den Code des Frames "MAIN" ziehen soll?

Vielen Dank schonmal,

Gruß Andi

marabu 8. Apr 2006 16:30

Re: Webbrowser html code ziehen aber aus richtigem Frame
 
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

Andi1982ka 8. Apr 2006 18:16

Re: Webbrowser html code ziehen aber aus richtigem Frame
 
Hey,

funktioniert wunderbar! Vielen Dank!!!!

Gruß andi

jamma-markus 27. Mai 2006 12:32

Re: Webbrowser html code ziehen aber aus richtigem Frame
 
kann das ganze nicht auch so gehen?
Delphi-Quellcode:
memo2.Lines.Text := (WebBrowser1.Document as IHTMLDocument2).frames.item('MAIN').body.innerHTML;

marabu 27. Mai 2006 12:59

Re: Webbrowser html code ziehen aber aus richtigem Frame
 
Hast du es ausprobiert?

Freundliche Grüße vom marabu

jamma-markus 27. Mai 2006 14:21

Re: Webbrowser html code ziehen aber aus richtigem Frame
 
nein. denn wenn du das ließt, weißt du auch, warum nicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz