Delphiで印刷処理の命令を行うと、従来のPCでは
特に指定しなければ「通常使うプリンター」から印刷が行われていました。
しかしこの「通常使うプリンター」はWindows 10以降では仕様が変わっており、
デフォルト設定では最後に使用したプリンターが自動的に割り当てられるようになっています。
Windowsの「プリンターとスキャナー」の設定より、
「Windows で通常使うプリンターを管理する」のチェックが
オンになっていると最後に使用したプリンターが自動的に割り当てられ、
オフになっていると規定のプリンターが固定されます。
Delphi側の対策としては、uses節に「Vcl.Printers」を追加しておくと、
- 「Printer.Printers」
⇒ 実行端末にインストールされているプリンターの一覧(TStrings型) - 「Printer.PrinterIndex」
⇒ 上記のPrintersのうち、通常使うプリンターまたは実行EXEで使用するプリンターのインデックス
を取得することができます。
組み合わせて『Printer.Printers[Printer.PrinterIndex] 』と記述すれば、
通常使うプリンターまたは実行EXEで使用するプリンターの名称も得られます。
たとえばこの方法で取得値が想定のプリンターでなかった場合は、
エラー処理を入れて処理中断(印刷させない)するようなロジックも実装可能です。
以下にプリンター取得や選択のサンプルロジックをいくつか記載しますので、
状況に応じてご活用ください。
※いずれもuses節に「Vcl.Printers」が必要(XE以前の場合は「Printers」)
<①画面表示時にプリンターの一覧を取得し、名称の一覧をComboBoxに表示>
procedure TForm1.FormShow(Sender: TObject);
begin
// プリンターの一覧を取得
ComboBox1.Items.Text := Printer.Printers.Text;
// 一覧の初期値を通常使うプリンターにする
ComboBox1.ItemIndex := Printer.PrinterIndex;
end;
<②画面を直接印刷する処理にてプリンターを指定して印刷>
※ComboBox1のItemsには上記①のプリンターの一覧が入っている前提
procedure TForm1.Button1Click(Sender: TObject);
begin
// プリンターの順序を指定する
Printer.PrinterIndex := Printer.Printers.IndexOf(ComboBox1.Text);
// 印刷
Print;
end;
<③OLEでExcelを操作してプリンターを指定して印刷>
OLEで印刷時は、Excelの印刷機能を使うためPrinterIndexを直接指定しても有効になりません。
Excelにどのプリンターで印刷するか指示する必要があります。
以下のように「PrintOut」メソッドのパラメータで、プリンター名を指定します。
※ComboBox1のItemsには上記①のプリンターの一覧が入っている前提
※Delphi OLEのExcel操作術 第2回:印刷編も参照
procedure TForm1.Button2Click(Sender: TObject);
var // 「OLEのExcel操作術」各Tips共通で使用する変数宣言
i, j: Integer;
MsExcel: OleVariant; // ExcelのOLE変数
MsApplication: OleVariant; // アプリケーションのOLE変数
WBook: OleVariant; // ブックのOLE変数
WSheet: OleVariant; // シートのOLE変数
begin
// Excel起動
MsExcel := CreateOleObject('Excel.Application');
MsApplication := MsExcel.Application;
MsApplication.Visible := True; // 処理を画面に見せない場合はFalseにする
// 新規ファイルを作成
WBook := MsApplication.WorkBooks.Add ;
WSheet := WBook.ActiveSheet;
// Excelのセルに文字列を出力(例)
for i := 1 to 5 do
begin
for j := 1 to 20 do
begin
WSheet.Cells[j,i].Value := IntToStr(j) + ',' + IntToStr(i);
end;
end;
// プリンター名を指定して印刷(ActivePrinterがプリンター名、他の引数は省略可)
WSheet.PrintOut(ActivePrinter:=ComboBox1.Text);
end;
<④ Fast Reportでプリンターを指定して印刷>
Fast Reportでも同様にPrinterIndexを直接指定しても有効になりません。
「PrintOptions.Printer」プロパティにプリンター名を指定します。
※ComboBox1のItemsには上記①のプリンターの一覧が入っている前提
procedure TForm1.Button3Click(Sender: TObject);
begin
// プリンター名を指定する
frxReport1.PrintOptions.Printer := ComboBox1.Text;
// 印刷
frxReport1.PrepareReport;
frxReport1.Print;
end;