TPrinter Papierformat einstell

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
hbanko
Beiträge: 13
Registriert: Do 2. Mai 2013, 09:06

TPrinter Papierformat einstell

Beitrag von hbanko »

Hallo zusammen,

ich bin dabei ein kleines Programm zu schreiben, das Scheck Formulare bedruckt. Das Papierformat ist nicht standard (also C6 oder so).

Was ich bereits kenne ist bekannte Formate einzustellen:

Printer.PaperSize.PaperName:='A4';

Aber in meinem Fall muesste ich Breite und Hoehe in Millimeter eingeben koennen.

Wie mache ich das? Oder sollte ich lieber Lazreport zum Drucken benutzen, stat TPrinter?

Gruss
Holger

grl
Beiträge: 36
Registriert: Fr 17. Okt 2008, 19:24
OS, Lazarus, FPC: Debian X64, Lazarus 1.1, FPC 2.7.1
CPU-Target: x86, ARM

Re: TPrinter Papierformat einstell

Beitrag von grl »

Was willst du mit welchem Compiler-Release, mit welcher Lazarus-Release unter welchem Betriebssystem drucken? Vielleicht lässt sich dir dann ein Tip geben?

Luggi

RugiaArt
Beiträge: 41
Registriert: Do 11. Okt 2012, 18:50
OS, Lazarus, FPC: Win7 (L 1.0.0.2 FPC 2.6.0)
CPU-Target: 32Bit
Wohnort: Rügen
Kontaktdaten:

Re: TPrinter Papierformat einstell

Beitrag von RugiaArt »

hi!

zuerst berechnest du DPI in milimeter um und dann kannst du in milimeter dein druckbereich definieren:

Code: Alles auswählen

 
 
function getPixel_X(_mm:integer):longint;//gibt die pixel aus mm abhaengig vom drucker X
begin
  result := Round(_mm * (round(Printer.XDPI / 25.4)));
end; 
 
 
function getPixel_Y(_mm:integer):longint;//gibt die pixel aus mm abhaengig vom drucker Y
begin
  result := Round(_mm * (round(Printer.YDPI / 25.4)));
end; 
 
procedure Druck();
var XMM, YMM, breite_c6, hoehe_c6:integer;
begin
  // 25.4 mm = 1 inch
  XMM := round(Printer.XDPI / 25.4);
  YMM := round(Printer.YDPI / 25.4);
 
  breite_c6 := 114; //mm 
  hoehe_c6 := 162; //mm
 
 
  grenze_links_px := Round(0 * XMM);
  grenze_rechts_px := Round(breite_c6_mm * XMM);
  grenze_oben_px := Round(0 * YMM);
  grenze_unten_px := Round(hoehe_c6 * YMM);
 
  printer.begindoc;
  Printer.Canvas.Line(0,0,grenze_rechts_px,0); // zeichnet eine linie zwischen oben links und oben rechts ecke
  //usw...
  printer.enddoc;
end;  
 
 
du bestimmst also dein druckbereich und definierst die grenzen laut C6 Format. welches Papier dann im Drucker liegt ist egal, es wird aus der oberen linken ecke aus berechnet..

lg RugiaArt

hbanko
Beiträge: 13
Registriert: Do 2. Mai 2013, 09:06

Re: TPrinter Papierformat einstell

Beitrag von hbanko »

Vielen Dank RugiaArt!

Das habe ich direkt mal ausprobiert. So kann ich wunderbar den bedruckbaren Bereich definieren und habe mir ein Rechteck mit den exakten Massen aufs Papier bringen koennen.

Koennte in der Tat die Loesung sein. Nachteil ist, wenn ich ein Formular in den Drucker einlege (z.B. C6 ~ Briefumschlag), dann zentriere ich es am Einzeleinzug des Druckers. Drucke ich jetzt in A4, landed nur ein Bruchteil des Rechtecks auf dem Formular. Wuerde ich das Papierformat wirklich aendern, vermute ich wuerde das klappen.

Die Loesung waere halt, das Rechteck entsprechend zur Mitte zu verschieben (X Zentrierung). Hast du Erfahrungen ob das immer klappen wuerde? Unabhaengig von Drucker und Betriebssystem?

Und zum ersten Reply: Ich arbeite/entwickle unter OpenSuSe 12.2 x86_64 - spaeter soll das aber unter Windows laufen. Lazarus Version 1.1 und FPC 2.6.

In meiner Wahlheimat Malaysia (Kuala Lumpur) wird noch viel mit Schecks gearbeitet. Und es nervt total die Dinger mit der Hand auszufuellen. Ausserdem den Betrag in Worten hinschreiben, gelingt manchmal nicht fehlerfrei. Die Bank weist dann solche Schecks ab und es gibt Aerger. Also das ist mein kleines Projekt - Eine Scheck-Writer Software. Den Betrag in Worten umzuwandeln habe ich schon geloest, ich brauch nur noch Drucken :D

RugiaArt
Beiträge: 41
Registriert: Do 11. Okt 2012, 18:50
OS, Lazarus, FPC: Win7 (L 1.0.0.2 FPC 2.6.0)
CPU-Target: 32Bit
Wohnort: Rügen
Kontaktdaten:

Re: TPrinter Papierformat einstell

Beitrag von RugiaArt »

hbanko hat geschrieben: Die Loesung waere halt, das Rechteck entsprechend zur Mitte zu verschieben (X Zentrierung). Hast du Erfahrungen ob das immer klappen wuerde? Unabhaengig von Drucker und Betriebssystem?
-> also das mit dem TPrinter ist eigentlich bereits Platform und Druckerunabhängig :)


Die Lösung für die Sache mit dem Zentrieren ist eigentlich einfach.
Es gibt Printer.PageWidth und das gibt immer abhängig vom Drucker die Seitenbreite in Pixel aus,
du rechnest die

(DruckerSeitenBreite / 2 - breite_C6_px) ... so kriegst du dein blatt zentriert, .. weisst wie ich mein?

Antworten