Home » Tutorials » Object Pascal/RTL » Drucken

Drucken

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.