如何快速自動(dòng)生成并定制報(bào)表_第1頁(yè)
如何快速自動(dòng)生成并定制報(bào)表_第2頁(yè)
如何快速自動(dòng)生成并定制報(bào)表_第3頁(yè)
如何快速自動(dòng)生成并定制報(bào)表_第4頁(yè)
如何快速自動(dòng)生成并定制報(bào)表_第5頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、如何快速自動(dòng)生成并定制報(bào)表西南交通大學(xué)電氣學(xué)院( 610031) 童曉陽(yáng)在各種管理信息系統(tǒng)應(yīng)用中, 需要產(chǎn)生大量的報(bào)表, 通常的做法是由編程人員一個(gè)個(gè)手工制 作,工作效率較低; 另外,用戶希望能夠?qū)⒃趹?yīng)用程序里查詢得到的結(jié)果生成報(bào)表以便打印。 為了解決以上兩種問(wèn)題, 本文利用動(dòng)態(tài)生成技術(shù)實(shí)現(xiàn)了快速自動(dòng)產(chǎn)生報(bào)表, 允許用戶手工對(duì) 報(bào)表進(jìn)行修飾,并將實(shí)現(xiàn)過(guò)程封裝成一個(gè)類。1設(shè)計(jì)思路使用過(guò) C+ Builder 或 Delphi 的編程人員知道,有一個(gè) TDBGrid 控件,它能以表格的形式 顯示和操作用戶查詢的數(shù)據(jù)記錄;而要制作一個(gè)可供打印的報(bào)表,則需要使用 TQuickRep 控件,在它上面增加

2、 TQRLabel、TQRDBText 、TQRShape 等控件,設(shè)置它們對(duì)應(yīng)的數(shù)據(jù)集、 數(shù)據(jù)字段等屬性, 然后編排它們的位置, 以表格或其它格式顯示出來(lái)供預(yù)覽和打印, 這是一 個(gè)很繁瑣的過(guò)程。有時(shí),用戶希望能將查詢出來(lái)的顯示在 TDBGrid 控件的數(shù)據(jù)打印出來(lái), 按照以往的做法,就需要由編程人員按照 TDBGrid 的顯示內(nèi)容手工設(shè)計(jì)報(bào)表。在這里,本 文利用動(dòng)態(tài)生成技術(shù),讀出 TDBGrid 的有關(guān)顯示信息,在 TQuickRep 控件里動(dòng)態(tài)生成相應(yīng) 的 TQRLabel、TQRDBText 、TQRShape 等控件,設(shè)置各字段的標(biāo)題和數(shù)據(jù)以及表格分割條。 這是完全可行的,因?yàn)樵?C+

3、 Builder 里所有的控件都可以由程序動(dòng)態(tài)生成,不僅僅是在設(shè) 計(jì)階段才產(chǎn)生的。 另外, 如果用戶對(duì)產(chǎn)生的報(bào)表表格布局不太滿意, 本文提供了接口使用戶 可對(duì)報(bào)表進(jìn)行手工調(diào)整, 調(diào)整表格的高度、 寬度等布局, 實(shí)現(xiàn)用戶對(duì)報(bào)表的一定程度的定制。 利用 C+ 的封裝性特點(diǎn),將自動(dòng)產(chǎn)生并定制報(bào)表的實(shí)現(xiàn)封裝成一個(gè)新類 TGridPrint ,對(duì)外提 供編程人員關(guān)心的公用接口, 屏蔽了內(nèi)部信息和具體實(shí)現(xiàn), 體現(xiàn)了面向?qū)ο蟮脑O(shè)計(jì)思想, 為 編程人員帶來(lái)方便。 編程人員還可以在它基礎(chǔ)上進(jìn)一步擴(kuò)充功能。 這樣設(shè)計(jì)的新類減輕了編 程人員的工作量, 同時(shí)為用戶提供了定制報(bào)表的接口, 提高了報(bào)表的質(zhì)量和用戶參與的積

