FireMonkey アプリケーションからの印刷
Windows または macOS 上の FireMonkey アプリケーションから印刷を行うことができます。
目次
FireMonkey 印刷 API
FMX.Printer.TPrinter オブジェクトには、Windows または macOS のコンピュータに接続されたプリンタにアクセスして印刷するための機能がカプセル化されています。 FMX.Printer.TPrinter オブジェクトを使用すると、アプリケーションで実行されるあらゆる印刷を管理できます。 FMX.Printer.TPrinter のインスタンスの取得は、グローバル FMX.Printer.Printer 関数を呼び出すことによって行います。
FMX.Printer.TPrinter は TPrinterDevice オブジェクトのリストを持ち、そのオブジェクトそれぞれが 1 つのプリンタを表します。各プリンタは、独自の印刷解像度のリストを持ちます(単位は DPI = 1 インチあたりのドット数)。DPICount プロパティを見ると、プリンタがサポートしている解像度の数がわかります。DPI プロパティは、インデックス付きのプロパティであり、これを調べて実際の解像度を知ることができます。ActiveDPIIndex は、ゼロから始まるインデックスで、印刷デバイスの印刷解像度を表すインデックス付きプロパティ DPI に対応します。
FireMonkey アプリケーションでの印刷の実行
以下では、FireMonkey アプリケーションから正しく印刷を行うための手順を説明します。
-
印刷ジョブを実行するフォームに FMX.Printer を追加します。
Delphi の場合:
uses FMX.Printer;
C++ の場合:#include "FMX.Printer.hpp"
- フォームのキャンバスではなく、プリンタ キャンバスまたはグラフィカル コンポーネントのキャンバス(画像のキャンバスなど)を必ず使用します。プリンタ キャンバスを使用しない場合には、必ず BeginScene で印刷操作を開始し、EndScene で印刷ジョブを終了してください。
-
印刷品質(Canvas の解像度と移植性)を完全に制御するには、値を代入するか SelectDPI メソッドを呼び出す(推奨)かして、まず ActiveDPIIndex を設定します。
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 */
-
BeginDoc を使用して実際の印刷ジョブを開始します。
Delphi の場合:
Printer.BeginDoc;
C++ の場合:Printer->BeginDoc();
-
EndDoc を使用して実際の印刷ジョブを終了します。
Delphi の場合:
Printer.EndDoc;
C++ の場合:Printer->EndDoc();
- 印刷ジョブの実行中には決して ActiveDPIIndex を変更しないでください。
DPI とドライバのサポートについて
同じプリンタであってもプラットフォームが異なれば(Windows と macOS)、ドライバのサポートは大幅に異なります。 そのため、DPI 配列に含まれるサポートされている解像度の数や順序が Windows と macOS で同じであると考えてはなりません。 たとえば HP レーザー プリンタの場合、macOS では 3 種類の解像度しかサポートされていませんが、Windows では 7 種類の解像度がサポートされています。 Windows と macOS の両方で印刷機能を持つアプリケーションを作成するときには、ある程度よく似た印刷結果がどちらのプラットフォームでも出力されるよう、追加のコード(主に DPI を指定するためのもの)を記述する必要があります。
お勧めの方法は、先ほど説明したように、ActiveDPIIndex プロパティを設定するか SelectDPI メソッドを呼び出して DPI を指定してから、印刷を行うようにすることです。
ActiveDPIIndex はプリンタのデフォルト DPI に設定されないため注意が必要です。 一部の macOS プリンタ ドライバでデフォルト DPI を取得できないことが主な理由で、TPrinterDevice オブジェクトはデフォルト DPI をサポートしていません。 そのため、すべての TPrinterDevice オブジェクトの ActiveDPIIndex は、アプリケーション起動時に -1 に設定されます。 -1 という値は、直近の印刷 DPI またはデフォルト DPI のいずれかを使用することを意味します。 デフォルト DPI を使用できるのは、アプリケーション起動後に、ActiveDPIIndex を別のインデックス値に変更しておらず、かつ、BeginDoc を呼び出していない場合に限られます。
逆に、ActiveDPIIndex を -1 に設定すると、既に設定されたプリンタの直近の DPI がアプリケーションで使われるようになります。 そのため、BeginDoc を呼び出す前には忘れずに ActiveDPIIndex に値を設定してください。Canvas のサイズを Windows と macOS で同じにしたいからです。
SelectDPI メソッドを使用すると、SelectDPI に渡されたパラメータを基に、プリンタの解像度に最も近い解像度を TPrinter オブジェクトに選択させることが簡単にできます。直接 ActiveDPIIndex プロパティを設定するよりも、たとえば以下のように設定する方がずっと簡単です。実行時に値を変更できます。
Delphi の場合:
Printer.ActivePrinter.Select(600, 600);
C++ の場合:
Printer->ActivePrinter->Select(600, 600);
Windows でドライバから返されるプリンタ解像度の数と macOS プリンタ ドライバから返されるプリンタ解像度の数が異なるため、指定したインデックスが有効でない可能性があるからです。
要するに、印刷 DPI を設定するには、SelectDPI を使用する方が便利な方法です。
プリンタ キャンバス
プリンタ キャンバスの使い方は、画面キャンバスやウィンドウ(フォーム)キャンバスと比べて、次のような点が異なります。
-
プリンタ キャンバスの使用時には、Canvas.Fill を使用して色と塗りつぶしの設定を行う必要があります。
Delphi の場合:
Canvas.Fill.Color := claXXX; Canvas.Fill.Kind := TBrushKind.Solid;
C++ の場合:Canvas->Fill->Color = claXXX; Canvas->Fill->Kind = TBrushKind.Solid;
-
画面キャンバスまたはウィンドウ キャンバスの使用時には、Canvas.Stroke を使用して色と塗りつぶしの設定を行う必要があります。
Delphi の場合:
Canvas.Stroke.Color := claXXX; Canvas.Stroke.Kind := TBrushKind.Solid;
C++ の場合:Canvas->Stroke->Color = claXXX; Canvas->Stroke->Kind = TBrushKind.Solid;
次の点に注意してください。
- テキストの印刷時に色を変更したい場合には、Canvas.Fill を使用します。
- テキスト以外のものの描画時には、Canvas.Stroke を使用します。
Opacity
パラメータは、このパラメータをサポートしているすべてのルーチン(FMX.Graphics.TCanvas.FillRect など)において、0..1
の範囲の浮動小数点値を取ります(0 は透明、1 は不透明)。この範囲外の値を設定してはなりません。
プログラムによる印刷の例
次の例では画像とボタンを使用しています。ボタンをクリックするたびに、画像がプリンタに印刷されます。
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();
印刷 API の詳細は、FMX.Printer ユニットの API ドキュメントを参照してください。