下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、如何快速自動生成并定制報表在各種管理信息系統(tǒng)應用中,需要產(chǎn)生大量的報表,通常的做法是由編程人員一個個手工制 作,工作效率較低;另外,用戶希望能夠?qū)⒃趹贸绦蚶锊樵兊玫降慕Y(jié)果生成報表以便打印。 為了解決以上兩種問題,本文利用動態(tài)生成 技術(shù)實現(xiàn)了快速自動產(chǎn)生報表,允許用戶手工對報表進行修飾,并將實現(xiàn)過程封裝成一個類。1設(shè)計思路使用過C+ Builder或Delphi的編程人員知道,有一個 TDBGrid控件,它能以表格的形式 顯示和操作用戶查詢的數(shù)據(jù)記錄;而要制作一個可供打印的報表,那么需要使用TQuickRep控件,在它上面增加 TQRLabel、TQRDBText、TQRShape等控件,設(shè)置
2、它們對應的數(shù)據(jù)集、 數(shù)據(jù)字段等屬性,然后編排它們的位置,以表格或其它格式顯示出來供預覽和打印,這是一個很繁瑣的過程。有時,用戶希望能將查詢出來的顯示在TDBGrid控件的數(shù)據(jù)打印出來,按照以往的做法,就需要由編程人員按照TDBGrid的顯示內(nèi)容手工設(shè)計報表。在這里,本文利用動態(tài)生成技術(shù),讀出TDBGrid的有關(guān)顯示信息,在 TQuickRep控件里動態(tài)生成相應 的TQRLabel、TQRDBText、TQRShape等控件,設(shè)置各字段的標題和數(shù)據(jù)以及表格分割條。 這是完全可行的,因為在 C+ Builder里所有的控件都可以由程序 動態(tài)生成,不僅僅是在 設(shè)計階段才產(chǎn)生的。另外,如果用戶對產(chǎn)生的
3、報表表格布局不太滿意,本文提供了接口使用戶可對報表進行手工調(diào)整,調(diào)整表格的高度、 寬度等布局,實現(xiàn)用戶對報表的一定程度的定制。利用C+的封裝性特點,將自動產(chǎn)生并定制報表的實現(xiàn)封裝成一個新類TGridPrint,對外提供編程人員關(guān)心的公用接口,屏蔽了內(nèi)部信息和具體實現(xiàn),表達了面向?qū)ο蟮脑O(shè)計思想,為編程人員帶來方便。 編程人員還可以在它根底上進一步擴充功能。這樣設(shè)計的新類減輕了編程人員的工作量,同時為用戶提供了定制報表的接口,提高了報表的質(zhì)量和用戶參與的積極性。2 實現(xiàn)過程自動產(chǎn)生并定制報表的實現(xiàn)過程包括自動產(chǎn)生和定制兩局部。新類的定義和實現(xiàn)分別在GridPrint.h GridPrint.cpp
4、 文件里,另包含 3 個文件 RepRst.h、RepRst.cpp、RepRst.dfm,它們是 已產(chǎn)生的一個窗口 FrmRepRst,在它里面已增加一個 TQuickRep控件,它的屬性 Ba nds的各 子屬性的值全為true。2.1自動產(chǎn)生報表先定義一個表示表格某一列信息的結(jié)構(gòu),在報表里一列有固定標題和顯示的數(shù)據(jù)文本兩種信息,為了能畫出表格,每一列固定標題欄和數(shù)據(jù)欄右邊分別增加一個分隔條。在類TGridPrint的構(gòu)造函數(shù)里,先根據(jù)傳入的TQuickRep *pSrcQuickRep報表指針,TDBGrid * pSrcDBGrid數(shù)據(jù)表格指針,TQRBand *SrcTitleBan
5、d1 報表中的總標題欄指針,TQRBand*SrcColumnHeaderBand1報表中的字段標題欄指針,TQRBand * SrcDetailBand1報表中的數(shù)據(jù)欄指針參數(shù)設(shè)置類的私有變量。再動態(tài)生成并設(shè)置總標題文本、字段標題欄矩形框、 數(shù)據(jù)欄矩形框的屬性。然后通過一個循環(huán),讀出TDBGrid中各字段的標題和數(shù)據(jù)信息,|動態(tài)生成報表中各字段的標題標簽 控件、數(shù)據(jù)文本控件以及對應的表格分割豎條|控件。在類的 析構(gòu)函數(shù)里,刪除所有由構(gòu)造函數(shù)動態(tài)生成的對象。類的打印預覽函數(shù)實現(xiàn)報表的打印預覽 功能。其它的函數(shù)說明略。自動生成報表類的定義GridPrint.h#include 包含的相關(guān)頭文件#
6、in clude #in clude#i nclude#i ncludetypedef struct tagFieldType /表示表格某一列信息的結(jié)構(gòu)AnsiString sTitle; /字段標題名稱int iWidth; /表格單元的寬度TQRLabel *pLabel; /字段標題控件TQRDBText *pDBText; /顯示的數(shù)據(jù)控件TQRShape *pShapeTitle, *pShapeData; /字段標題和數(shù)據(jù)的表格分隔條 NEWFIELDTYPE;class TGridPri ntpublic:TGridPrint(TQuickRep *pSrcQuickRep,T
7、DBGrid * pSrcDBGrid,TQRBand *SrcTitleBand1, TQRBand *SrcColumnHeaderBand1,TQRBand * SrcDetailBand1); /構(gòu)造函數(shù)TGridPri nt();析構(gòu)函數(shù)void DoPreview(); /報表的打印預覽void SetPrntTitle(AnsiString sTitle); /手工設(shè)置表格的總標題void SetColumnsWidth(int *ColumnsWidth); /手工設(shè)置表格各列寬度void SetHeadRectHeight(int iHeight); /手工設(shè)置字段標題行的高
8、度void SetDetailRectHeight(int iHeight); /手工設(shè)置數(shù)據(jù)行的高度private:TDBGrid * pDBGrid; 將要顯示的 DBGridTDataSet * pDataSet; /DBGrid 對應數(shù)據(jù)集TQuickRep * pQuickRep; 報表控件TQRBand * TitleBand1; 報表的總標題欄TQRBand * ColumnHeaderBand1; 報表的字段標題欄TQRBand * DetailBand1; 報表的數(shù)據(jù)欄TQRLabel * pTitleLabel; /總標題控件TQRShape * pHeadRect, *
9、pDetailRect; 整個字段標題欄、數(shù)據(jù)欄的表格矩形控件int iHeadRectHeight, iDetailRectHeight; 對應表格矩形框的高度,它們寬度相同int _iTotalWidth; /整個表格的總寬度int _iIntClearanee; /表格內(nèi)部數(shù)據(jù)列到左表格的距離int _iFieldCount; /將要打印的字段數(shù)目NEWFIELDTYPE _arrayFieldType40; /支持到 40 個字段的打印void AutoAdjustColumnsWidth(); /程序自動調(diào)整各列寬度;類的主要公用方法的實現(xiàn)GridPrint.cppTGridPrin
10、t:TGridPrint(TQuickRep* pSrcQuickRep,TDBGrid * pSrcDBGrid,TQRBand *SrcTitleBand1, TQRBand *SrcColumnHeaderBand1,TQRBand * SrcDetailBandl) 構(gòu)造函數(shù) int i,PreLeft;pQuickRep = pSrcQuickRep; /根據(jù)傳入?yún)?shù)設(shè)置私有變量pDBGrid = pSrcDBGrid;pDataSet = pDBGrid->DataSource->DataSet; pQuickRep->DataSet = pDataSet;Tit
11、leBa ndl = SrcTitleBa ndl;Colu mnH eaderBa nd1 = SrcColu mnH eaderBa ndl;DetailBand仁 SrcDetailBandl;PTitleLabel = new TQRLabel(pQuickRep); 生成并設(shè)置總標題標簽的屬性 pTitleLabel->Pare nt = TitleBa nd1;pTitleLabel->Caption ="報表標題" pTitleLabel->Left= (TitleBand1->Width - pTitleLabel->Width
12、)/2; memset(_arrayFieldType,0,sizeof(NEWFIELDTYPE)*40);_iTotalWidth=0; 計算出表格各列單元寬度和整個表格的總寬度for(i=0; i< pDBGrid->FieldCount;i+) _arrayFieldTypei.iWidth=pDBGrid->Columns->ltemsi->Width;_iTotalWidth += _arrayFieldTypei.iWidth; if(_iTotalWidth > TitleBand1->Width) /如果原DBGird各列寬度和大于總
13、標題欄寬度,就調(diào)整各列寬度_iTotalWidth= TitleBa nd1->Width;AutoAdjustColum nsWidth(); PreLeft= ( TitleBand1->Width - _iTotalWidth)/2; 使整個表格居中pHeadRect= new TQRShape(pSrcQuickRep); 生成并設(shè)置字段標題欄的矩形框 pHeadRect->Pare nt= ColumnH eaderBa nd1;pHeadRect->Left = PreLeft; pHeadRect->Top = 0; pHeadRect->Wi
14、dth = _iTotalWidth; pHeadRect->Height= pHeadRect->Pare nt->Height; pDetailRect= new TQRShape(pSrcQuickRep); /生成設(shè)置數(shù)據(jù)行的矩形框 pDetailRect->Pare nt= DetailBa nd1;pDetailRect->Left = PreLeft; pDetailRect->Top = -1;pDetailRect->Width = _iTotalWidth; pDetailRect->Height= pDetailRect-&
15、gt;Pare nt->Height+1 _iI ntCleara nce= 1;_iFieldCo un t= pDBGrid->FieldCou nt; / 設(shè)置表格總列數(shù)for(i=0; i< _iFieldCount;i+)動態(tài)生成各字段 /該字段的固定標題欄_arrayFieldTypei.pLabel= new TQRLabel(pQuickRep); / 標題控件 _arrayFieldTypei.pLabel->Pare nt= ColumnH eaderBa nd1;/字段標題名稱_arrayFieldTypei.pLabel->Capti on
16、=pDBGrid->Colu mn s->Itemsi->Title->Capti on;/字段標題的字體_arrayFieldTypei.pLabel-> Font=pDBGrid->Colu mn s->Itemsi->Title-> Font;_arrayFieldTypei.pLabel->Alig nment=pDBGrid->Colu mn s->Itemsi->Title->Alig nment;/ 對齊方式_arrayFieldTypei.pLabel->Left = PreLeft+_i
17、I ntCleara nee;_arrayFieldTypei.pLabel->Width = _arrayFieldTypei.iWidth-2*_il ntCleara nee; _arrayFieldTypei.pLabel->Height=_arrayFieldTypei.pLabel-> Fon t->Height;_arrayFieldTypei.pLabel->Top= pHeadRect->Top+(pHeadRect->Height+_arrayFieldTypei.pLabel->Height)/2;_arrayFieldTy
18、pei.pShapeTitle= new TQRShape(pQuickRep); /該字段右邊的分隔豎條 _arrayFieldTypei.pShapeTitle->Pare nt= ColumnH eaderBa nd1;_arrayFieldTypei.pShapeTitle->Left = PreLeft + _arrayFieldTypei.iWidth;_arrayFieldTypei.pShapeTitle->Top = 0;_arrayFieldTypei.pShapeTitle->Width= 1;if( i = pDBGrid->FieldCo
19、unt-1) /最后一列的分隔豎條寬度為0_arrayFieldTypei.pShapeTitle->Width= 0; _arrayFieldTypei.pShapeTitle->Height=_arrayFieldTypei.pShapeTitle->Pare nt->Height;顯示的數(shù)據(jù)欄_arrayFieldTypei.pDBText= new TQRDBText(pQuickRep); 該字段對應的文本控件 _arrayFieldTypei.pDBText->Pare nt = DetailBa nd1;_arrayFieldTypei.pDBTex
20、t->DataSet = pDataSet; / 數(shù)據(jù)集_arrayFieldTypei.pDBText->DataField = pDBGrid->Colu mn s->ltemsi->FieldName;字段名_arrayFieldTypei.pDBText->Fo nt = pDBGrid->Colu mn s->Itemsi->Fo nt;/ 字體_arrayFieldTypei.pDBText->Alig nment=pDBGrid->Colu mn s->ltemsi->Alig nment;對齊方式_a
21、rrayFieldTypei.pDBText->Left = PreLeft+ln tCleara nee; _arrayFieldTypei.pDBText->Width = _arrayFieldTypei.iWidth-2*_il ntCleara nee; _arrayFieldTypei.pDBText->Height=_arrayFieldTypei.pDBText->Fo nt->Height;_arrayFieldTypei.pDBText->Top= pDetailRect->Top+(pDetailRect->Height+_
22、arrayFieldTypei.pDBText->Height)/2;_arrayFieldTypei.pShapeData= new TQRShape(pQuickRep); 該數(shù)據(jù)右邊的分隔豎條 _arrayFieldTypei.pShapeData->Pare nt= DetailBa nd1;_arrayFieldTypei.pShapeData->Left = PreLeft+_arrayFieldTypei.iWidth; _arrayFieldTypei.pShapeData->Top = 0;_arrayFieldTypei.pShapeData->
23、;Width= 1;if( i= pDBGrid->FieldCount-1)/最后一列的分隔豎條寬度為 0_arrayFieldTypei.pShapeData->Width= 0; _arrayFieldTypei.pShapeData->Height=_arrayFieldTypei.pShapeData->Pare nt->Height;PreLeft= _arrayFieldTypei.pShapeTitle->Left;/ 以下字段的左位置TGridPri nt:TGridPri nt()/ 析構(gòu)函數(shù) delete pTitleLabel; delete pHeadRect; delete pDetailRect;for(int i=0; i< pDBGrid->FieldCount;i+) delete _arrayFieldTypei.pDBText; delete _arrayFieldTypei.pShapeData;delete _arrayFieldTypei.pLabel; delete _arrayFieldTypei.pShapeTitle; void TGridPrint:DoPreview() /打印預覽函數(shù) pQuickRep->Preview(); 2
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 17、監(jiān)控改造工程重點及難點分析
- 混凝土外觀質(zhì)量缺陷分析
- 變頻技術(shù)及應用 課件 學習情境3、4 變頻器的基本調(diào)試、變頻器的運行調(diào)試
- 二零二五年度藝術(shù)展覽館租賃合同共同展覽與藝術(shù)交流3篇
- 20202021學年高中數(shù)學北師大版選修2-1課件第一章章末優(yōu)化總結(jié)
- 2024年隴南地區(qū)人民醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫頻考點附帶答案
- 2024年濟寧職業(yè)技術(shù)學院高職單招語文歷年參考題庫含答案解析
- 2024年陽泉煤業(yè)(集團)有限責任公司總醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫頻考點附帶答案
- 2024年陽春市婦幼保健院高層次衛(wèi)技人才招聘筆試歷年參考題庫頻考點附帶答案
- 2024年滄州職業(yè)技術(shù)學院高職單招職業(yè)適應性測試歷年參考題庫含答案解析
- 藥品集中采購教育培訓
- 《攝影入門基礎(chǔ)知識》課件
- 門禁系統(tǒng)施工規(guī)范
- 醫(yī)療器械(耗材)項目投標服務(wù)投標方案(技術(shù)方案)
- 《如何調(diào)節(jié)情緒》課件
- 焊接操作規(guī)范培訓
- 振動試驗大綱模板
- 隨班就讀評價表
- 清理化糞池施工方案
- 中國地理空白圖(政區(qū)、分省輪廓、地形、鐵路空白圖)-(3)1
- 猜歌名教學講解課件
評論
0/150
提交評論