Delphi 10 Seattle中如何正确处理QuickReport预览的用户打印设置?
Delphi 10 Seattle + QuickReport 打印机设置处理方案
一、读取PrinterSetupDialog的用户选择
直接通过TPrinterSetupDialog的内置属性即可获取用户选择的所有参数,无需操作底层的QRPrinter或Printer对象:
- 打印机索引:
PrinterSetupDialog1.PrinterIndex(对应系统打印机列表的索引) - 打印方向:
PrinterSetupDialog1.Orientation(取值poPortrait/poLandscape) - 纸张格式:
PrinterSetupDialog1.PaperSize(枚举类型,比如信封DL对应psEnvelopeDL、信封C5对应psEnvelopeC5) - 自定义纸张尺寸:若
PaperSize = psCustom,则通过PaperWidth和PaperLength获取具体尺寸
建议用类级变量保存这些设置,方便后续复用:
var FSelectedPrinterIdx: Integer; FSelectedOrientation: TPrinterOrientation; FSelectedPaperSize: TPrinterPaperSize; FCustomPaperW, FCustomPaperL: Integer;
在对话框确认后读取并保存:
if PrinterSetupDialog1.Execute then begin FSelectedPrinterIdx := PrinterSetupDialog1.PrinterIndex; FSelectedOrientation := PrinterSetupDialog1.Orientation; FSelectedPaperSize := PrinterSetupDialog1.PaperSize; if FSelectedPaperSize = psCustom then begin FCustomPaperW := PrinterSetupDialog1.PaperWidth; FCustomPaperL := PrinterSetupDialog1.PaperLength; end; end;
二、将用户选择应用到报表预览
通过TQuickRep的PrinterSettings属性统一设置,无需直接修改QRPrinter对象,设置完成后需重启预览(因为原预览是基于旧设置生成的):
procedure TMainForm.ApplySettingsToReport(AQuickRep: TQuickRep); begin // 绑定打印机 AQuickRep.PrinterSettings.PrinterIndex := FSelectedPrinterIdx; // 设置打印方向 AQuickRep.PrinterSettings.Orientation := FSelectedOrientation; // 设置纸张格式 AQuickRep.PrinterSettings.PaperSize := FSelectedPaperSize; // 处理自定义纸张 if FSelectedPaperSize = psCustom then begin AQuickRep.PrinterSettings.PaperWidth := FCustomPaperW; AQuickRep.PrinterSettings.PaperLength := FCustomPaperL; end; // 重启预览使设置生效 if QRUserPreview1.Visible then begin QRUserPreview1.ClosePreview; AQuickRep.Preview; end; end;
调用时机:在用户确认打印机设置后立即执行,或者打开预览前执行。
三、用用户选择初始化PrinterSetupDialog
打开对话框前,将之前保存的设置赋值给TPrinterSetupDialog的对应属性,即可让对话框默认显示用户上次的选择:
procedure TMainForm.btnSetupPrinterClick(Sender: TObject); begin // 加载保存的设置 PrinterSetupDialog1.PrinterIndex := FSelectedPrinterIdx; PrinterSetupDialog1.Orientation := FSelectedOrientation; PrinterSetupDialog1.PaperSize := FSelectedPaperSize; if FSelectedPaperSize = psCustom then begin PrinterSetupDialog1.PaperWidth := FCustomPaperW; PrinterSetupDialog1.PaperLength := FCustomPaperL; end; if PrinterSetupDialog1.Execute then begin // 保存新选择并应用到报表 FSelectedPrinterIdx := PrinterSetupDialog1.PrinterIndex; FSelectedOrientation := PrinterSetupDialog1.Orientation; FSelectedPaperSize := PrinterSetupDialog1.PaperSize; if FSelectedPaperSize = psCustom then begin FCustomPaperW := PrinterSetupDialog1.PaperWidth; FCustomPaperL := PrinterSetupDialog1.PaperLength; end; ApplySettingsToReport(QuickRep1); end; end;
如果是首次打开,可初始化系统默认打印机的设置:
procedure TMainForm.FormCreate(Sender: TObject); begin // 初始化为系统当前打印机设置 FSelectedPrinterIdx := Printer.PrinterIndex; FSelectedOrientation := Printer.Orientation; FSelectedPaperSize := Printer.PaperSize; if FSelectedPaperSize = psCustom then begin FCustomPaperW := Printer.PaperWidth; FCustomPaperL := Printer.PaperLength; end; end;
内容的提问来源于stack exchange,提问作者szpliter
相关产品推荐
相关产品推荐

