Migaro. 技術Tips

                       

ミガロ. 製品の技術情報
IBMiの活用に役立つ情報を掲載!


【Delphi】印刷処理に使うプリンターの設定手順

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;