Stringliste drucken
Nun sind wir einiges an Theorie durchgegangen. Deshalb ist es Zeit für ein praktisches Beispiel.
procedure TForm1.Drucken(sl: TStrings); var zeile, x, y: integer; breite, hoehe, randlinks, randoben: integer; begin if PrintDialog1.Execute then begin Printer.BeginDoc; //Druckjob beginnen SetMapMode(Printer.Canvas.Handle, MM_LOMETRIC); //Umstellen auf 1/10 mm //Schrift-Einstellungen: Printer.Canvas.Font.Name:='Courier New'; Printer.Canvas.Brush.Color:=clWhite; Printer.Canvas.Font.Height:=50; //5 mm //Blattgöße in 1/10 mm ermitteln: breite := GetDeviceCaps(Printer.Canvas.Handle, HORZSIZE)*10; hoehe := GetDeviceCaps(Printer.Canvas.Handle, VERTSIZE)*10; randlinks:=250; //2,5 cm randoben:=250; //2,5 cm x:=randlinks; y:=randoben*-1; for zeile:=0 to sl.Count-1 do begin if -y>(hoehe-2*randoben) then begin y:=randoben*-1; Printer.NewPage; end; if y=-randoben then begin Printer.Canvas.Font.Style:=[fsbold]; Printer.Canvas.TextOut(x, y, 'Seite '+ IntToStr(Printer.PageNumber)); Printer.Canvas.Font.Style:=[]; y:=y-Printer.Canvas.TextHeight(sl[zeile]); end; Printer.Canvas.TextOut(x, y, sl[zeile]); y:=y-Printer.Canvas.TextHeight(sl[zeile]); end; Printer.EndDoc; end; end;
Download Beispielprogramm
Was passiert hier?
Zunächst wird die auf dem Formular platzierte Komponente PrintDialog1 aufgerufen. Sie zeigt den Windows-üblichen Druckdialog an. Wird dieser mit OK bestätigt, wird true zurückgegeben und somit der folgende Code ausgeführt.
Die Druckausgabe wird auf 1/10 Millimeter umgestellt und Einstellungen wie Seitenränder, Schriftart und -größe vorgenommen. Nun beginnt die for-Schleife über alle Zeilen der Stringliste. Als erstes wird geprüft, ob sich die y-Koordinate zwischenzeitlich außerhalb des bedruckbaren Bereichs befindet. Ist das der Fall, wird y wieder auf den Startwert (oberer Seitenrand) gesetzt und ein Seitenwechsel (NewPage) durchgeführt. Die y-Werte sind allesamt negativ, da durch das Umstellen auf 1/10 mm die negativen y-Werte nach unten abgetragen werden.
Es folgt eine zweite Bedingungsabfrage: Handelt es sich um die erste Zeile eines neuen Blatts (y entspricht noch dem oberen Blattrand), wird eine Seitenzahl ausgedruckt. y:=y-Printer.Canvas.TextHeight(sl[zeile]) verringert y dabei um die Höhe einer Zeile, legt also den y-Koordinatenwert für die nächste auszugebende Zeile fest.
Nun wird auch eine normale Textzeile ausgegeben. Die Länge einer Zeile wird hier nicht überprüft. Sollte das Beispiel real eingesetzt werden, müsste das noch geschehen. Über TextWidth ist das aber problemlos möglich.