You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 17:03:23