Borland C++ Builder是基於C++語言的可視化編程環境,它提供了可重用組件庫和一系列RAD設計工具,使得編程者只需用少量的手工代碼就可以創建出高效的Windows應用程序,尤其是復雜的數據庫訪問應用程序,因此深受軟件開發人員的喜愛。
在開發數據庫訪問應用程序時,會經常涉及到報表的打印問題。C++ Builder中提供了Quick Report(快速報表)組件供編程人員設計報表。Quick Report是挪威的QuSoft AS公司專門為C++ Builder設計的用於制作報表的一組控件,在C++ Builder中關於Quick Report的幫助文檔不是很詳細。另外它與C++ Builder的其他控件的風格也不太一致。直接使用Quick Report的報表預覽功能總是不能達到令人滿意的效果,因此有必要自定義快速報表的預覽窗口。
設置預覽窗口
新建工程,在Form1窗體上添加一個ToolBar控件,並在其上添加以下按鈕:“打印”、“打印設置”、
“上一頁” 、“下一頁”、“放大”、“縮小”和“關閉”。 在Form1窗體上添加一個Panel控件,對齊方式設為alBottom,再在此Panel控件上添加一個ProgressBar控件(對齊方式設為alLeft)和一個Panel控件(Name 為Panel2,對齊方式設為alRight,BevelOuter設為bvLowered),這兩個控件分別用來顯示報表裝載進度和其他提示信息。在Form1窗體上添加一個QRPreview控件,對齊方式設為alClient。
再新建一個窗體,設其Name為Form2, 在該窗體上添加TQuickRep控件,設其Name為QuickRep1,其PrinterSetting中的Units屬性設為mm(以毫米為計量單位),然後建立報表。
編程實現
1.在Form2上選擇QuickRep1,在其事件中選擇OnPreview,輸入以下代碼:
Form1->QRPreview1->QRPrinter=Form2->QuickRep1->QRPrinter;
2.在Form1的頭文件中找到對象TForm1的定義,在其中添加以下的代碼:
int OldPaperSize;
int OldOrientation;
int OldTop;
int OldBottom;
int OldLeft;
int OldRight;
void RefreshPanel();
3.選擇Form1的Activate事件,輸入以下代碼:
//初始化
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->Top
Margin*100;
OldBottom=Form2->QuickRep1->Page->
BottomMargin*100;
Form2->QuickRep1->Prepare();
RefreshPanel();
Form2->QuickRep1->Preview();
4.在Form1中添加更新提示代碼:
void TForm1::RefreshPanel()
{ //更新提示信息
Panel2->Caption=“第”+IntToStr(Form1->QRPreview1->PageNumber)+“頁”+“共” + IntToStr(Form2->QuickRep1->PageNumber)+“頁”;
}
5.從Form1中選擇QRPreview1,在其事件中選擇OnProgressUpdate,輸入以下代碼:
//顯示報表裝載進度
ProgressBar1->Position=Progress;
RefreshPanel();
6.打印:
Form2->QuickRep1->Print();
7.打印設置:
DEVMODE *pDev;
LPPAGESETUPDLG mylp=new PAGESETUPDLG;
memset((void *)mylp,0,sizeof
(PAGESETUPDLG));
mylp->lStructSize=sizeof(PAGESETUPDLG);
mylp->hwndOwner=this->Handle;
mylp->Flags=PSD_RETURNDEFAULT;
PageSetupDlg( mylp );
if (mylp->hDevMode!=NULL){
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;
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->Bottom
Margin=OldBottom/100;
GlobalUnlock(mylp->hDevMode);
}
GlobalFree(mylp->hDevMode);
}
delete mylp;
QRPreview1->PageNumber=1;
Form2->QuickRep1->Prepare();
Form2->QuickRep1->Preview();
8.向上翻頁:
//上一頁
if(QRPreview1->PageNumber > 1)
QRPreview1->PageNumber--;
RefreshPanel();
9.向下翻頁:
//下一頁
if(QRPreview1->PageNumber < Form2->
QuickRep1->PageNumber)
QRPreview1->PageNumber++;
RefreshPanel();
10.放大處理:
//放大
if(QRPreview1->Zoom< 200)
QRPreview1->Zoom+=5;
11.縮小處理:
//縮小
if(QRPreview1->Zoom>5)
QRPreview1->Zoom-=5;
小 結
該方法的核心是使用了Win32 API函數PageSetupDlg(),利用該函數可以獲取頁面設置的缺省值,包括紙張大小、打印方向以及上下左右空白邊的大小等,也可以彈出頁面設置對話框來修改這些值。