首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

自訂 QuickReport 列印預覽視窗:打造中文化專業列印體驗

     編輯:Delphi

前言

QuickReport 2.0 內建的預覽視窗為英文介面,嵌入中文軟體時顯得不專業。由於 Delphi 未提供預覽視窗原始碼(QRPrntr.pas 為編譯單元),唯有自行繼承 TForm 並整合 TQRPreview 元件重構。本文提供完整步驟與核心程式碼,實作功能等同、介面中文化的預覽視窗。

設計步驟概覽

  1. 新增表單 TMyPreview。
  2. 放置 TToolBar,加入工具按鈕:列印、列印設定、儲存、開啟、縮放(全頁/實際大小/頁寬)、翻頁(首/上/下/尾)、關閉。
  3. 底部 TPanel(alBottom)置放 TProgressBar(左)與狀態 TPanel(右),顯示頁碼與載入進度。
  4. 客戶區放置 TQRPreview(alClient)。
  5. 加入 TOpenDialog(濾網 *.QR)與 TSaveDialog(濾網 *.QR|*.TXT|*.HTM|*.CSV)。
  6. 撰寫各按鈕 OnClick 事件,呼叫 TQRPreview 對應方法。

核心程式碼

1. 呼叫自訂預覽視窗

在報表表單的 OnPreview 事件中:

procedure TRptForm.RptFormPreview(Sender: TObject);
begin
  with TMyPreview.Create(Application) do
  begin
    QRPreview1.QRPrinter := TQRPrinter(Sender);
    CurRep := Self;           { 保留報表參考供匯出使用 }
    Show;
  end;
end;

2. TMyPreview 單元完整實作

unit Myprv;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls, ToolWin, qrprntr, Quickrpt, StdCtrls, ExtCtrls, qrextra, qrhtml;

type
  TMyPreview = class(TForm)
    QRPreview1: TQRPreview;
    ToolBar1: TToolBar;
    ToolButton1: TToolButton;  { 列印設定 }
    ToolButton2: TToolButton;  { 列印 }
    ToolButton3: TToolButton;  { 縮放至全頁 }
    ToolButton4: TToolButton;  { 實際大小 100% }
    ToolButton5: TToolButton;  { 縮放至頁寬 }
    ToolButton6: TToolButton;  { 首頁 }
    ToolButton7: TToolButton;  { 上一頁 }
    ToolButton8: TToolButton;  { 下一頁 }
    ToolButton9: TToolButton;  { 尾頁 }
    ToolButton10: TToolButton; { 儲存 }
    ToolButton11: TToolButton; { 開啟 }
    ToolButton12: TToolButton; { 關閉視窗 }
    Panel1: TPanel;
    ProgressBar1: TProgressBar;
    Panel2: TPanel;
    OpenDlg1: TOpenDialog;
    SaveDlg1: TSaveDialog;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure QRPreview1PageAvailable(Sender: TObject; PageNum: Integer);
    procedure QRPreview1ProgressUpdate(Sender: TObject; Progress: Integer);
    { 工具按鈕事件 }
    procedure ToolButton1Click(Sender: TObject);   { 列印設定 }
    procedure ToolButton2Click(Sender: TObject);   { 列印 }
    procedure ToolButton3Click(Sender: TObject);   { 縮放至全頁 }
    procedure ToolButton4Click(Sender: TObject);   { 100% }
    procedure ToolButton5Click(Sender: TObject);   { 頁寬 }
    procedure ToolButton6Click(Sender: TObject);   { 首頁 }
    procedure ToolButton7Click(Sender: TObject);   { 上一頁 }
    procedure ToolButton8Click(Sender: TObject);   { 下一頁 }
    procedure ToolButton9Click(Sender: TObject);   { 尾頁 }
    procedure ToolButton10Click(Sender: TObject);  { 儲存 }
    procedure ToolButton11Click(Sender: TObject);  { 開啟 }
    procedure ToolButton12Click(Sender: TObject);  { 關閉 }
    procedure SaveDlg1TypeChange(Sender: TObject);
  private
    FPageCount: Integer;
    procedure UpdatePanelShow;
  public
    CurRep: TQuickRep;   { 當前預覽報表 }
  end;

var
  MyPreview: TMyPreview;

implementation

{$R *.DFM}

procedure TMyPreview.FormCreate(Sender: TObject);
begin
  OpenDlg1.Filter := 'QuickReport 檔案 (*.QR)|*.QR';
  SaveDlg1.Filter := 'QR 檔案 (*.QR)|*.QR|文字檔 (*.TXT)|*.TXT|HTML (*.HTM)|*.HTM|CSV (*.CSV)|*.CSV';
  SaveDlg1.DefaultExt := 'QR';
  FPageCount := 0;
end;

procedure TMyPreview.UpdatePanelShow;
begin
  Panel2.Caption := Format('第 %d 頁 / 共 %d 頁', [QRPreview1.PageNumber, FPageCount]);
