Drucken aus FireMonkey-Anwendungen
Nach oben zu FireMonkey-Anwendungshandbuch
Sie können auf Windows oder macOS aus einer FireMonkey-Anwendung drucken.
Inhaltsverzeichnis
FireMonkey-API zum Drucken
Das Objekt FMX.Printer.TPrinter kapselt die Funktionalität für den Zugriff auf einen Drucker und das Drucken auf einem Drucker, der an einem Computer für Windows oder macOS angeschlossen ist. Mit dem Objekt FMX.Printer.TPrinter können Sie alle Druckoperationen einer Anwendung verwalten. Durch Aufruf der globalen Funktion FMX.Printer.Printer können Sie eine Instanz von FMX.Printer.TPrinter abrufen.
FMX.Printer.TPrinter enthält eine Liste der TPrinterDevice-Objekte, die jeweils einen Drucker repräsentieren. Jeder Drucker enthält eine eigene Liste mit Druckauflösungen DPI (Dots Per Inch, Punkte pro Zoll). In der Eigenschaft DPICount ist die Anzahl der Auflösungen enthalten, die von dem Drucker unterstützt werden. Die indizierte Eigenschaft DPI kann zum Ermitteln der tatsächlichen Auflösungen durchlaufen werden. ActiveDPIIndex ist ein nullbasierter Index für die indizierte Eigenschaft DPI, die die Druckauflösung auf dem Drucker darstellt.
Aktivieren der Druckfunktion in FireMonkey-Anwendungen
In den folgenden Schritten wird gezeigt, wie das Drucken aus einer FireMonkey-Anwendung durchgeführt wird.
-
Beziehen Sie FMX.Printer in das Formular ein, in dem der Druckauftrag verwendet werden soll.
Delphi:uses FMX.Printer;
C++:
#include "FMX.Printer.hpp"
- Verwenden Sie immer die Zeichenfläche des Druckers oder die Zeichenfläche einer grafischen Komponente (z.B. die Zeichenfläche eines Bildes) anstelle der Zeichenfläche des Formulars. Beginnen Sie den Druckvorgang immer mit BeginScene und beenden Sie den Druckauftrag mit EndScene, wenn Sie die Zeichenfläche des Druckers nicht verwenden.
-
Setzen Sie zuerst zur vollständigen Kontrolle über die Druckqualität (Auflösung der und Portabilität der Zeichenfläche) ActiveDPIIndex durch Zuweisen eines Wertes oder durch Aufruf der Methode SelectDPI (empfohlenes Vorgehen).
Delphi:
Printer.ActivePrinter.SelectDPI(1200, 1200); { one way } Printer.ActivePrinter.ActiveDPIIndex := 1; { another way }
C++:
Printer->ActivePrinter->SelectDPI(1200, 1200); /* one way */ Printer->ActivePrinter->ActiveDPIIndex = 1; /* another way */
-
Starten Sie den eigentlichen Druckauftrag mit BeginDoc.
Delphi:
Printer.BeginDoc;
C++:
Printer->BeginDoc();
-
Beenden Sie den eigentlichen Druckauftrag mit EndDoc.
Delphi:
Printer.EndDoc;
C++:
Printer->EndDoc();
- Ändern Sie während eines Druckauftrags nie die Eigenschaft ActiveDPIIndex.
DPI- und Treiberunterstützung
Die Treiberunterstützung für Drucker ist auf verschiedenen Plattformen (Windows, macOS) unterschiedlich. Deshalb sollten Sie sich nicht darauf verlassen, dass die Anzahl oder die Reihenfolge der unterstützten Auflösungen im Array DPI unter Windows und macOS identisch sind. Unter macOS gibt es beispielsweise für den HP-Laserdrucker 3 unterstützte Auflösungen, für Windows hingegen 7. Bei Anwendungen mit Druckfunktionen für Windows und macOS müssen Sie zusätzlichen Code hinzufügen (hauptsächlich zur Angabe der DPI), damit die Druckausgabe auf beiden Plattformen annähernd gleich ist.
Als bestes Verfahren hat sich erwiesen, die DPI immer durch Setzen der Eigenschaft ActiveDPIIndex oder durch Aufruf der Methode SelectDPI vor dem Drucken, wie oben erwähnt, festzulegen.
ActiveDPIIndex wird für einen gegebenen Drucker nicht auf die Standard-DPI gesetzt. Ein TPrinterDevice-Objekt unterstützt keine Standard-DPI, insbesondere weil die Standard-DPI von einigen macOS-Druckertreibern nicht angegeben wird. Deshalb wird beim Start der Anwendung ActiveDPIIndex für alle TPrinterDevice-Objekte auf -1 gesetzt. Der Wert -1 bedeutet, dass entweder die letzte Druck-DPI oder die Standard-DPI verwendet wird. Die Standard-DPI ist nur nach dem Start der Anwendung verfügbar, wenn Sie ActiveDPIIndex nicht in einen anderen Indexwert geändert und BeginDoc nicht aufgerufen haben.
Andererseits können Sie ActiveDPIIndex auf -1 setzen, und die letzte DPI des zuvor festgelegten Druckers wird von der Anwendung verwendet. Denken Sie immer daran, einen Wert für ActiveDPIIndex zu setzen, bevor Sie BeginDoc aufrufen, wenn Sie dieselbe Größe der Zeichenfläche für Windows und macOS verwenden möchten.
Mit der Methode SelectDPI kann durch ein TPrinter-Objekt sehr einfach die Ihrem Drucker ähnlichste Auflösung auf Basis der an SelectDPI übergebenen Parameter ausgewählt werden. Es ist einfacher festzulegen; anstatt die Eigenschaft ActiveDPIIndex direkt zu setzen, können Sie beispielsweise den Wert zur Laufzeit ändern:
Delphi:
Printer.ActivePrinter.SelectDPI(600, 600);
C++:
Printer->ActivePrinter->SelectDPI(600, 600);
In Anbetracht der Tatsache, dass unter Windows die Anzahl der vom Treiber angegebenen Druckerauflösungen von denen, die der macOS-Druckertreiber liefert, abweicht, könnte der Index nicht verfügbar sein.
Zusammengefasst stellt die Verwendung von SelectDPI zum Setzen der Druck-DPI die weitaus praktischere Methode dar.
Druckerzeichenfläche
Es gibt einige Unterschiede bei der Verwendung einer Druckerzeichenfläche im Vergleich zu einer Bildschirm- oder Fenster-(Formular-)Zeichenfläche:
-
- Für Druckerzeichenflächen müssen Sie die Farb- und Fülleinstellungen mit Canvas.Fill festlegen:
Delphi:
Canvas.Fill.Color := claXXX; Canvas.Fill.Kind := TBrushKind.Solid;
C++:
Canvas->Fill->Color = claXXX; Canvas->Fill->Kind = TBrushKind.Solid;
-
- Für Bildschirm- oder Fensterzeichenflächen müssen Sie die Farb- und Fülleinstellungen mit Canvas.Stroke festlegen.
Delphi:
Canvas.Stroke.Color := claXXX; Canvas.Stroke.Kind := TBrushKind.Solid;
C++:
Canvas->Stroke->Color = claXXX; Canvas->Stroke->Kind = TBrushKind.Solid;
Beachten Sie, dass:
- Sie beim Drucken von Text, dessen Farbe Sie ändern möchten, Canvas.Fill verwenden müssen.
- Sie beim Drucken anderer Elemente – außer Text – Canvas.Stroke verwenden müssen.
Der Parameter Opacity
übernimmt bei allen Routinen, die diesen Parameter unterstützen (wie FMX.Graphics.TCanvas.FillRect) Gleitkommawerte im Bereich von 0..1
(0 ist transparent und 1 ist undurchsichtig). Verwenden Sie keine Werte außerhalb dieses Bereichs.
Beispiel für programmgesteuertes Drucken
Im folgenden Beispiel wird ein Bild und eine Schaltfläche verwendet. Bei jedem Klicken auf die Schaltfläche wird das Bild auf dem Drucker ausgegeben.
Delphi:
var
SrcRect, DestRect: TRectF;
begin
{ Set the default DPI for the printer. The SelectDPI routine defaults
to the closest available resolution as reported by the driver. }
Printer.ActivePrinter.SelectDPI(1200, 1200);
{ Start printing. }
Printer.BeginDoc;
if Printer.Canvas.BeginScene then
try
{ Set canvas filling style. }
Printer.Canvas.Fill.Color := claBlack;
Printer.Canvas.Fill.Kind := TBrushKind.Solid;
{ Set the Source and Destination TRects. }
SrcRect := Image1.LocalRect;
DestRect := TRectF.Create(0, 0, Printer.PageWidth, Printer.PageHeight);
{ Print the picture on all the surfaces of the page and all opaque. }
Printer.Canvas.DrawBitmap(Image1.Bitmap, SrcRect, DestRect, 1);
finally
Printer.Canvas.EndScene;
end;
{ Finish printing job. }
Printer.EndDoc;
end;
C++:
TRectF SrcRect, DestRect;
TPrinter *Printer = Printer;
/* Set the default DPI for the printer. The SelectDPI routine defaults
to the closest available resolution as reported by the driver. */
Printer->ActivePrinter->SelectDPI(1200, 1200);
/* Start printing. */
Printer->BeginDoc();
if (Printer->Canvas->BeginScene()) {
try
{
/* Set canvas filling style. */
Printer->Canvas->Fill->Color = claBlack;
Printer->Canvas->Fill->Kind = TBrushKind(1);
/* Set the Source and Destination TRects. */
SrcRect = Image1->LocalRect;
DestRect = TRectF(0, 0, Printer->PageWidth, Printer->PageHeight);
/* Print the picture on all the surface of the page and all opaque. */
Printer->Canvas->DrawBitmap(Image1->Bitmap, SrcRect, DestRect, 1);
}
__finally
{
Printer->Canvas->EndScene();
}
}
/* Finish the printing job. */
Printer->EndDoc();
Weitere Informationen bezüglich der Druck-API finden Sie in der API-Dokumentation in der Unit FMX.Printer.