4、極 性。2實(shí)現(xiàn)過(guò)程 自動(dòng)產(chǎn)生并定制報(bào)表的實(shí)現(xiàn)過(guò)程包括自動(dòng)產(chǎn)生和定制兩部分。新類的定義和實(shí)現(xiàn)分別在 GridPrint.h GridPrint.cpp 文件里,另包含 3 個(gè)文件 RepRst.h、RepRst.cpp、RepRst.dfm ,它們 是已產(chǎn)生的一個(gè)窗口 FrmRepRst ,在它里面已增加一個(gè) TQuickRep 控件,它的屬性 Bands 的各子屬性的值全為 true 。2.1 自動(dòng)產(chǎn)生報(bào)表 先定義一個(gè)表示表格某一列信息的結(jié)構(gòu), 在報(bào)表里一列有固定標(biāo)題和顯示的數(shù)據(jù)文本兩種信 息,為了能畫出表格, 每一列固定標(biāo)題欄和數(shù)據(jù)欄右邊分別增加一個(gè)分隔條。 在類 TGridPrint 的構(gòu)

5、造函數(shù)里, 先根據(jù)傳入的 TQuickRep *pSrcQuickRep (報(bào)表指針) ,TDBGrid * pSrcDBGrid (數(shù)據(jù)表格指針) ,TQRBand *SrcTitleBand1 (報(bào)表中的總標(biāo)題欄指 針), TQRBand *SrcColumnHeaderBand1 (報(bào)表中的字段標(biāo)題欄指針) ,TQRBand * SrcDetailBand1 (報(bào)表中 的數(shù)據(jù)欄指針) 參數(shù)設(shè)置類的私有變量。 再動(dòng)態(tài)生成并設(shè)置總標(biāo)題文本、 字段標(biāo)題欄矩形框、 數(shù)據(jù)欄矩形框的屬性。然后通過(guò)一個(gè)循環(huán),讀出 TDBGrid 中各字段的標(biāo)題和數(shù)據(jù)信息,動(dòng) 態(tài)生成報(bào)表中各字段的標(biāo)題標(biāo)簽控件、 數(shù)據(jù)文

6、本控件以及對(duì)應(yīng)的表格分割豎條控件。 在類的 析構(gòu)函數(shù)里, 刪除所有由構(gòu)造函數(shù)動(dòng)態(tài)生成的對(duì)象。 類的打印預(yù)覽函數(shù)實(shí)現(xiàn)報(bào)表的打印預(yù)覽 功能。其它的函數(shù)說(shuō)明略。自動(dòng)生成報(bào)表類的定義( GridPrint.h )#include <DBGrids.hpp> / 包含的相關(guān)頭文件#include <Db.hpp>#include <Printers.hpp>#include <QuickRpt.hpp>#include <Qrctrls.hpp>typedef struct tagFieldType / 表示表格某一列信息的結(jié)構(gòu)AnsiStri

7、ng sTitle; / 字段標(biāo)題名稱 int iWidth; / 表格單元的寬度 TQRLabel *pLabel; / 字段標(biāo)題控件 TQRDBText *pDBText; / 顯示的數(shù)據(jù)控件TQRShape *pShapeTitle, *pShapeData; / 字段標(biāo)題和數(shù)據(jù)的表格分隔條 NEWFIELDTYPE;class TGridPrintpublic:TGridPrint(TQuickRep *pSrcQuickRep,TDBGrid * pSrcDBGrid,TQRBand *SrcTitleBand1, TQRBand *SrcColumnHeaderBand1,TQRB

8、and * SrcDetailBand1); / 構(gòu)造函數(shù) TGridPrint(); / 析構(gòu)函數(shù) void DoPreview(); / 報(bào)表的打印預(yù)覽 void SetPrntTitle(AnsiString sTitle); / 手工設(shè)置表格的總標(biāo)題 void SetColumnsWidth(int *ColumnsWidth); / 手工設(shè)置表格各列寬度 void SetHeadRectHeight(int iHeight); / 手工設(shè)置字段標(biāo)題行的高度 void SetDetailRectHeight(int iHeight); / 手工設(shè)置數(shù)據(jù)行的高度 private:TDBG

9、rid * pDBGrid; / 將要顯示的 DBGridTDataSet * pDataSet; /DBGrid 對(duì)應(yīng)數(shù)據(jù)集TQuickRep * pQuickRep; / 報(bào)表控件TQRBand * TitleBand1; / 報(bào)表的總標(biāo)題欄TQRBand * ColumnHeaderBand1; / 報(bào)表的字段標(biāo)題欄TQRBand * DetailBand1; / 報(bào)表的數(shù)據(jù)欄TQRLabel * pTitleLabel; / 總標(biāo)題控件TQRShape * pHeadRect, * pDetailRect; / 整個(gè)字段標(biāo)題欄、數(shù)據(jù)欄的表格矩形控件 int iHeadRectHeigh

10、t, iDetailRectHeight; / 對(duì)應(yīng)表格矩形框的高度,它們寬度相同 int _iTotalWidth; / 整個(gè)表格的總寬度int _iIntClearance; / 表格內(nèi)部數(shù)據(jù)列到左表格的距離int _iFieldCount; / 將要打印的字段數(shù)目NEWFIELDTYPE _arrayFieldType40; / 支持到 40 個(gè)字段的打印 void AutoAdjustColumnsWidth(); / 程序自動(dòng)調(diào)整各列寬度 ;類的主要公用方法的實(shí)現(xiàn)( GridPrint.cpp )TGridPrint:TGridPrint(TQuickRep * pSrcQuickR

11、ep,TDBGrid * pSrcDBGrid,TQRBand *SrcTitleBand1, TQRBand *SrcColumnHeaderBand1,TQRBand * SrcDetailBand1) / 構(gòu)造函數(shù) int i,PreLeft;pQuickRep = pSrcQuickRep; / 根據(jù)傳入?yún)?shù)設(shè)置私有變量 pDBGrid = pSrcDBGrid;pDataSet = pDBGrid->DataSource->DataSet; pQuickRep->DataSet = pDataSet;TitleBand1 = SrcTitleBand1;Column

12、HeaderBand1 = SrcColumnHeaderBand1;DetailBand1= SrcDetailBand1;PTitleLabel = new TQRLabel(pQuickRep); / 生成并設(shè)置總標(biāo)題標(biāo)簽的屬性 pTitleLabel->Parent = TitleBand1;pTitleLabel->Caption = " 報(bào)表標(biāo)題 " pTitleLabel->Left= (TitleBand1->Width - pTitleLabel->Width)/2; memset(_arrayFieldType,0,size

13、of(NEWFIELDTYPE)*40);_iTotalWidth=0; / 計(jì)算出表格各列單元寬度和整個(gè)表格的總寬度f(wàn)or(i=0; i< pDBGrid->FieldCount;i+) _arrayFieldTypei.iWidth= pDBGrid->Columns->Itemsi->Width;_iTotalWidth += _arrayFieldTypei.iWidth; if(_iTotalWidth > TitleBand1->Width) / 如果原 DBGird 各列寬度和大于總標(biāo)題欄寬度,就調(diào)整各列寬度 _iTotalWidth=

14、TitleBand1->Width;AutoAdjustColumnsWidth(); PreLeft= ( TitleBand1->Width - _iTotalWidth)/2; / 使整個(gè)表格居中 pHeadRect= new TQRShape(pSrcQuickRep); / 生成并設(shè)置字段標(biāo)題欄的矩形框 pHeadRect->Parent= ColumnHeaderBand1;pHeadRect->Left = PreLeft; pHeadRect->Top = 0; pHeadRect->Width = _iTotalWidth; pHeadRe

15、ct->Height= pHeadRect->Parent->Height; pDetailRect= new TQRShape(pSrcQuickRep); / 生成設(shè)置數(shù)據(jù)行的矩形框 pDetailRect->Parent= DetailBand1;pDetailRect->Left = PreLeft; pDetailRect->Top = -1;pDetailRect->Width = _iTotalWidth; pDetailRect->Height= pDetailRect->Parent->Height+1 ; _iIn

16、tClearance= 1;_iFieldCount= pDBGrid->FieldCount; / 設(shè)置表格總列數(shù) for(i=0; i< _iFieldCount;i+) / 動(dòng)態(tài)生成各字段 / 該字段的固定標(biāo)題欄_arrayFieldTypei.pLabel= new TQRLabel(pQuickRep); / 標(biāo)題控件 _arrayFieldTypei.pLabel->Parent= ColumnHeaderBand1;/字段標(biāo)題名稱 _arrayFieldTypei.pLabel->Caption= pDBGrid->Columns->Items

17、i->Title->Caption; /字段標(biāo)題的字體_arrayFieldTypei.pLabel->Font= pDBGrid->Columns->Itemsi->Title->Font; _arrayFieldTypei.pLabel->Alignment= pDBGrid->Columns->Itemsi->Title->Alignment; / 對(duì)齊方式 _arrayFieldTypei.pLabel->Left = PreLeft+_iIntClearance;_arrayFieldTypei.pLabe

18、l->Width = _arrayFieldTypei.iWidth-2*_iIntClearance; _arrayFieldTypei.pLabel->Height= _arrayFieldTypei.pLabel->Font->Height; _arrayFieldTypei.pLabel->Top=pHeadRect->Top+(pHeadRect->Height+_arrayFieldTypei.pLabel->Height)/2; _arrayFieldTypei.pShapeTitle= new TQRShape(pQuickRep

19、); / 該字段右邊的分隔豎條 _arrayFieldTypei.pShapeTitle->Parent= ColumnHeaderBand1;_arrayFieldTypei.pShapeTitle->Left = PreLeft + _arrayFieldTypei.iWidth;_arrayFieldTypei.pShapeTitle->Top = 0;_arrayFieldTypei.pShapeTitle->Width= 1;if( i = pDBGrid->FieldCount-1) / 最后一列的分隔豎條寬度為 0 _arrayFieldTypei.

20、pShapeTitle->Width= 0;_arrayFieldTypei.pShapeTitle->Height=_arrayFieldTypei.pShapeTitle->Parent->Height; /顯示的數(shù)據(jù)欄_arrayFieldTypei.pDBText= new TQRDBText(pQuickRep); / 該字段對(duì)應(yīng)的文本控件 _arrayFieldTypei.pDBText->Parent = DetailBand1;_arrayFieldTypei.pDBText->DataSet = pDataSet; / 數(shù)據(jù)集 _array

21、FieldTypei.pDBText->DataField = pDBGrid->Columns->Itemsi->FieldName; / 字段名 _arrayFieldTypei.pDBText->Font = pDBGrid->Columns->Itemsi->Font; / 字體 _arrayFieldTypei.pDBText->Alignment= pDBGrid->Columns->Itemsi->Alignment;/對(duì)齊方式_arrayFieldTypei.pDBText->Left = PreLe

22、ft+_iIntClearance;_arrayFieldTypei.pDBText->Width = _arrayFieldTypei.iWidth-2*_iIntClearance; _arrayFieldTypei.pDBText->Height= _arrayFieldTypei.pDBText->Font->Height;_arrayFieldTypei.pDBText->Top= pDetailRect->Top+(pDetailRect->Height+_arrayFieldTypei.pDBText->Height)/2;_arr

23、ayFieldTypei.pShapeData= new TQRShape(pQuickRep); / 該數(shù)據(jù)右邊的分隔豎條 _arrayFieldTypei.pShapeData->Parent= DetailBand1;_arrayFieldTypei.pShapeData->Left = PreLeft+_arrayFieldTypei.iWidth; _arrayFieldTypei.pShapeData->Top = 0;_arrayFieldTypei.pShapeData->Width= 1;if( i= pDBGrid->FieldCount-1)

24、 / 最后一列的分隔豎條寬度為 0 _arrayFieldTypei.pShapeData->Width= 0;_arrayFieldTypei.pShapeData->Height=_arrayFieldTypei.pShapeData->Parent->Height; PreLeft= _arrayFieldTypei.pShapeTitle->Left; / 下列字段的左位置TGridPrint:TGridPrint() / 析構(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() / 打印預(yù)覽函數(shù) pQuickRep->Preview(); 2.2 定制

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論