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(0, 0) ; (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
hathor hat folgendes geschrieben : |
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?
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:
- 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.
j-a-n@gmx.de - Mo 04.11.13 16:16
habe ich. das hat auch keine "schnittstelle" das dokument "langsam aufzubauen". ausserdem ist es schweinelahm
jaenicke hat folgendes geschrieben : |
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?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!