Bug im HTML- Panel PrintPreview

Für Fragen von Einsteigern und Programmieranfängern...
hbr
Beiträge: 321
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Bug im HTML- Panel PrintPreview

Beitrag von hbr »

Hallo Forum,
hat schon jemand den Bug IpHtmlPanel.PrintPreview beseitigt?
Es ist ja z.Z. so, dass wenn mehrer Seiten gedruckt werden sollen,
der letzte Satz einen Absatz bekommt und dieser noch einmal auf der nächsten Seite wiederholt gedruckt wird.

So ist natürlich das ausdrucken von mehreren Seiten nicht möglich.

Eventuell kann ja jemand helfen.

Gruß

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Bug im HTML- Panel PrintPreview

Beitrag von Michl »

Kannst Du dafür ein Minimalbeispiel erstellen?! Ich habe eben das Drucken per Preview probiert und es funktioniert bei mir problemlos - mehrere Seiten, ohne ungewöhnliche Umbrüche (Laz.1.2 32bit unter Win7 64bit).
hbr hat geschrieben:hat schon jemand den Bug IpHtmlPanel.PrintPreview beseitigt?
Gibt es dafür einen Bugeintrag? Wenn ja, dann müsste der Fortschritt dort erkennbar sein. Wenn nein, dann wäre es schön, wenn Du einen erstellst, am besten mit einem Minimalbeispiel. http://wiki.freepascal.org/How_do_I_cre ... _report/de

Könnt mir noch vorstellen, dass die Auflösung Deines Druckers nicht mit dem Preview harmoniert und daher umgebrochen wird.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

hbr
Beiträge: 321
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: Bug im HTML- Panel PrintPreview

Beitrag von hbr »

Hallo Michl,
danke für die Antwort,

Ich weiß natürlich nicht wie Du das getestet hast, aber es ist ein eindeutiger Fehler,
der meistens bei der dritten Seite auftaucht. Wenn man zum Testen keinen eindeutigen Text nimmt,
fällt das auch natürlich nicht auf.
Übrigens als font-size benutze ich 18px, h1= 24px, h2 = 20px.
Body 1.2em. Aber das pasiiert auch wenn ich die Styles- Angabe im header weglasse.

Am Ende der dritten Seite wird der letzte Satz mit einem halben Zeilenumbuch (gemeint ist der Abstand... doch es gibt normal keinen) dargestellt und dieser wird auf der vierten Seite wiederholt.

Das ist natürlich auch in der Preview- Vorschau zu sehen, der jeweilige Satz ist dann oben oder unten nur zur Hälfte sichtbar.
Ich hatte bislang V1.08 und bei V1.2 hat sich nicht geändert.
Doch! !! Bei V1.2 ist die Vorschau im Preview völlig unleserlich.
Fazit die Druckfunktion ist unbrauchbar, eventuell hat ja jemand eine Idee, oder eine Funktionierende Druckausgabe?

Ach so, an der Druckauflösung kann es nicht liegen, ich habe 3 verschieden Drucker ausprobiert,
zuletzt habe ich einen PDF-Drucker verwendet, ist billiger vom Papierverbrauch und Toner oder Tinte.

Der Fehler ist mir bislang auch nicht aufgefallen, da die Druckausgabe bislang meistens nur eine Seite hatte.

Gruß

wp_xyz
Beiträge: 5134
Registriert: Fr 8. Apr 2011, 09:01

Re: Bug im HTML- Panel PrintPreview

Beitrag von wp_xyz »

Um so wichtiger wäre es, dass du hier ein nachvollziehbares Demoprojekt hochlädst.

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Bug im HTML- Panel PrintPreview

Beitrag von Michl »

Habe jetzt mal eine allgemeine Html-Seite geladen und kann dort den Bug nachvollziehen (Siehe Bild - ARM wird auf vorhergehender und nachfolgender Seite dargestellt). Weitere Fehler wären, die Aufzählungspunkte fehlen teilweise und Platz für kursive Schrift wird nicht richtig berechnet.

Evtl. hat jemand Lust/Zeit sich durch den Code zu hangeln und mal nachzuschauen?! Falls nicht, kannst Du dafür ja einen Bugeintrag erstellen (Laz.1.2 und Laz.1.3-Trunc) zeigen bei mir das gleiche Verhalten.

Minimalbeispiel anbei.
Dateianhänge
Minimalbsp.zip
(141.15 KiB) 58-mal heruntergeladen
fehler.jpg

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Bug im HTML- Panel PrintPreview

Beitrag von Michl »

