Autor Beitrag
j-a-n@gmx.de
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 84


Delphi 7
BeitragVerfasst: Sa 02.11.13 13:14 
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:

ausblenden 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
ausblenden 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.

_________________
--
Dieses Werk ist unter einer Creative Commons 3.0 Lizenz lizenziert und darf unter Namensnennung kopiert, weitergegeben, veröffentlicht und verändert werden.
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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!


Zuletzt bearbeitet von hathor am Sa 02.11.13 13:45, insgesamt 1-mal bearbeitet
j-a-n@gmx.de Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 84


Delphi 7
BeitragVerfasst: 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?

_________________
--
Dieses Werk ist unter einer Creative Commons 3.0 Lizenz lizenziert und darf unter Namensnennung kopiert, weitergegeben, veröffentlicht und verändert werden.
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 02.11.13 14:01 
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19313
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 84


Delphi 7
BeitragVerfasst: Mo 04.11.13 16:16 
user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:
Schau Dir das mal an:
github.com/BerndGabr...r/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?

_________________
--
Dieses Werk ist unter einer Creative Commons 3.0 Lizenz lizenziert und darf unter Namensnennung kopiert, weitergegeben, veröffentlicht und verändert werden.