| Autor |
Beitrag |
MisterBum
      
Beiträge: 107
|
Verfasst: Di 05.04.05 14:48
Hallo,
ich bin ein Programm am erstellen, was Daten ausdrucken soll an BESTIMMTEN stellen (Überweisungsformular). Doch leider erfolgt der Ausdruck auf unterschiedlichen Druckern auch an unterschiedlichen Stellen. Wie kann ich da vorgehen, das es Druckerunabhängig an der selben Position gedruckt wird?
Hier der akt. Code:
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: 29:
| procedure TFormMain.SpeedButton7Click(Sender: TObject); var printer: TPrinter; begin try if PrintDialog1.Execute then begin printer := TPrinter.Create; Printer.Canvas.Font := LabeledEdit1.Font; Printer.Canvas.Font.Height := 10; Printer.BeginDoc;
Printer.Canvas.TextOut(300, 250, LabeledEdit1.Text); Printer.Canvas.TextOut(300, 350, LabeledEdit2.Text); Printer.Canvas.TextOut(300, 440, LabeledEdit3.Text); Printer.Canvas.TextOut(1200, 550, LabeledEdit4.Text); Printer.Canvas.TextOut(300, 650, LabeledEdit5.Text); Printer.Canvas.TextOut(300, 740, LabeledEdit6.Text); Printer.Canvas.TextOut(300, 830, LabeledEdit7.Text); Printer.Canvas.TextOut(1500, 360, LabeledEdit8.Text); Printer.Canvas.TextOut(300, 950, LabeledEdit9.Text); Printer.Canvas.TextOut(930, 1130, JvDatePickerEdit3.Text); Printer.EndDoc; Printer.free; end; except MessageDlg('Fehler beim Drucken!', mtError, [mbOK], 0); end; end; |
Moderiert von raziel: Code- durch Delphi-Tags ersetzt.
|
|
Pierre
      
Beiträge: 138
Win 98se und XP prof
D5Pers und D7Prof
|
Verfasst: Di 05.04.05 19:07
Hallo,
mit Printer.PageWidth bekommst Du die Auflösungsbreite und mit Printer.PageHeight die Auflösungshöhe des ausgewählten Druckers für das Papierformat.
Mit folgenden Zeilen änders Du die Auflösung des "Druckers" zwischen Punkten und mm:
Delphi-Quelltext 1: 2:
| SetMapMode(printer.canvas.Handle,MM_ANISOTROPIC); SetMapMode(printer.canvas.Handle,MM_LOMETRIC); |
D.h., Du kannst (glaube ich) bis auf ein 1/10mm genau drucken. Dabei kannst Du aber interpolieren, damit maximal nur ein halben 1/10mm danebenliegst.
Also statt der Positionsangaben (300) gibst Du Positionsangaben
mit einem Korrekturfaktor der o.g. Auflösungen im Verhältnis zu den "echten Millimeterangaben" Deiner Seite(!) an (300+x) mit z.B. x:=trunc(Printer.PageWidth/210).
Ich hoffe, es hilft.
Gruß Pierre
Moderiert von raziel: Delphi-Tags hinzugefügt.
|
|
MisterBum 
      
Beiträge: 107
|
Verfasst: Mi 06.04.05 09:13
Vielen Dank für deine Anwort, aber sorry, ich versteh das nicht ganz.
Ich habe deinen Vorschlag mal wie folgt eingebunden, aber er druck noch an den "fast" selben Positionen:
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: 29: 30: 31: 32:
| procedure TFormMain.SpeedButton7Click(Sender: TObject); var printer: TPrinter; begin try if PrintDialog1.Execute then begin printer := TPrinter.Create;
Printer.Canvas.Font := LabeledEdit1.Font; Printer.Canvas.Font.Height := 10; Printer.BeginDoc;
Printer.Canvas.TextOut(300 + trunc(Printer.PageWidth / 210), 250 + trunc(Printer.PageHeight / 210), LabeledEdit1.Text); Printer.Canvas.TextOut(300 + trunc(Printer.PageWidth / 210), 350 + trunc(Printer.PageHeight / 210), LabeledEdit2.Text); Printer.Canvas.TextOut(300 + trunc(Printer.PageWidth / 210), 440 + trunc(Printer.PageHeight / 210), LabeledEdit3.Text); Printer.Canvas.TextOut(1200 + trunc(Printer.PageWidth / 210), 550 + trunc(Printer.PageHeight / 210), LabeledEdit4.Text); Printer.Canvas.TextOut(300 + trunc(Printer.PageWidth / 210), 650 + trunc(Printer.PageHeight / 210), LabeledEdit5.Text); Printer.Canvas.TextOut(300 + trunc(Printer.PageWidth / 210), 740 + trunc(Printer.PageHeight / 210), LabeledEdit6.Text); Printer.Canvas.TextOut(300 + trunc(Printer.PageWidth / 210), 830 + trunc(Printer.PageHeight / 210), LabeledEdit7.Text); Printer.Canvas.TextOut(1500 + trunc(Printer.PageWidth / 210), 360 + trunc(Printer.PageHeight / 210), LabeledEdit8.Text); Printer.Canvas.TextOut(300 + trunc(Printer.PageWidth / 210), 950 + trunc(Printer.PageHeight / 210), LabeledEdit9.Text); Printer.Canvas.TextOut(930 + trunc(Printer.PageWidth / 210), 1130 + trunc(Printer.PageHeight / 210), JvDatePickerEdit3.Text); Printer.EndDoc; Printer.free; end; except MessageDlg('Fehler beim Drucken!', mtError, [mbOK], 0); end; end; |
Wie genau bist du auf die 210 gekommen?
Vielen Dank für deine Hilfe...
Gruß MisterBum
Moderiert von raziel: Code- durch Delphi-Tags ersetzt.
|
|
Pierre
      
Beiträge: 138
Win 98se und XP prof
D5Pers und D7Prof
|
Verfasst: Do 07.04.05 19:00
Hallo,
210 mm ist die Breite einer DIN-A4 Seite. Du hast also die individuelle
Druckerauflösung und die echte Seitenbreite in einem Verhältnis. Dies ist eine Vereinfachung, da eigentlich die Breite zwischen den echten Druckränder gefragt wäre (kann man auch abfragen, bringt aber - glaube ich - keine deutlich höhere Genauigkeit).
Genau, bei einem Drucker wirst Du zwischen Deinem ersten Code und dem zweiten nur den Unterschied feststellen, der oben als "Vereinfachung" eine Verunreinigung in den Korrekturfaktor hingibt. Der Unterschied wird erst mit mehreren Druckern deutlich, da mit dem zweiten Code alle unterschiedlichen Drucker an dieselbe Stelle (sprich super genau) drucken.
Wenn Du den Korrekturfaktor als Variable festlegst, ist jedes Produkt dieser Variablen die Position in mm (für alle Druckertypen!):
x_mm:=trunc(Printer.PageWidth / 210);
dann liegt 10*x_mm genau 1cm rechts neben dem linken Druckrand auf der Seite.
Gruß Pierre
|
|
|