Unter Unit IpHtml, Zeile 17780, die Größe des Druckbereichs verkleinern, schafft Abhilfe für Dein Problem, zumindest funktioniert das bei mir (evtl. als Workaround). Warum, weiss ich noch nicht, muss aber jetzt weg...

Code: Alles auswählen

procedure TIpHtmlInternalPanel.PrintPages(FromPage, ToPage: Integer);
...
      CR := Rect(0, 0, PrintWidth, 0);                                 {!!.10}
      for i := FromPage to ToPage do begin
        CR.Top := (i - 1) * PrintHeight;                               {!!.10}
        CR.Bottom := Cr.Top + PrintHeight - 150;                       {!!.10}  //hier -150 oder so...
 
        Hyper.Render(Printer.Canvas, CR, False, PrintTopLeft);         {!!.10}
...

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

hbr
Beiträge: 321
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: Bug im HTML- Panel PrintPreview

Beitrag von hbr »

Hallo Michl,
wie schön das es Bestätigt wurde, Danke.

Wäre sehr schön, wenn jemand sagen könnte woran das liegt,
dass die Darstellung im Prewiev sich so verschlechtert hat gegenüber der Version 1.0.8.

Für alle die es probieren oder nachvollziehen wollen, hier eine Beispiel.

Gruß
Dateianhänge
HTML-Test.zip
(5.08 MiB) 65-mal heruntergeladen

Soner
Beiträge: 726
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Bug im HTML- Panel PrintPreview

Beitrag von Soner »

Ich habe Mininalbsp.zip von oben genommen, weil untere zu groß für meine mobile Verbindung ist.
Beim Vorschau gibt's diesen Effekt was du beschrieben hast aber beim PDF-Druck (PDFCreator) erscheint alles normal.
Die Beispielseite ist für IPHtmlPanel ist ziemlich kompliziert, diese Komponente ist für einfaches HTML erstellt.
Ich werde mal testen ob das bei einfaches HTML (Tabelle, Texte ohne viel Verschachtelung) auch zutrifft weil ich diese Komponente in mein Programm für einfache Berichte verwenden will.

EDIT:
Beim Ausdruck gibt es den erwähnten Fehler, ich hab's übersehen.
Zuletzt geändert von Soner am Mo 21. Apr 2014, 15:55, insgesamt 1-mal geändert.

Soner
Beiträge: 726
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Bug im HTML- Panel PrintPreview

Beitrag von Soner »

Ja es hat Fehler. Es macht bei fehlerfreien einfachen HTML-Seite sowohl beim Vorschau als beim Druck (PDF-Drucker) Fehler. Wie du beschrieben hast, druckt es letzte Zeile am Anfang nächste Zeile nochmal.
Ich hoffe du kannst den Fehler bis ca. 2 Wochen korregieren ;)

hbr
Beiträge: 321
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: Bug im HTML- Panel PrintPreview

Beitrag von hbr »

Hallo Soner,
ich benutze ja auch nur ganz einfache HTML's, nur das sie halt ziemlich lang sind.
Der Fehler hängt damit zusammen, wenn zuvor h1, h2 verwendet wurde, dann stimmt die Berechnung nicht.
Weis allerdings nicht wo die Berechnung stattfindet.

Aber noch einmal die Frage zur Print- preview- Anzeige,

weiß jemand wo man die Qualität der Anzeige verbessern kann?
Habe versucht in der PaintBox1 des Panels unter Font> Quality andere Werte zu verwenden,
doch dieses bringt keine Veränderung.

Gruß

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Bug im HTML- Panel PrintPreview

Beitrag von Michl »

So, hab mir das Problem mal zu Gemüte geführt. Der Fehler liegt darin, dass die Anzeige (Canvas) für den Bildschirm gleich behandelt wird, wie die vom Drucker. Es wird nicht gezählt, welcher Teil schon gedruckt wurde sondern es wird je Page geprüft, ob sich darzustellende Bereiche mit dieser überschneiden. Wenn ja, dann werden diese gezeichnet. Das ist gut für die Anzeige auf dem Bildschirm, schlecht für den Druck (je nachdem, wohin gescrollt wurde, wird der obere und der untere Teil abgeschnitten dargestellt - beim Drucken ist das genauso, daher doppelte Wörter bei überschneidenden Page-Bereichen).

