Einzelnen Beitrag anzeigen

Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#1

Ausgabe auf dem Canvas des Druckers

  Alt 21. Apr 2006, 09:06
In der Code-Library gibt es bereits 2 Themen, die zeigen, wie man Text ausdrucken kann (1. Thema, 2. Thema), doch ein gut kommentiertes umfangreicheres Beispiel ist noch nicht vorhanden. Das liefert uns Luckie nun hier. Sein Beispiel zeigt, wie es möglich ist, den Inhalt einer ListBox zu drucken.

Benötigt werden hierfür ein TPrintDialog (Register: Dialoge), eine TListBox und ein TButton (jew. Register Standard).

Delphi-Quellcode:
(*
* Author  : Michael Puff - [url]http://www.michael-puff.de[/url]
* Date    : 2006-04-21
* License : PUBLIC DOMAIN
*)


uses
  Printers;

procedure PrintLine(Canvas: TCanvas; const Line: string; idx, OffSetLeft, OffSetTop, Step: Integer);
begin
  Canvas.TextOut(OffSetLeft, Step * idx + OffSetTop, Line);
end;

procedure TForm1.Button1Click(Sender: TObject);
const
  TOPMARGIN = 20; // Millimeter
  BOTTOMMARGIN = 20; // Millimeter
  LEFTMARGIN = 20; // Millimeter
var
  i, j : Integer;
  PaperHeight : Integer;
begin
  j := 0;
  if PrintDialog1.Execute then
  begin
    with Printer do
    begin
      // Druckjob starten
      BeginDoc;
      // Einheit auf 0.1 Millimeter umstellen
      // Each logical unit is mapped to 0.1 millimeter. Positive x is to the right; positive y is up.
      SetMapMode(Canvas.Handle, MM_LOMETRIC);
      // Blatthöhe in Millimetern
      PaperHeight := GetDeviceCaps(Canvas.Handle, VERTSIZE);
      // Schriftgröße
      Canvas.Font.Size := 7;
      // Schriftart
      Canvas.Font.Name := 'Courier New';
      for i := 0 to ListBox1.Items.Count - 1 do
      begin
        PrintLine(Printer.Canvas, // Ziel-Canvas, hier Drucker, kann aber auch Formular oder sonst was sein
          Listbox1.Items[i], // zu druckende Zeichenkette
          j, // Zeile
          LEFTMARGIN * 10, // Linker Rand (1/10 mm)
          -TOPMARGIN * 10, // Oberer Rand (1/10 mm). Negativ, weil y ist von unten nach oben
          -Canvas.Font.Size * 10 // Zeilenabstand (= Schriftgröße), abhängig von Schriftgröße.
                                  // Negativ, weil y ist von unten nach oben
          );
        // nächste Zeile
        Inc(j);
        // Wenn alles zusammen höher als die Blatthöhe + Ränder wird -> neue Seite
        // Achtung hier in Millimetern rechnen, da GetDeviceCaps Millimeter ausgibt!!!
        // Zähler + Zeilenabstand (= Schriftgröße) + oberer Rand + unterer Rand
        if ((j * Canvas.Font.Size + TOPMARGIN + BOTTOMMARGIN) >= PaperHeight) then
        begin
          // neue Seite
          NewPage;
          // Zeilenzähler zurücksetzen
          j := 0;
        end;
      end;
      EndDoc;
    end;
  end;
end;
Sollen Grafiken/Bilder mit ausgedruckt werden ist es sinnvoller, alles in einem internen Bitmap auszugeben (Stichwort: TBitmap) und anschließend das Bitmap an den Drucker zu senden. Im MSDN wird dies ebenfalls so gemacht: Printing a document.

[edit=Luckie]Rechtschreibfehler behoben Mfg, Luckie[/edit]
  Mit Zitat antworten Zitat