end;

{ 頁面產生時取得總頁數 }
procedure TMyPreview.QRPreview1PageAvailable(Sender: TObject; PageNum: Integer);
begin
  FPageCount := PageNum;
  UpdatePanelShow;
end;

{ 載入進度更新 }
procedure TMyPreview.QRPreview1ProgressUpdate(Sender: TObject; Progress: Integer);
begin
  ProgressBar1.Position := Progress;
end;

{ === 工具列按鈕實作 === }
procedure TMyPreview.ToolButton3Click(Sender: TObject);  { 縮放至全頁 }
begin
  QRPreview1.ZoomToFit;
end;

procedure TMyPreview.ToolButton4Click(Sender: TObject);  { 100% }
begin
  QRPreview1.Zoom := 100;
end;

procedure TMyPreview.ToolButton5Click(Sender: TObject);  { 頁寬 }
begin
  QRPreview1.ZoomToWidth;
end;

procedure TMyPreview.ToolButton6Click(Sender: TObject);  { 首頁 }
begin
  QRPreview1.PageNumber := 1;
  UpdatePanelShow;
end;

procedure TMyPreview.ToolButton7Click(Sender: TObject);  { 上一頁 }
begin
  if QRPreview1.PageNumber > 1 then
  begin
    QRPreview1.PageNumber := QRPreview1.PageNumber - 1;
    UpdatePanelShow;
  end;
end;

procedure TMyPreview.ToolButton8Click(Sender: TObject);  { 下一頁 }
begin
  if QRPreview1.PageNumber < FPageCount then
  begin
    QRPreview1.PageNumber := QRPreview1.PageNumber + 1;
    UpdatePanelShow;
  end;
end;

procedure TMyPreview.ToolButton9Click(Sender: TObject);  { 尾頁 }
begin
  QRPreview1.PageNumber := FPageCount;
  UpdatePanelShow;
end;

procedure TMyPreview.ToolButton1Click(Sender: TObject);  { 列印設定 }
begin
  QRPreview1.QRPrinter.PrintSetup;
end;

procedure TMyPreview.ToolButton2Click(Sender: TObject);  { 列印 }
begin
  QRPreview1.QRPrinter.Print;
end;

procedure TMyPreview.ToolButton10Click(Sender: TObject); { 儲存 }
begin
  if SaveDlg1.Execute then
  begin
    if (SaveDlg1.FilterIndex > 1) and (CurRep = nil) then Exit;
    case SaveDlg1.FilterIndex of
      1: QRPreview1.QRPrinter.Save(SaveDlg1.FileName);                    { *.QR }
      2: CurRep.ExportToFilter(TQRAsciiExportFilter.Create(SaveDlg1.FileName));  { *.TXT }
      3: CurRep.ExportToFilter(TQRHTMLExportFilter.Create(SaveDlg1.FileName));   { *.HTM }
      4: CurRep.ExportToFilter(TQRCSVExportFilter.Create(SaveDlg1.FileName));    { *.CSV }
    end;
  end;
end;

procedure TMyPreview.ToolButton11Click(Sender: TObject); { 開啟 }
begin
  if OpenDlg1.Execute then
    QRPreview1.QRPrinter.Load(OpenDlg1.FileName);
end;

procedure TMyPreview.ToolButton12Click(Sender: TObject); { 關閉視窗 }
begin
  Close;
end;

procedure TMyPreview.SaveDlg1TypeChange(Sender: TObject);
begin
  case SaveDlg1.FilterIndex of
    1: SaveDlg1.DefaultExt := '.QR';
    2: SaveDlg1.DefaultExt := '.TXT';
    3: SaveDlg1.DefaultExt := '.HTM';
    4: SaveDlg1.DefaultExt := '.CSV';
  end;
end;

procedure TMyPreview.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  CurRep := nil;
  Action := caFree;
end;

end.

功能亮點

  • 完整中文化:工具提示、狀態列、訊息對話框皆為繁體中文。
  • 多格式匯出:支援 QR 原生、純文字、HTML、CSV 四種格式。
  • 進度顯示:報表產生過程即時更新 ProgressBar。
  • 記憶體安全:FormClose 設 Action := caFree 並釋放 CurRep 參考。

遷移至新版 QuickReport(QR 3/4/5/6)提示

  • 元件名稱空間變更:Quickrpt → QuickRep,qrprntr → QRPrntr。
  • 匯出濾鏡類別可能改名(如 TQRAsciiExportFilter → TQRTextExportFilter),請參考安裝目錄下的 QRExport.pas。
  • TQRPreview 新增 ZoomMode 屬性(zmFitPage/zmFitWidth/zmCustom),可簡化縮放邏輯。

結語

自訂預覽視窗不僅解決語言問題,更能整合企業專屬功能(如浮水印、數位簽章、直接寄信)。掌握 TQRPreview 與 TQRPrinter 的互動模式,是 Delphi 報表開發進階的關鍵技能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved