QuickReport 內建預覽功能有限,本文示範自建預覽表單 (Form1) 包含工具列按鈕 (列印、頁面設定、上/下頁、縮放、關閉)、進度列、頁碼顯示區,並整合報表設計表單 (Form2) 的 TQuickRep。
TToolBar + 按鈕:列印、頁面設定、上一頁、下一頁、放大、縮小、關閉TPanel (alBottom) 含 TProgressBar (alLeft) + TPanel (alRight) 顯示頁碼TQRPreview (alClient) 佔滿客戶區Form1->QRPreview1->QRPrinter = Form2->QuickRep1->QRPrinter;
int OldPaperSize, OldOrientation, OldTop, OldBottom, OldLeft, OldRight;
void RefreshPanel(); // 更新頁碼顯示
OldPaperSize = Form2->QuickRep1->Page->PaperSize;
OldOrientation = Form2->QuickRep1->Page->Orientation + 1;
OldLeft = Form2->QuickRep1->Page->LeftMargin * 100;
OldRight = Form2->QuickRep1->Page->RightMargin * 100;
OldTop = Form2->QuickRep1->Page->TopMargin * 100;
OldBottom = Form2->QuickRep1->Page->BottomMargin * 100;
Form2->QuickRep1->Prepare();
RefreshPanel();
Form2->QuickRep1->Preview();
DEVMODE *pDev;
LPPAGESETUPDLG mylp = new PAGESETUPDLG;
memset(mylp, 0, sizeof(PAGESETUPDLG));
mylp->lStructSize = sizeof(PAGESETUPDLG);
mylp->hwndOwner = this->Handle;
mylp->Flags = PSD_RETURNDEFAULT;
PageSetupDlg(mylp); // 取得預設值
if (mylp->hDevMode) {
pDev = (DEVMODE*)GlobalLock(mylp->hDevMode);
pDev->dmPaperSize = OldPaperSize;
pDev->dmOrientation = OldOrientation;
mylp->rtMargin.left = OldLeft; mylp->rtMargin.right = OldRight;
mylp->rtMargin.top = OldTop; mylp->rtMargin.bottom = OldBottom;
GlobalUnlock(mylp->hDevMode);
mylp->Flags = PSD_MARGINS | PSD_INHUNDREDTHSOFMILLIMETERS;
if (PageSetupDlg(mylp)) { // 使用者修改後
pDev = (DEVMODE*)GlobalLock(mylp->hDevMode);
OldPaperSize = pDev->dmPaperSize; if (OldPaperSize > 28) OldPaperSize = 9; // A4
OldOrientation = pDev->dmOrientation;
OldLeft = mylp->rtMargin.left; OldRight = mylp->rtMargin.right;
OldTop = mylp->rtMargin.top; OldBottom = mylp->rtMargin.bottom;
GlobalUnlock(mylp->hDevMode);
Form2->QuickRep1->Page->Orientation = OldOrientation - 1;
Form2->QuickRep1->Page->PaperSize = OldPaperSize;
Form2->QuickRep1->Page->LeftMargin = OldLeft / 100;
Form2->QuickRep1->Page->RightMargin = OldRight / 100;
Form2->QuickRep1->Page->TopMargin = OldTop / 100;
Form2->QuickRep1->Page->BottomMargin = OldBottom / 100;
}
GlobalFree(mylp->hDevMode);
}
delete mylp;
QRPreview1->PageNumber = 1;
Form2->QuickRep1->Prepare();
Form2->QuickRep1->Preview();
// 上一頁
if (QRPreview1->PageNumber > 1) QRPreview1->PageNumber--; RefreshPanel();
// 下一頁
if (QRPreview1->PageNumber < Form2->QuickRep1->PageNumber) QRPreview1->PageNumber++; RefreshPanel();
// 放大
if (QRPreview1->Zoom < 200) QRPreview1->Zoom += 5;
// 縮小
if (QRPreview1->Zoom > 5) QRPreview1->Zoom -= 5;
// 進度更新 (OnProgressUpdate)
ProgressBar1->Position = Progress; RefreshPanel();
核心在於使用 PageSetupDlg API 取得/設定頁面參數 (紙張、方向、邊界),並同步至 TQuickRep 的 Page 屬性,再呼叫 Prepare() 重新排版。