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:
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)
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*
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:
(*******************************************************************************
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;
Mit freundlichen Grüßen
der (gerade verzweifelte) Hai
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)