![]() |
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 |
Re: Webbrowser Html-code nach dem Laden vor dem Anzeigen änd
Hi marabu,
irgendwie verstehe ich den Teil nicht, bzw weis nicht wie ich den einsetzen muss ;) Was sind das für Parameter bei der Funktion? Also, auf was mus "doc" zeigen und auf was "s"? Habe im Moment das so gemacht, dass "doc" WebBrowser.Document bekommt und "s" den alten MemoryStream in dem ich die heruntergeladene Datei hatte ... aber irgendwie passt das nicht :D Chris |
Re: Webbrowser Html-code nach dem Laden vor dem Anzeigen änd
Hallo Chris,
versuche mal das HTML-Document, welches du mit LoadDocument() geparst hast und aus dem du bestimmte Teile herausgeworfen hast, zurück in den Stream zu schreiben. Von dort kannst du das reduzierte markup wieder mit LoadDocument in den WebBrowser laden, wo es diesmal gerendert wird. Gute Nacht marabu |
Re: Webbrowser Html-code nach dem Laden vor dem Anzeigen änd
Zitat:
Chris |
Re: Webbrowser Html-code nach dem Laden vor dem Anzeigen änd
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Chris,
reicht nicht schon das Filtern im Ereignis OnDocumentComplete()? Eine Demo für LoadDocument() und SaveDocument() kann ich frühestens am Wochenende erstellen. Gruß marabu |
Re: Webbrowser Html-code nach dem Laden vor dem Anzeigen änd
Wenn ich erst im OnDocumentComplete filtere, lädt er ja erst die komplette Website mit allem drum und dran ... bei der speziellen Website dauert das locker 15 Sekunden, da da einfach sau viel Mist drum rum ist, wie unmassen Banner, ActiveX-Objekte etc ... Wenn ich das halt zuerst filtern könnte, würde ich da einiges an Zeit beim Laden sparen :D
Chris /EDIT: Interessant, scheinbar lädt auch schon das LoadDocument() (also vielmehr das CoHTMLDocument) die ActiveX-Objekte ... Hab trotzdem das Gefühl, dass das Laden und Filtern bei der Methode schneller geht :mrgreen: |
Re: Webbrowser Html-code nach dem Laden vor dem Anzeigen änd
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Chris,
hier ein einfaches Programmbeispiel, in welchem ich einfach alle Bildverweise vor dem Anzeigen aus dem HTML-Dokument entferne. marabu |
Re: Webbrowser Html-code nach dem Laden vor dem Anzeigen änd
Hi marabu,
der Code funzt jetzt, vielen Dank =) Allerdings gibt es da jetzt ein anderes Problem: Alle Adressen innerhalb des HTML-Codes werden jetzt mit "about:blank" eingeleitet, da das ja die erste Adresse war, die TWebBrowser bekommen hat und die nicht geändert wird ... TWebBrowser.LocationURL lässt sich natürlich auch nicht schreiben. Also habe ich im Moment keine funktionierende Links und gar keine Grafiken mehr in der Anzeige :? M$ muss auch immer alles kompliziert machen :roll: Chris |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:36 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