FastReport VCLでプリンタの用紙サイズを指定したい
問題
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を指定して印刷を行います。