AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Library: Grafik / Sound / Multimedia Delphi Ausgabe auf dem Canvas des Druckers

Ausgabe auf dem Canvas des Druckers

Ein Thema von Matze · begonnen am 21. Apr 2006 · letzter Beitrag vom 21. Apr 2006
Antwort Antwort
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.987 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
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.616 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Ausgabe auf dem Canvas des Druckers

  Alt 21. Apr 2006, 11:33
Die Angaben erfolgen in 1/10 Millimeter, will ich also einen Rand von 2 cm haben muss ich die Angaben von TOPMARGIN mal 10 nehmen, da ich diese in Millimetern gemacht habe. Wo hingegen GetDeviceCaps seine Werte in Millimetern zurückliefert und damit man sieht, dass man einmal mit 1/10 Millimetern arbeiten muss und einmal nur mit Millimetern, habe ich das so kommentiert.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:46 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf