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

C++ Builder 自訂 QuickReport 預覽視窗

     編輯:關於C++

建立功能完整的報表預覽視窗

QuickReport 內建預覽功能有限,本文示範自建預覽表單 (Form1) 包含工具列按鈕 (列印、頁面設定、上/下頁、縮放、關閉)、進度列、頁碼顯示區,並整合報表設計表單 (Form2) 的 TQuickRep。

介面配置 (Form1)

  • TToolBar + 按鈕:列印、頁面設定、上一頁、下一頁、放大、縮小、關閉
  • TPanel (alBottom) 含 TProgressBar (alLeft) + TPanel (alRight) 顯示頁碼
  • TQRPreview (alClient) 佔滿客戶區

核心程式碼節錄

Form2 (報表設計表單) OnPreview 事件

Form1->QRPreview1->QRPrinter = Form2->QuickRep1->QRPrinter;

Form1 變數與初始化 (OnActivate)

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();

頁面設定 (使用 PageSetupDlg API)

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() 重新排版。

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