![]() |
Webbrowser Html-code nach dem Laden vor dem Anzeigen ändern.
Hi.
Habe zwar schon viel gesucht aber leider keine schlüssige Lösung gefunden. Ich möchte gerne eine Seite in den Webbrowser laden (klar per .navigate) und bevor der Webbrowser diese anzeigt den Quelltext verändern, vermutlich muß dies im onDocumentComplete erfolgen aber ganz sicher bin ich mir da auch nicht. Konkret soll also <marquee scrollamount="4">......</marquee> entfernt und gar nicht ausgeführt werden. Dieser Tag bremst die ganz App irgendwie aus denn wenn die Seite geladen ist, steht alles für ca 800ms bis die Laufschrift anfängt zu laufen.... Danke für Eure Hilfe. |
Re: Webbrowser Html-code nach dem Laden vor dem Anzeigen änd
Hi.
Vielleicht kommst du hiermit zurecht?
Delphi-Quellcode:
Grüße vom marabu
procedure DropElement(doc: IHTMLDocument3; tagName: String);
var i: Integer; ec: IHTMLElementCollection; e: IHTMLElement; begin ec := doc.getElementsByTagName(tagName); for i := Pred(ec.Length) downto 0 do begin e := ec.item(i, 0) as IHTMLElement; e.outerHTML := ''; end; end; procedure TDemoForm.WebBrowserDocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant); var wb: IWebBrowser; begin if Succeeded(pDisp.QueryInterface(IID_IWebBrowser, wb)) then DropElement(wb.Document as IHTMLDocument3, 'marquee'); end; |
Re: Webbrowser Html-code nach dem Laden vor dem Anzeigen änd
Zitat:
Irgendwie habe ich aber immer noch das Problem das die App dann nen Moment hängt... [09.Apr 18:33:02.762] geladen: ![]() [09.Apr 18:33:05.115] DoPage GetHtmlCode [09.Apr 18:33:06.868] DoPage CheckNewMsg und dann läuft es wieder flüssig OnDocumentComplete wird um 18:33:02.762 geschrieben. um 18:33:05.115 wird GetHTMLCode begonnen und ist erst um 18:33:06.868 fertig. Dauert das wirklich immer 1,5sek? Der folgende Code braucht 1,5Sek??? Any hint..
Delphi-Quellcode:
function myGetHTMLCode(WebBrowser: TWebBrowser; ACode: TStrings): Boolean;
var ps : IPersistStreamInit; ss : TStringStream; sa : IStream; s : string; begin Result := False; if not Assigned(WebBrowser.Document) then Exit; 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 begin ACode.Clear; ACode.Add(ss.Datastring); end; finally ss.Free; end; end; |
Re: Webbrowser Html-code nach dem Laden vor dem Anzeigen änd
Bei mir werden 20 msec ausgewiesen:
Delphi-Quellcode:
marabu
function myGetHTMLCode(WebBrowser: TWebBrowser; ACode: TStrings): Boolean;
var ps : IPersistStreamInit; ss : TStringStream; sa : IStream; s : string; begin Result := False; if not Assigned(WebBrowser.Document) then Exit; 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 with ACode do begin BeginUpdate; Text := ss.Datastring; EndUpdate; end; finally ss.Free; end; end; procedure TDemoForm.tbnExtractClick(Sender: TObject); var s: TStrings; tc: Cardinal; begin s := TStringList.Create; tc := GetTickCount; myGetHtmlCode(WebBrowser, s); tc := GetTickCount - tc; s.Free; ShowMessage(Format('%.0n', [1.0 * tc])); end; procedure TDemoForm.tbnLoadClick(Sender: TObject); begin with WebBrowser do Navigate('http://de.wikipedia.org'); end; |
Re: Webbrowser Html-code nach dem Laden vor dem Anzeigen änd
Hi,
ich habe zur Zeit das gleich Ziel, nämlich den HTML-Code vor dem anzeigen zu verändern. Allerdings kennt Delphi bei mir die IHTML*-Typen nicht. Auch in der OH stehen diese nicht drin. Kann mir einer sagen, aus welchen Units die kommen? Außerdem würde mich mal interessieren, welche Objekte sich unterhalb von TWebBrowser.OleObject.Document befinden. Bis jetzt habe ich nämlich zB noch nicht die Möglichkeit gefunden, den kompletten HTML-Code (inkl head) zu bekommen oder auch nur head. Gibt es da Möglichkeiten, die Objekte irgendwie alle auszulesen oder gibt es irgendwo fertige Listen? Gruß, Chris |
Re: Webbrowser Html-code nach dem Laden vor dem Anzeigen änd
Hallo Chris,
die HTML-Interfaces findest du in der Unit MSHTML. Da es sich dabei nur um einen Wrapper für die MSHTML type library handelt, wirst du in der Delphi OH nicht fündig. Du musst im MS Windows Platform SDK und dort im Kapitel MSHTML Reference nachlesen oder in der ![]() Den kompletten Quelltext deines HTML-Dokumentes kannst du auf verschiedene Weisen erhalten. Eine weitere Möglichkeit wäre diese:
Delphi-Quellcode:
Grüße vom marabu
ShowMessage(WebBrowser.OleObject.Document.body.parentElement.outerHTML);
|
Re: Webbrowser Html-code nach dem Laden vor dem Anzeigen änd
Jo, danke, das hat geholfen =)
Aber da kommt jetzt noch eine Frage auf: Bei der Methode wird ja erst gewartet, bis die komplette Seite inklusive aller Objekte (Grafiken, Sounds, Embedded Flash etc) geladen sind und erst danach wird der unnötige HTML-Code rausgeschmissen. Gibt es eine Möglichkeit, erst quasi nur den HTML-Code zu laden und zu filtern, so dass dann nur noch die Objekte geladen werden, die dann auch noch angezeigt werden? Gruß, Chris |
Re: Webbrowser Html-code nach dem Laden vor dem Anzeigen änd
Natürlich geht das. Du musst zuerst das HTML-Dokument laden ohne es zu rendern. Dann verfütterst du es an den HTML Parser und entfernst unerwünschte Teile. Das abgespeckte Dokument lässt du anschließend vom Browser rendern. Code zum Ausschlachten findest du beispielsweise hier:
![]() marabu |
Re: Webbrowser Html-code nach dem Laden vor dem Anzeigen änd
Ich glaub den Code da hab ich prinzipiell verstanden ... nur: Wie übergebe ich das Ergebnis des ganzen dem TWebBrowser? (also, dass IHTMLDocument2?)
Alloc |
Re: Webbrowser Html-code nach dem Laden vor dem Anzeigen änd
Hier noch ein Puzzle-Teil:
Delphi-Quellcode:
Wenn du es geschickt einsetzt, dann ist dein Problem gelöst.
function SaveDocument(doc: IDispatch; const s: TStream): Boolean;
var ps: IPersistStreamInit; sa: IStream; begin if Succeeded(doc.QueryInterface(IPersistStreamInit, ps)) then begin sa := TStreamAdapter.Create(s, soReference) as IStream; Result := Succeeded(ps.Save(sa, true)); end; end; marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz