Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - TWebBrowser als HTML - Viewer


j-a-n@gmx.de - Sa 02.11.13 13:14
Titel: TWebBrowser als HTML - Viewer
Guten Morgen,

ich benutze die WebBrowser-Komponente jetzt schon mehrfach als HTML Viewer um diverse Reports anzuzeigen und diese zu formatieren. Das funktioniert gut mit den bekannten Code-Snipplets:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure clear() ;
var
   sl: TStringList;
   ms: TMemoryStream;
begin
   if assigned(htmlcache) then freeandnil(htmlcache);
   htmlcache := TStringList.Create();

   WebBrowser.Navigate('about:blank') ;
   while WebBrowser.ReadyState < READYSTATE_INTERACTIVE do Application.ProcessMessages;

   if not Assigned(WebBrowser.Document) then raise Exception.Create('no html document');
end;

und

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
procedure print(text: string);
var
   ms: TMemoryStream;
begin
   if not assigned(htmlcache) then begin
       clear();
   end;

   if not Assigned(WebBrowser.Document) then begin
      clear();
      if not Assigned(WebBrowser.Document) then raise Exception.Create('no html document');
   end;

   htmlcache.add(text);   

   ms := TMemoryStream.Create;
   try
     htmlcache.SaveToStream(ms) ;
     ms.Seek(00) ;
     (WebBrowser.Document as IPersistStreamInit).Load(TStreamAdapter.Create(ms)) ;
   finally
     ms.Free;
   end;

   Application.ProcessMessages;
   WebBrowser.OleObject.Document.ParentWindow.ScrollTo(0,MaxInt);
   Application.ProcessMessages;
end;


Mein Problem bei meinem neuen Projekt ist jetzt, dass die Erstellung es HTML-Codes lange dauert, ca. 4 minuten. Währenddessen ist der Webbrowser nicht benutzbar, also scrollt wild hin und her, zeigt wild teile der Seite oder auch mal gar nichts an, etc. Das sieht natürlich nicht schön aus. Und den Benutzer vor einer Processbar und einem weissen Browser warten zu lassen finde ich auch nicht so prickelnd.

habt ihr eine idee, wie ich das schöner lösen kann? so dass das das dokument, wie eine lahme webseite kontinuierlich geladen und dargestellt wird? ich hab schon versucht, die streams zwischenzuspeichern und wiederzuverwenden, aber kriege entweder kauderwelsch oder nur unvollständige seiten.


Delete - Sa 02.11.13 13:38

Mal was Prinzipielles:
Häufiger Gebrauch von "Application.ProcessMessages;" bremst das ganze System aus.

Nützlich ist der SPARSAME Gebrauch nur an der RICHTIGEN Stelle in Schleifen.

Andernfalls wird immer wieder der CPU-Cache gelöscht - das ist Blödsinn!

"while WebBrowser.ReadyState < READYSTATE_INTERACTIVE do Application.ProcessMessages;" ist der Super-GAU!


j-a-n@gmx.de - Sa 02.11.13 13:41

user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:
Mal was Prinzipielles:
Häufiger Gebrauch von "Application.ProcessMessages;" bremst das ganze System aus.

Nützlich ist das nur an der RICHTIGEN Stelle in Schleifen.


danke für die info. klar rufe ich print häufig und in schleifen auf. was ist denn die bessere alternative, damit die oberfläche "bedienbar" bleibt?


Delete - Sa 02.11.13 14:01

Schau Dir das mal an:
https://github.com/BerndGabriel/HtmlViewer/archive/master.zip


jaenicke - Sa 02.11.13 17:52

Egal welcher Viewer, wenn das Dokument so lange dauert bis es fertig ist, kann man es stückchenweise einfügen. Sinnvoll ist dafür:


j-a-n@gmx.de - Mo 04.11.13 16:16

user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:
Schau Dir das mal an:
https://github.com/BerndGabriel/HtmlViewer/archive/master.zip


habe ich. das hat auch keine "schnittstelle" das dokument "langsam aufzubauen". ausserdem ist es schweinelahm



user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Egal welcher Viewer, wenn das Dokument so lange dauert bis es fertig ist, kann man es stückchenweise einfügen. Sinnvoll ist dafür:
  • Die Erzeugung passiert im Thread und die weiteren Teile werden an den Hauptthread übergeben.
  • Das HTML-Dokument ist an sich komplett und es werden dann Teile an einer bestimmten Stelle nachgereicht.
  • Die Größe der Elemente sollte wenn möglich vordefiniert sein, damit die Größen nicht durch Änderungen der Seite beim weiteren Laden angepasst werden.


genau das möchte ich. ich krieg es aber nicht hin. hast du mir ein beispiel?