Text ausrucken an absoluten Koordinaten

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
derWitte
Beiträge: 5
Registriert: Di 15. Sep 2015, 13:23
OS, Lazarus, FPC: W10, FPC 2.6.4
CPU-Target: 64Bit

Text ausrucken an absoluten Koordinaten

Beitrag von derWitte »

Hallo,
ich habe seit einer Woche Lazarus FPC 2.6.4 und tue mich schwer mit dem Ausdrucken von normalen Text mit Canvas.TextOut.
Ich möchte einfach nur die Werte einer Formularmaske punktgenau an einer Stelle auf ein Blatt Papier (DIN A4, DIA A5 o.a.,egal) bringen.

Unter Delphi 5 ging es sehr gut mit der Funktion SetMapMode, MM_lometric (1/10mm).
Welche Funktionen gibt es jetzt bei Lazarus und wie werden diese benutzt. Habe in den letzten Tagen viel Code-Beispiele im Forum gesehen,
ist eher verwirrend.
Mein Drucker druckt mit 600 dpi.
Eine Ausgabe mit Delphi wie etwa Canvas.TextOut(740,-180,Edit1.Text); wird korrekt vom linken Rand ab druckbaren Bereich bei 74mm
ausgedruckt.

Unter Lazarus beginnt der Ausdruck schon bei 31mm vom linken Rand mit der selben Anweisung (ohne Minus-Zeichen in der Parameterangabe).
Das gleiche natürlich auch in der Y-Achse (fängt höher an).
Was müsste ich jetzt anders machen?
Müssen jetzt besondere Berechungen für das Blatt angestellt werden?

Ein zweites Problem/Umstand ist es, das die erzeugte exe-Datei eine Größe von 15 MB aufweist. Bischen viel für 3 kleine Proceduren mit
knapp 10 Programmzeilen!
Wie kann ich diese Datei reduzieren, am Besten von vornherhein?
Wo muss da was eingestellt werden?
Dokumentationen in Deutsch sind auch rar und wären für mich sehr hilfreich.

Bin dankbar wenn Ihr mir helfen könntet.
Gruß
derWitte


derWitte
Beiträge: 5
Registriert: Di 15. Sep 2015, 13:23
OS, Lazarus, FPC: W10, FPC 2.6.4
CPU-Target: 64Bit

Re: Text ausrucken an absoluten Koordinaten

Beitrag von derWitte »

Danke für die schnelle Antwort.

Die Beispiele sagen mir nichts, komme nicht weiter.
Weitere Kommentare wären von Vorteil gewesen, warum was gemacht wird,
was welche Funktion erledigen.
Ein StringGrid ist mit Delphi mit 3, 4 Schleifen schnell ausgedruckt.

In meinem Falle möchte ich nur z.B. einen Text an die Position 180,150 (mm) ausgeben.
Pixel-Angaben sind nicht erwünscht, bräuchte für die Eingabemaske mm-Angaben.

Schein mit Lazarus wohl etwas beschwerlicher zu sein. Muss halt noch ein bischen lernen.

Danke für die Mühe.
Gruß.

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: Text ausrucken an absoluten Koordinaten

Beitrag von theo »

derWitte hat geschrieben: In meinem Falle möchte ich nur z.B. einen Text an die Position 180,150 (mm) ausgeben.
Pixel-Angaben sind nicht erwünscht, bräuchte für die Eingabemaske mm-Angaben.
.
Das steht doch in dem Link hier ganz übersichtlich: http://www.lazarusforum.de/viewtopic.php?p=55312#p55312
Printer.XDPI ist die horizontale Auflösung des Druckers (Dots per Inch). Du musst also Inch <> Zentimeter umrechnen, dann weisst du wie viele Pixel (Dots) einen Zentimeter ergeben.
Ist im Bsp. alles ersichtlich. Es erzeugt den angehängten Ausdruck..
S.a. Printer.PaperSize.PaperRect.WorkRect; etc.
Dateianhänge
theo.pdf
(2.66 KiB) 101-mal heruntergeladen

derWitte
Beiträge: 5
Registriert: Di 15. Sep 2015, 13:23
OS, Lazarus, FPC: W10, FPC 2.6.4
CPU-Target: 64Bit

Re: Text ausrucken an absoluten Koordinaten

Beitrag von derWitte »

Danke theo!

Geht ja genau so schnell wie in Delphi, wenn man's weiß.
Nur die Code-Zeilen für Printer.Canvas.TextOut(x,y) sind länger geworden wie aus meiner Beispiel-Listing ersichtlich ist.
Mehr Schreibarbeit.

Code: Alles auswählen

procedure TForm1.DruckenClick(Sender: TObject);
begin
 if PrintDialog1.Execute then
  begin
   Printer.Title := Form1.Caption;
   Printer.Orientation := TPrinterOrientation(poPortrait);
   Printer.BeginDoc;
   Printer.Canvas.MoveTo(1,1);
   SetMapMode(Printer.Canvas.Handle,MM_lometric);
 
  try
   with Printer.Canvas do
    begin
     Font.Name   := 'Arial';
     Font.Height := 31;
     TextOut(740,-180,Edit1.Text);                             // Name
     TextOut(740,-250,Edit2.Text);                             // Vorname
     TextOut(740,-310,Edit3.Text);                             // Wohnort
     if DateTimePicker2.Checked = true then
        TextOut(740,-380,(''))
     else
     TextOut(740,-380,DateToStr(DatetimePicker2.Date));        // Datum
Es hat alles geklappt.

Danke

Gruß
derWitte

Antworten