Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:26 Uhr.
Seite 1 von 2  1 2      

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