FastReport VCLでプリンタの用紙サイズを指定したい

提供: Support
移動先: 案内検索

問題

FastReport VCLを使用しています。予めプリンタの用紙サイズを指定したいのですが、可能でしょうか。また可能であれば、どのように指定するのでしょうか。

解説

可能です。

TPrinterのGetPrinterメソッドでプリンタの情報を取得し、必要な情報を設定します。 TPrinterのSetPrinterメソッドで、変更を反映させます。

解決

以下、サンプルです。このサンプルではプリンタの用紙サイズをA5にしています。確認のためプリンタの設定のダイアログを出しています。

直接ダイアログを出さずに印刷を行う場合は

  frxReport1.PrintOptions.ShowDialog := False;  
  frxReport1.Print;

のようにダイアログを表示しないよう設定を行います。

// usesに以下が指定されていない場合は追加します。
// frxprinter, Vcl.Printers, Winapi.winspool

procedure TForm1.Button1Click(Sender: TObject);
var
 ADevice, ADriver, APort: array[0..MAX_PATH - 1] of Char;
 ADeviceMode: THandle;
 ADevMode: PDeviceMode;
 FPrinterhandle: THandle;
 mode: Cardinal;
begin
 mode := DM_OUT_BUFFER or DM_IN_BUFFER;

 Printer.GetPrinter(ADevice, ADriver, APort, ADeviceMode);

 ADevMode := GlobalLock(ADeviceMode);
 ADevMode^.dmPaperSize := DMPAPER_A5;
 ADevMode^.dmDefaultSource := DMBIN_AUTO;

 OpenPrinter(ADevice, FPrinterHandle, nil);
 DocumentProperties(0, FPrinterHandle, ADevice, ADevMode^,
 ADevMode^, mode);
 ClosePrinter(FPrinterhandle);
 Tfrxprinter(frxPrinters.Printer).DeviceMode.dmPaperSize := ADevmode^.dmPaperSize;
 TfrxPrinter(frxPrinters.Printer).DeviceMode.dmDefaultSource := ADevmode^.dmDefaultSource;

 GlobalUnlock(ADeviceMode);
 Printer.SetPrinter(ADevice, ADriver, APort, ADeviceMode);

 frxReport1.PrepareReport(true);
 frxReport1.Print;
end;
  • プリンタの種類によっては、コードで指定したプリンタ命令をサポートしていないものもあります。
  • DMPAPER_xxxの名前と、指定できる用紙サイズはMicrosoftのドキュメントをご覧ください。
  • 独自の用紙サイズを扱うのであれば、DMPAPER_USERを指定して印刷を行います。