Bug?

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
hbr
Beiträge: 285
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?

Beitrag von hbr »

Mallo Michel,
in "winprinters.inc" Zeile 338 > StartDoc(fDC,@Inf);
wird ein Eintrag in die Warteschlange übergeben.

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

Re: Bug?

Beitrag von Michl »

Ich glaube, das bringt so nix.

Wenn man mal die Schritte nachvollzieht, versucht das IPHtmlPanel eine Druckvorschau (mit aktueller Seitenzahl etc.) mit dem aktuell gesetzten Drucker zu erstellen. Das Ganze geschieht in der Procedure TIpHtmlInternalPanel.ResetPrint mittels Printer.BeginDoc. Dort wird zum Schluss der Zugriff auf den Drucker mit Printer.Abort hart getrennt. Vermutlich wird deshalb ein Druckauftrag bei Dir ausgelöst (bei mir ist das auf jeden Fall mit dem XPS Document Writer). Dies ist aber vermutlich nicht die Ursache des Problems, dass der Druckauftrag dann später nicht ausgeführt wird.

Code: Alles auswählen

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

hbr
Beiträge: 285
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?

Beitrag von hbr »

Das kuriose ist ja auch,
das ein Druckauftrag von mehreren Seiten mit nur einer Seite erstellt wird und beim auslösen verschwindet dieser.

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

Re: Bug?

Beitrag von Michl »

Kannst du mal das einfügen?!

Code: Alles auswählen

procedure TIpHtmlInternalPanel.PrintPages(FromPage, ToPage: Integer);
var
  CR : TRect;
  i : Integer;
begin
  Printer.BeginDoc;
  Printer.Canvas.Pen.Color  := 0;
  Printer.Canvas.Font.Name  := 'Arial';
  Printer.Canvas.Font.Size  := 16;
  for i := 1 to 10 do
    Printer.Canvas.TextRect(Rect(200, i*200, 1000, (i+1)*200), 200, i*200, 'Das ist ein Test '+IntToStr(i));
  Printer.EndDoc;
 
{  if (Hyper <> nil) then begin
    BeginPrint;
    Printer.BeginDoc;
    try
      CR := Rect(0, 0, PrintWidth, 0);
      for i := FromPage to ToPage do begin
        CR.Top := (i - 1) * PrintHeight;
        CR.Bottom := Cr.Top + PrintHeight;
        Hyper.Render(Printer.Canvas, CR, False, PrintTopLeft);
        if i < ToPage then
          Printer.NewPage;
        Printed := True;
      end;
    finally
      if Printed then
        Printer.EndDoc
      else
        Printer.Abort;
      EndPrint;
    end;
  end;}

end;

Und sagen, ob der entsprechende Drucker druckt?!

hbr hat geschrieben:Das kuriose ist ja auch,
das ein Druckauftrag von mehreren Seiten mit nur einer Seite erstellt wird und beim auslösen verschwindet dieser.
Nein, das bestätigt meine Aussage von 2 Posts weiter oben.

Code: Alles auswählen

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

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

Re: Bug?

Beitrag von Michl »

OK, noch ein Versuch! Für meinen "XPS Document Writer - Drucker" reicht ein einfaches "Refresh", um den den Druckauftrag durchzuführen. K.A., ob das auch bei dir reicht?!:

Code: Alles auswählen

procedure TIpHtmlInternalPanel.PrintPages(FromPage, ToPage: Integer);
var
  CR : TRect;
  i : Integer;
begin
  if (Hyper <> nil) then begin
    Printer.Refresh//<-- hier
    BeginPrint;
    Printer.BeginDoc;   

Code: Alles auswählen

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

hbr
Beiträge: 285
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?

Beitrag von hbr »

Hall Michl,
Du bist ne Wucht!
Das mit dem Printer.Refresh hat voll funktioniert.

Vielen Vielen Dank für Deine Mühe.

Nun habe ich ein weiteres Problem welches ich nicht lösen kann.

Das PrintPreview eliminiert farbigen Text im Ausdruck ist dann nur Schwarzer Text.
Hast Du hierfür auch eine Lösung parat?

