AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein FreePascal Lazarus: Fragen zum Drucken
Thema durchsuchen
Ansicht
Themen-Optionen

Lazarus: Fragen zum Drucken

Offene Frage von "Kralle"
Ein Thema von Kralle · begonnen am 21. Feb 2015
Antwort Antwort
Kralle

Registriert seit: 31. Okt 2004
Ort: Bremerhaven
355 Beiträge
 
Delphi XE7 Professional
 
#1

Lazarus: Fragen zum Drucken

  Alt 21. Feb 2015, 11:22
Moin,

ich fange an mich mit dem Ausdrucken zu beschäftigen und habe folgenden Code aus verschiedenen gefundenen Beiträgen zusammengestellt:

Delphi-Quellcode:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, PrintersDlgs, Forms, Controls, Graphics, Dialogs,
  StdCtrls, printers;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    PrintDialog1: TPrintDialog;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
const
  TOTAL_PAGES = 4; // Maximale Anzahl von Seiten die Gedruckt werden sollen
Var
    TestString:string;
    page, startPage, endPage : Integer;
begin
     TestString:='abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 1234567890 äöüß ÄÖÜ';
     // Druckerdaten ermitteln
     //
     // erlauben das im Druckerdialog die Option Drucke von Seite x bis Seite y aktiv ist
     // Set up print dialog options
     PrintDialog1.MinPage := 1; // Erste erlaubte Seitennummer
     PrintDialog1.MaxPage := TOTAL_PAGES; // Höchste erlaubte Seitennummer
     PrintDialog1.ToPage := TOTAL_PAGES; // 1 bis Höchste Erlaubte Seitennummer
     PrintDialog1.Options := [poPageNums];
     // Drucken-Dialog anzeigen
     if PrintDialog1.Execute then
        Begin
          // Den gewählten Drucker ins Memo schreiben
          Memo1.Append(Printer.Printers[Printer.PrinterIndex]);
          // maximale Seitenhöhe in Pixel
          Memo1.Append(IntToStr(Printer.PageHeight));
          // maximale Seitenbreite in Pixel
          Memo1.Append(IntToStr(Printer.PageWidth));
          // Prüfen wieviel Platz der gewählte Text auf dem Drucker-Canvas in der Breite braucht
          Memo1.Append(TestString);
          Memo1.Append(IntToStr(Printer.Canvas.TextWidth(TestString)));
          // Prüfen wieviel Platz der gewählte Text auf dem Drucker-Canvas in der Höhe braucht
          Memo1.Append(TestString);
          Memo1.Append(IntToStr(Printer.Canvas.TextHeight(TestString)));
          // Papierausrichtung ermitteln und setzen
          // poLandscape
          //
          Memo1.Append('Ausrichtung = '); //+String(Printer.Orientation)); **** Wie ermitteln? *****
          Printer.Orientation:= poLandscape;
          // Anzahl der im Dialog ausgewählten Kopien setzen
          Memo1.Append('Es sollen '+IntToStr(PrintDialog1.Copies)+' Kopien erstellt werden.');
          Printer.Copies := PrintDialog1.Copies;


          // Titel des Druckauftrages festlegen
          Printer.Title := 'Druckauftrag 1';
          // Schriftgröße 12 festlegen
          Printer.Canvas.Font.Size := 36;
          // Schriftart Verdana festlegen
          Printer.Canvas.Font.Name := 'Verdana';


          // Druckauftrag starten:
          // Der Befehl startet einen Druckauftrag, (nicht eine neue Seite!)

          Printer.BeginDoc;

          // Sollen ALLE Seiten gedruckt werden oder nur von x bis y

          if PrintDialog1.PrintRange = prPageNums then
             begin
                  startpage := PrintDialog1.FromPage;
                  endPage := PrintDialog1.ToPage;
             end
          else // All pages
               begin
                    startPage := 1;
                    endPage := TOTAL_PAGES;
               end;

         // Set up the start page number
         page := startPage;

         // Keep printing whilst all OK
         while ((not Printer.Aborted) and Printer.Printing) and (page <= endPage) do
            begin
                 // Schriftfarbe einstellen
                 Printer.Canvas.Font.Color := clBlue;
                 // *******************************************************************
                 // Einen Text an einer bestimmten Position des Drucker-Canvas drucken
                 // *******************************************************************
                 Printer.Canvas.TextOut(0,0, 'Page number = '+IntToStr(page)); // *** Warum nicht linke obere Ecke???
                 Printer.Canvas.TextOut(0,Printer.Canvas.Font.Size*2,teststring);
                 // Die Seitenzahl erhöhen
                 Inc(page);

                 // Eine neue Seite ausgeben solange bis die letzte ausgedruckt wurde
                 if (page <= endPage) and (not Printer.Aborted) then

                 // Neue Seite erstellen:
                 // Dieser Befehl erstellt eine neue Seite und gibt die Möglichkeit auf ihr zu drucken.
                 // Der Befehl kann beliebig oft zwischen Printer.BeginDoc; und Printer.EndDoc; aufgerufen werden.
                 // Für jeden Aufruf wird später eine neue Seite gedruckt.

                 Printer.NewPage;
            end;

          // Druckauftrag beenden:

          Printer.EndDoc;

          end;

end;

end.
Zwei Punkte sind mir zur Zeit noch unklar:
  1. Wo bekomme ich die Information her, ob der gewählte Drucker im Hoch- oder Querformat drucken wird?
  2. Wie man auf dem Bild sehen kann, beginnt der Druck nicht in der linken, oberen Ecke. Warum? Und wie ändert man das?

Gruß HEiko
Miniaturansicht angehängter Grafiken
ausdruck.jpg  
OS: Windows 10 Professional, Delphi XE7 Pro SP1 +(Mobilpack & FireDAC)
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 12:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz