(*******************************************************************************
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;