Gruß

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

Re: Bug?

Beitrag von Michl »

hbr hat geschrieben:Das mit dem Printer.Refresh hat voll funktioniert.
Das freut mich! Und ist gut zu wissen. Dann werde ich das demnächst im Bugtracker mal so hochladen.

hbr hat geschrieben:Das PrintPreview eliminiert farbigen Text im Ausdruck ist dann nur Schwarzer Text.
Hast Du hierfür auch eine Lösung parat?
So aus der Kalten, kann ich keine Vermutung abgeben. Ich kann morgen gern mal in den Code schauen, aber keine Ahnung, ob ich dir dann etwas sagen kann bzw. ob das überhaupt implementiert ist.

Code: Alles auswählen

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

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

Re: Bug?

Beitrag von Michl »

Hatte leider erst jetzt Zeit.

hbr hat geschrieben:Das PrintPreview eliminiert farbigen Text im Ausdruck ist dann nur Schwarzer Text.
Hast Du hierfür auch eine Lösung parat?
Bei mir läuft der Test, ob ein Schwarzweißdrucker anliegt bei allen Druckern schief (obwohl dieser unter Windows funktionieren hätte sollen).

Wenn du BWPrinter := False (bei mir die Zeile 13003) in der Procedure TIpHtmlInternalPanel.ResetPrint der Unit IpHtml ersetzt, sollte das mit dem bunten Ausdrucken funktionieren:

Code: Alles auswählen

procedure TIpHtmlInternalPanel.ResetPrint;
...
    GetRelativeAspect(Printer.Canvas.Handle);
    {$IF DEFINED(IP_LAZARUS) AND NOT DEFINED(WINDOWS)}
    // this test looks weird, according to most references consulted, the number
    // of colors in a display is NColors = 1 shl (bitsPerPixel * Planes). A mono
    // printer should have 2 colors, somebody else needs to clarify.
    BWPrinter := false;
    {$ELSE}
    BWPrinter := GetDeviceCaps(Printer.Canvas.Handle, PLANES) = 1//<-- hier einfach auf False setzen
    {$ENDIF}     

Code: Alles auswählen

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

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

Re: Bug?

Beitrag von Michl »

Besser ist es, die Zeile mit

Code: Alles auswählen

    BWPrinter := GetDeviceCaps(Printer.Canvas.Handle, NUMCOLORS) = 2;
zu ersetzen, wobei NUMCOLORS = 24 noch definiert werden muss. Zumindestens funktioniert das bei meinen Druckern.

Code: Alles auswählen

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

hbr
Beiträge: 285
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?

Beitrag von hbr »

Oh Super Danke, jetzt ist es fast perfekt.

Heißt das man muss anstelle NUMCOLORS die 24 einsetzen?
Bei mir steht PLANES, definiert in LCLTYPE- Planes = 14.

Mir ist auch noch aufgefallen, dass man in der Druckerauswahl den Druckbereich gar nicht auswählen kann,
ist das etwa nicht implementiert?

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

Re: Bug?

Beitrag von Michl »

hbr hat geschrieben:Heißt das man muss anstelle NUMCOLORS die 24 einsetzen?
Bei mir steht PLANES, definiert in LCLTYPE- Planes = 14.
NUMCOLORS ist eine Konstante mit einem Wert 24. Benutzt du die Lazarus-Trunc-Version sind beide Probleme behoben (ich hatte entsprechende Patches hochgeladen, die auch recht schnell implementiert wurden). Benutzt du ein Release, müsstest du selber NUMCOLORS irgendwo definieren oder nimmst gleich "24" statt "NUMCOLORS".

hbr hat geschrieben:Mir ist auch noch aufgefallen, dass man in der Druckerauswahl den Druckbereich gar nicht auswählen kann,
ist das etwa nicht implementiert?
K.A., leider habe ich zur Zeit keine Zeit um nachzusehen, was du meinst. Generell steckt in der Druckkomponente schon etwas Arbeit, ausgereift scheint sie mir nicht.

Code: Alles auswählen

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

Antworten