Ich bin gerade am Testen mit Lazarus 2.3.0 (Trunc von gestern Abend)...
Ich habe Label-Printer mit Endlospapier. Und das Printer Objekt, was wiederum Windows im Hintergrund nutzen muss.
Drucker 1: Brother QL-570 (Thermopapier)
Drucker 2: Brother PT2420PC (PVC Klebestreifen)
Mit Lazarus V2.0.12 hat Drucker 2 noch nicht funktioniert, das hat mich sehr gefreut dass dies nun mit V2.3.0 nun doch geht, habt ihr gut gemacht ☺.
Nun leider passt bei diesen Druckern überhaupt nichts zur Windows Spezifikation. Beide Drucker, obwohl vom gleichen Hersteller, nutzen andere Maßsysteme, solche die nicht von Microsoft deklariert wurden.
Parameter:
dmPaperLength Windows sagt es sollen 1/10mm sein
dmPaperLength Drucker 1 muss man in Pixel angeben, und noch die Printer.PaperSize.PaperRect.WorkRect.Top dazu addieren
dmPaperLength Drucker 2 ist das auch nicht richtig, da wird nur 1/3 vom Etikett gedruckt.
Gibt es eine Möglichkeit wie ich vom Drucker die Skalierung auslesen kann, so dass ich automatisiert die korrekte dmPaperLength errechnen/setzen kann?
Also "Printer.YDPI" ist nicht die Skalierung die am Parameter dmPaperLength erwartet wird, das ist nur die Umrechnung um von Pixel auf Inch im Canvas zu kommen, also wieder was anderes.
Bei Thermoetiketten ist ja das Papier immer unterschiedlich lang (ähnlich wie bei jeder Kasse beim Einkaufen, die drucken ja auch nur so lange wie man Waren kauft und nicht pauschal 100cm).
Hier die Doku von Microsoft:
https://docs.microsoft.com/en-us/window ... i-devmodea
Hier mein Code:
Code: Alles auswählen
Procedure SetPaper(iLenghtPixel: Integer = 0);
Begin
Printer.Orientation := poPortrait; // Hochformat
Printer.Canvas.Pen.Color := clBlack;
Printer.Canvas.Brush.Color := clWhite;
Printer.Canvas.Font.Color := clBlack;
Printer.Canvas.Font.Name := 'Thoma';
If iLenghtPixel > 0 Then
Begin
TWinPrinter(Printer).Handle := 0;
PDev := TPrinterDevice(Printer.Printers.Objects[Printer.PrinterIndex]);
PDev.DevModeW^.dmPaperLength := iLenghtPixel;
PDev.DevModeW^.dmPaperSize := 256; // = DMPAPER_USER;
PDev.DevModeW^.dmCopies := 1;
PDev.DevModeW^.dmFields := PDev.DevModeW^.dmFields or $106; // = DM_PAPERLENGTH 4 | DM_PAPERSIZE 2 | DM_COPIES 0x100;
End;
end;
Druck Beispiel: Links "Drucker 1" / Rechts "Drucker 2", Log:
Printer: Brother QL-570 DPI X 300 Y 300 PaperLen 17,2 mm
Printer: Brother PT-2420PC DPI X 180 Y 180 PaperLen 19,9 mm
Obwohl die Funktion ein größeres "PaperLen" ausrechnet (weil der Code ist auch etwas breiter) wird dennoch nicht alles gedruckt, bzw. Abgeschnitten.
Wenn ich bei "Drucker 2" die Länge *2 setze, dann ist der ganze 2D Code drauf. Als ob da noch irgend ein Offset Wert fehlt, von ca. 15mm.
Dankeschön für die Hilfe
Viele Grüße Markus