Autor Beitrag
MisterBum
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 107



BeitragVerfasst: 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:

ausblenden 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;

    { Textausgabe an entsprechenden Positionen der Überweisung (x ->) }
      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 user profile iconraziel: Code- durch Delphi-Tags ersetzt.
Pierre
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 138

Win 98se und XP prof
D5Pers und D7Prof
BeitragVerfasst: 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:
ausblenden 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 user profile iconraziel: Delphi-Tags hinzugefügt.
MisterBum Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 107



BeitragVerfasst: 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:

ausblenden volle Höhe 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:
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;

    { Textausgabe an entsprechenden Positionen der Überweisung (x ->) }
      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 user profile iconraziel: Code- durch Delphi-Tags ersetzt.
Pierre
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 138

Win 98se und XP prof
D5Pers und D7Prof
BeitragVerfasst: 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