QuickReport 2.0 內建的預覽視窗為英文介面,嵌入中文軟體時顯得不專業。由於 Delphi 未提供預覽視窗原始碼(QRPrntr.pas 為編譯單元),唯有自行繼承 TForm 並整合 TQRPreview 元件重構。本文提供完整步驟與核心程式碼,實作功能等同、介面中文化的預覽視窗。
TMyPreview。TToolBar,加入工具按鈕:列印、列印設定、儲存、開啟、縮放(全頁/實際大小/頁寬)、翻頁(首/上/下/尾)、關閉。TPanel(alBottom)置放 TProgressBar(左)與狀態 TPanel(右),顯示頁碼與載入進度。TQRPreview(alClient)。TOpenDialog(濾網 *.QR)與 TSaveDialog(濾網 *.QR|*.TXT|*.HTM|*.CSV)。OnClick 事件,呼叫 TQRPreview 對應方法。在報表表單的 OnPreview 事件中:
procedure TRptForm.RptFormPreview(Sender: TObject);
begin
with TMyPreview.Create(Application) do
begin
QRPreview1.QRPrinter := TQRPrinter(Sender);
CurRep := Self; { 保留報表參考供匯出使用 }
Show;
end;
end;
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.
FormClose 設 Action := caFree 並釋放 CurRep 參考。Quickrpt → QuickRep,qrprntr → QRPrntr。TQRAsciiExportFilter → TQRTextExportFilter),請參考安裝目錄下的 QRExport.pas。TQRPreview 新增 ZoomMode 屬性(zmFitPage/zmFitWidth/zmCustom),可簡化縮放邏輯。自訂預覽視窗不僅解決語言問題,更能整合企業專屬功能(如浮水印、數位簽章、直接寄信)。掌握 TQRPreview 與 TQRPrinter 的互動模式,是 Delphi 報表開發進階的關鍵技能。