Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Webbrowser Html-code nach dem Laden vor dem Anzeigen ändern. (https://www.delphipraxis.net/67094-webbrowser-html-code-nach-dem-laden-vor-dem-anzeigen-aendern.html)

Pichel 9. Apr 2006 15:25


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.

marabu 9. Apr 2006 15:47

Re: Webbrowser Html-code nach dem Laden vor dem Anzeigen änd
 
Hi.

Vielleicht kommst du hiermit zurecht?

Delphi-Quellcode:
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;
Grüße vom marabu

Pichel 9. Apr 2006 17:38

Re: Webbrowser Html-code nach dem Laden vor dem Anzeigen änd
 
Zitat:

Zitat von marabu
Vielleicht kommst du hiermit zurecht?

Yep.. bezüglich der Anzeige ist in dem Fall der marquee jetzt weg... allerdings wenn man sich den quelltext noch anzeigen lässt ist er noch im Quelltext vorhanden.

Irgendwie habe ich aber immer noch das Problem das die App dann nen Moment hängt...

[09.Apr 18:33:02.762] geladen: http://www.irgendwas.de
[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;

marabu 9. Apr 2006 17:55

Re: Webbrowser Html-code nach dem Laden vor dem Anzeigen änd
 
Bei mir werden 20 msec ausgewiesen:

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
      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;
marabu

Alloc 21. Jun 2006 19:33

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

marabu 21. Jun 2006 20:35

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 MSDN Online Library.

Den kompletten Quelltext deines HTML-Dokumentes kannst du auf verschiedene Weisen erhalten. Eine weitere Möglichkeit wäre diese:

Delphi-Quellcode:
ShowMessage(WebBrowser.OleObject.Document.body.parentElement.outerHTML);
Grüße vom marabu

Alloc 22. Jun 2006 15:03

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

marabu 22. Jun 2006 18:21

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: klick

marabu

Alloc 22. Jun 2006 19:17

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

marabu 22. Jun 2006 19:31

Re: Webbrowser Html-code nach dem Laden vor dem Anzeigen änd
 
Hier noch ein Puzzle-Teil:

Delphi-Quellcode:
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;
Wenn du es geschickt einsetzt, dann ist dein Problem gelöst.

marabu

Alloc 22. Jun 2006 20:04

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

marabu 22. Jun 2006 20:51

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

Alloc 22. Jun 2006 21:08

Re: Webbrowser Html-code nach dem Laden vor dem Anzeigen änd
 
Zitat:

Zitat von marabu
Von dort kannst du das reduzierte markup wieder mit LoadDocument in den WebBrowser laden, wo es diesmal gerendert wird.

Genau in dem Teil liegt mein Problem ... WebBrowser.Document ist ReadOnly ... Auf jedenfall bekomm ich da nichts reingeladen ... :cry:

Chris

marabu 23. Jun 2006 12:27

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

Alloc 23. Jun 2006 12:59

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:

marabu 23. Jun 2006 19:09

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

Alloc 23. Jun 2006 23:53

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 12:58 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