Eine Lösung für das Problem wäre zu definieren, wann eine Darstellung per Anzeige oder per Druck erfolgt und dementsprechend nur zu zeichnen, wenn der obere Bereich oder der untere Bereich eines Zeichenbereichs komplett sichtbar ist (habe mich für den oberen Bereich entschieden, kann ich/kannst Du aber auch noch ändern). Habe den Patch angefügt (ich definiere einfach mit einer globalen Variable, wenn gedruckt wird - find ich nicht schön, aber ohne die ganzen Klassen zu ändern, war das jetzt das einfachste), damit wäre das doppelte Sätze/Wörter Schreiben, soweit ich testen konnte, erstmal abgehakt.

Viel Erfolg!

PS:
Die Qualität der Preview-Anzeige könntest Du verbessern, indem Du in

Code: Alles auswählen

procedure TIpHtmlNodeBlock.RenderQueue;  
...
          if CurWord.AnsiWord <> NAnchorChar then //JMN
               aCanvas.TextRect(R, P.x, P.y, NoBreakToSpace(CurWord.AnsiWord)); 
...
den Text nicht mit TextRect sondern gerendert übergibst.
Oder Du vergrößerst das Preview-Fenster, damit erhöht sich dessen Qualtität automatisch.
Dateianhänge
iphtml.pas.patch
(1.62 KiB) 66-mal heruntergeladen

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

hbr
Beiträge: 321
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: Bug im HTML- Panel PrintPreview

Beitrag von hbr »

Hallo Michl,
vielen Dank für den Patch und die Mühe.
Michl hat geschrieben:PS:
Die Qualität der Preview-Anzeige könntest Du verbessern, indem Du in

Code: Alles auswählen

procedure TIpHtmlNodeBlock.RenderQueue;  
...den Text nicht mit TextRect sondern gerendert übergibst.
Oder Du vergrößerst das Preview-Fenster, damit erhöht sich dessen Qualtität automatisch.
Das habe ich nicht so ganz verstanden.

Das Fenster vergrößern bringt nicht wirklich etwas,
die Darstellung bleibt unleserlich ( gegenüber V1.0.8 ).

Die Frage ist doch, was hat sich bei Lazarus Version 1.2.0 gegenüber 1.0.8 geändert?

Das IpHtml nicht, den dieses ist in beiden Versionen Identisch.

Denn wenn man mit 1.0.8 compalliert, so ist diePreview-Anzeige viel deutlicher als mit 1.2.0
Wieso ?
Mit 1.0.8 war das noch brauchbarer.

Gruß

hbr
Beiträge: 321
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: Bug im HTML- Panel PrintPreview

Beitrag von hbr »

Nachtrag zum Panel. Bilder sagen mehr als tausend Worte.
108.jpg
Wenn man hier vergrößert kann man es gut erkennen (V1.08)
1.2.0.jpg
Wenn hier vergrößert wird bleibt es unleserlich (V1.2.0).

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Bug im HTML- Panel PrintPreview

Beitrag von Michl »

hbr hat geschrieben:Wenn hier vergrößert wird bleibt es unleserlich (V1.2.0).
Evtl. kann da IpHtml nicht mal was dafür. Die Stelle, an der letztendlich auf das Canvas gezeichnet wird, hatte ich ja oben schon benannt (Unit IpHtml: TIpHtmlNodeBlock.RenderQueue):

Code: Alles auswählen

               aCanvas.TextRect(R, P.x, P.y, NoBreakToSpace(CurWord.AnsiWord));
Da diese eine Procedure/Methode von der Unit Graphics (LCL) aufruft, wäre die Ursache IMHO eher dort zu suchen.
Zuletzt geändert von Michl am Di 22. Apr 2014, 11:37, insgesamt 1-mal geändert.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Bug im HTML- Panel PrintPreview

Beitrag von Michl »

Michl hat geschrieben:Da diese eine Procedure/Methode von der Unit Graphics (LCL) aufruft, wäre die Ursache IMHO eher dort zu suchen.
Es zwar richtig, dass dort auf das Canvas gezeichnet wird, da aber das gecachte Canvas die gleiche Größe vom Drucker hat, wird dieses letztendlich gestretcht auf dem Preview dargestellt. Dort liegt der Hase im Pfeffer:

Fügst Du in Unit IpHtmlPv vor Zeile 245 folgenden Code ein

Code: Alles auswählen

procedure TIpHTMLPreview.Render;
...
        PaintBox1.Canvas.AntialiasingMode:=amOn;            //hier
        PaintBox1.Canvas.StretchDraw(R, Scratch);
...
wird das Preview gut lesbar, aber eben auch langsamer, dargestellt! (Hattest also ursprünglich in die richtige Richtung gedacht...).

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Antworten