![]() |
[Drucken] Textlänge in Millimeter ermitteln
Hallo,
und zwar sitze ich gerade wieder mal vor einem Problem, mit welchen ich nicht ganz klar komme. Mir geht es im Folgenden darum, dass ich einen String unbekannter Länge habe und diesen ausdrucken will. Zunächst allerdings noch eine Vorbetrachtung, um meinen eigentlichen Ansatz verständlich zu machen: Um die Größe des Blattes zu berechnen habe ich mehrere Möglichkeiten. Zum einen kann ich mir per GetDeviceCaps() die Größe des Blattes im Millimeter ausgeben lassen, oder eben selbst berechnen. Ich will nun den Weg über das selbst berechnen gehen, da ich ich darauf auf die Größe der Schrift in Millimeter schließen will. Die Formel für die Breite des Blattes in Millimeter berechnet sich wie folgt und stimmen auch exakt:
Delphi-Quellcode:
Nun habe ich mir eine eigene Methode geschrieben, welche die Textlänge in Pixel zurückgibt, dann diese, wie oben gezeigt in Millimeter umrechnet und dann entsprechend einen Zeilenumbruch macht. Das ganze funktioniert allerdings nicht, warum auch immer! Ich hab mir schon gedacht, dass sich ein Logikfehler eingeschlichen hat, aber bei der Blattgröße stimmt es ja auch *argh*
width_in_mm := GetDeviceCaps(Printer.Canvas.Handle, HORZRES) // Breite in Pixel
/ GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSX) // Auflösung des Druckers in X-Richtung * 25.4; // Inch in Millimeter umrechnen (2.54cm = 1 inch) Was ich nicht ganz verstehe ist zudem folgendes: Ändere ich per setMapMode() von MM_TEXT auf MM_LOMETRIC bzw. anders herum, dann liefert mir die Canvas.textWidth()-Methode auch andere Werte. Aber das darf doch nicht sein? Hier mal mein Code - evtl. findet ihr was:
Delphi-Quellcode:
Mit freundlichen Grüßen
(*******************************************************************************
Class/Method : printString Information : Druckt einen Text mit beliebiger Länge aus und wandelt "//" in Zeilenumbrüche um. *) procedure TPrintLaufzettel.printString(ACanvas : TCanvas; x, y : Integer; MaxWidth : Integer; AStr : String; AFontHeight : Integer); var d : Integer; t : String; c : String; lpx : Integer; len : Extended; begin // Auflösung des Druckers ermitteln lpx := GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSX); // evtl. y berichtigen if (y > 0) then y := y * (-1); with ACanvas do begin Font.Height := AFontHeight; d := 0; while (length(AStr) > 0) do begin t := ''; c := ''; len := 0; while (length(AStr) > 0) and (len < MaxWidth) do begin // nächstes Wort kopieren und in AStr ausschneiden t := t + c; delete(AStr, 1, length(c)); if (pos(' ', AStr) = 0) and (length(AStr) > 0) then c := AStr else c := copy(AStr, 1, pos(' ', AStr)); // Auf Zeilenumbruch prüfen if (pos('//', c) > 0) then begin delete(c, length(c) - 2, length(c)); // alles hinter dem Backslash entfernen t := t + c; // t vervollständigen delete(AStr, 1, length(c) + 2); // AStr kürzen break; // Schleife verlassen, da Zeilenumbruch erfolgen soll end; // Länge des Textes in Millimeter ausgeben neu berechnen len := textWidth(trim(t + c)) * 10 / lpx * 25.4; end; TextOut(x, y + d, trim(t)); // Text ausdrucken dec(d, AFontHeight + 6); // Abstand für nächste Zeile berechnen end; end; end; der (gerade verzweifelte) Hai ;) |
Re: [Drucken] Textlänge in Millimeter ermitteln
Zitat:
Zitat:
Zitat:
|
Re: [Drucken] Textlänge in Millimeter ermitteln
Habe irgendwie den Wald vor lauter Bäumen nicht gesehen... :wall: Danke!
Hier die (von mehreren Fehlern bereinigte) Lösung für jeden den sie interessieren sollte.
Delphi-Quellcode:
(*******************************************************************************
Class/Method : printString Information : Druckt einen Text mit beliebiger Länge aus und wandelt "//" in Zeilenumbrüche um. *) procedure TPrintLaufzettel.printString(ACanvas : TCanvas; x, y : Integer; MaxWidth : Integer; AStr : String; AFontHeight : Integer); var d : Integer; t : String; c : String; lpx : Integer; len : Extended; begin // MapMode setzen setMapMode(Printer.Canvas.Handle, MM_LOMETRIC); // Textausrichtung setTextAlign(Printer.Canvas.Handle, TA_LEFT + TA_TOP); // Auflösung des Druckers ermitteln lpx := GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSX); // evtl. y berichtigen, da auf dem Drucker gedruckt wird muss // y negativ sein if (y > 0) then y := y * (-1); with ACanvas do begin Font.Height := AFontHeight; d := 0; while (length(AStr) > 0) do begin t := ''; c := ''; len := 0; while (length(AStr) > 0) and (len < MaxWidth) do begin // nächstes Wort kopieren und in AStr ausschneiden t := t + c; delete(AStr, 1, length(c)); if (pos(' ', AStr) = 0) and (length(AStr) > 0) then c := AStr else c := copy(AStr, 1, pos(' ', AStr)); // Auf Zeilenumbruch prüfen if (pos('//', c) > 0) then begin // Prüfen, ob bisherige Zeile mit neuem Text nicht zu lang ist len := textWidth(trim(t + copy(c, 1, pos('//', c) - 1))); if (len > MaxWidth) then break; delete(c, length(c) - 2, length(c)); // alles hinter dem Backslash entfernen t := t + c; // t vervollständigen delete(AStr, 1, length(c) + 2); // AStr kürzen break; // Schleife verlassen, da Zeilenumbruch erfolgen soll end; // Länge des Textes in Millimeter ausgeben neu berechnen len := textWidth(trim(t + c)); end; TextOut(x, y + d, trim(t)); // Text ausdrucken dec(d, AFontHeight + 6); // Abstand für nächste Zeile berechnen end; end; end; |
Re: [Drucken] Textlänge in Millimeter ermitteln
Ich habe es jetzt nicht ausprobiert, aber 3 Dinge:
Delphi-Quellcode:
Und wozu brauchst Du ACanvas?
// Textausrichtung
setTextAlign(Printer.Canvas.Handle, TA_LEFT + TA_TOP); //bitte or statt + // Auflösung des Druckers ermitteln lpx := GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSX); // evtl. y berichtigen, da auf dem Drucker gedruckt wird muss // y negativ sein y := -abs(y); //ist kürzer ;) |
Re: [Drucken] Textlänge in Millimeter ermitteln
Oh, das mit dem ACanvas war irgendwie noch von der vorherigen Methode übrig geblieben, welche ich komplett geändert hatte *schäm*
Wo liegt der Unterschied zwischen dem OR und dem verwendeten +?! Das mit der kürzeren Schreibweise sei mal so dahingestellt :mrgreen: |
Re: [Drucken] Textlänge in Millimeter ermitteln
Zitat:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz