如何快速自动生成并定制报表

上传人:宝路 文档编号:2198875 上传时间:2017-07-21 格式:DOC 页数:5 大小:54.50KB
返回 下载 相关 举报
如何快速自动生成并定制报表_第1页
第1页 / 共5页
如何快速自动生成并定制报表_第2页
第2页 / 共5页
如何快速自动生成并定制报表_第3页
第3页 / 共5页
如何快速自动生成并定制报表_第4页
第4页 / 共5页
如何快速自动生成并定制报表_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《如何快速自动生成并定制报表》由会员分享,可在线阅读,更多相关《如何快速自动生成并定制报表(5页珍藏版)》请在金锄头文库上搜索。

1、如何快速自动生成并定制报表在各种管理信息系统应用中,需要产生大量的报表,通常的做法是由编程人员一个个手工制作,工作效率较低;另外,用户希望能够将在应用程序里查询得到的结果生成报表以便打印。为了解决以上两种问题, 本文利用动态生成技术实现了快速自动产生报表,允许用户手工对报表进行修饰,并将实现过程封装成一个类。1设计思路使用过 C+ Builder 或Delphi 的编程人员知道,有一个 TDBGrid控件,它能以表格的形式显示和操作用户查询的数据记录;而要制作一个可供打印的报表,则需要使用 TQuickRep控件,在它上面增加 TQRLabel、TQRDBText、TQ RShape 等控件,

2、设置它们对应的数据集、数据字段等属性,然后编排它们的位置,以表格或其它格式显示出来供预览和打印,这是一个很繁琐的过程。有时,用户希望能将查询出来的显 示在 TDBGrid 控件的数据打印出来,按照以往的做法,就需要由编程人员按照 TDBGrid 的显示内容手工设计报表。在这里, 本文利用动态生成技术,读出 TDBGrid 的有关显示信息,在 TQuickRep 控件里动态生成相应的TQRLabel、TQRDBText、TQRSh ape 等控件,设置各字段的标题和数据以及表格分割条。这是完全可行的,因为 在 C+ Builder里所有的控件都可以由程序 动态生成,不仅仅是在设计阶段才产生的。另

3、外,如果用户对产生的报表表格布局不太满意,本文提供了接口使用户可对报表进行手工调整,调整表格的高度、宽度等布局,实现用户对报表的一定程度的定制。利用 C+的封装性特点,将自动产生并定制报表的实现封装成一个新类 TGridPrint,对外提供编程人员关心的公用接口,屏蔽了内部信息和具体实现,体现了面向对象的设计思想,为编程人员带来方便。编程人员还可以在它基础上进一步扩充功能。这样设计的新类减轻了编程人员的工作量,同时为用户提供了定制报表的接口,提高了报表的质量和用户参与的积极性。2实现过程自动产生并定制报表的实现过程包括自动产生和定制两部分。新类的定义和实现分别在 GridPrint.h Gri

4、dPrint.cpp 文件里,另包含 3 个文件 RepRst.h、RepRst.cpp、RepRst.dfm,它们是已产生的一个窗口 FrmRepRst,在它里面已增加一个 TQuickRep 控件,它的属性Bands的各子属性的值全为 true。2.1 自动产生报表先定义一个表示表格某一列信息的结构,在报表里一列有固定标题和显示的数据文本两种信息,为了能画出表格,每一列固定标题栏和数据栏右边分别增加一个分隔条。在类 TGridPrint 的构造 函数里,先根据传入的 TQuickRep *pSrcQuickRep(报表指针),TDBGrid * pSrcDBGrid(数据表格指针),TQR

5、Band *SrcTitleBand1(报表中的总标题栏指针), TQRBand *SrcColumnHeaderBand1(报表中的字段标题栏指针),TQRBand * SrcDetailBand1(报表中的数据栏指针)参数设置类的私有变 量。再动态生成并设置总标题文本、字段标题栏矩形框、数据栏矩形框的属性。然后通过一个循环,读出 TDBGrid 中各字段的标题和数据信息,动态生成报表 中各字段的标题标签控件、 数据文本控件以及对应的表格分割竖条控件。在类的析构函数里,删除所有由构造 函数动态生成的对象。类的打印预览函数实现报表的打印预览功能。其它的函数说明略。自动生成报表类的定义(Grid

6、Print .h)#include /包含的相关头文件#include #include #include #include typedef struct tagFieldType /表示表格某一列信息的结构AnsiString sTitle; /字段标题名称int iWidth; /表格单元的宽度TQRLabel *pLabel; /字段 标题控件TQRDBText *pDBText; /显示的数据控件TQRShape *pShapeTitle, *pShapeData; /字段标题和数据的表格分隔条 NEWFIELDTYPE;class TGridPrintpublic:TGridPrin

7、t(TQuickRep *pSrcQuickRep,TDBGrid * pSrcDBGrid,TQRBand *SrcTitleBand1,TQRBand *SrcColumnHeaderBand1,TQRBand * SrcDetailBand1); /构造函数TGridPrint(); /析构函数void DoPreview(); /报表的打印预览void SetPrntTitle(AnsiString sTitle); /手工设置表格的总标题void SetColumnsWidth(int *ColumnsWidth); /手工设置表格各列宽度void SetHeadRectHeight

8、(int iHeight); /手工设置字段标题行的高度void SetDetailRectHeight(int iHeight); /手工设置数据行的高度private:TDBGrid * pDBGrid; /将要显示的 DBGridTDataSet * pDataSet; /DBGrid 对应数据集TQuickRep * pQuickRep; /报表 控件TQRBand * TitleBand1; /报表的总标题栏TQRBand * ColumnHeaderBand1; /报表的字段标题栏TQRBand * DetailBand1; /报表的数据栏TQRLabel * pTitleLabe

9、l; /总标题控件 TQRShape * pHeadRect, * pDetailRect; /整个字段标题栏、数据栏的表 格矩形控件int iHeadRectHeight, iDetailRectHeight; /对应表格矩形框的高度,它们宽度相同int _iTotalWidth; /整个表格的总宽度int _iIntClearance; /表格内部数据列到左表格的距离int _iFieldCount; /将要打印的字段数目NEWFIELDTYPE _arrayFieldType40; /支持到 40 个字段的打印void AutoAdjustColumnsWidth(); /程序自动调整各

10、列宽度;类的主要公用方法的实现(GridPrint.cpp)TGridPrint:TGridPrint(TQuickRep * pSrcQuickRep,TDBGrid * pSrcDBGrid,TQRBand *SrcTitleBand1, TQRBand *SrcColumnHeaderBand1,TQRBand * SrcDetailBand1) /构造函数 int i,PreLeft;pQuickRep = pSrcQuickRep; /根据传入参数设置私有变量pDBGrid = pSrcDBGrid;pDataSet = pDBGrid-DataSource-DataSet;pQui

11、ckRep-DataSet = pDataSet;TitleBand1 = SrcTitleBand1;ColumnHeaderBand1 = SrcColumnHeaderBand1;DetailBand1= SrcDetailBand1; PTitleLabel = new TQRLabel(pQuickRep); /生成并设置总标题标签的属性pTitleLabel-Parent = TitleBand1;pTitleLabel-Caption = 报表标题;pTitleLabel-Left= (TitleBand1-Width - pTitleLabel-Width)/2;memset(

12、_arrayFieldType,0,sizeof(NEWFIELDTYPE)*40);_iTotalWidth=0; /计算出表格各列单元宽度和整个表格的总宽度for(i=0; iFieldCount;i+) _arrayFieldTypei.iWidth= pDBGrid-Columns-Itemsi-Width;_iTotalWidth += _arrayFieldTypei.iWidth; if(_iTotalWidth TitleBand1-Width) /如果原 DBGird 各列宽度和大于总标题栏宽度,就调整各列宽度_iTotalWidth= TitleBand1-Width;Au

13、toAdjustColumnsWidth(); PreLeft= ( TitleBand1-Width - _iTotalWidth)/2; /使整个表格居中pHeadRect= new TQRShape(pSrcQuickRep); /生成并设置字段标题栏的矩形框pHeadRect-Parent= ColumnHeaderBand1;pHeadRect-Left = PreLeft; pHeadRect-Top = 0;pHeadRect-Width = _iTotalWidth; pHeadRect-Height= pHeadRect-Parent-Height;pDetailRect=

14、new TQRShape(pSrcQuickRep); /生成设置数据行的矩形框pDetailRect-Parent= DetailBand1;pDetailRect-Left = PreLeft; pDetailRect-Top = -1;pDetailRect-Width = _iTotalWidth; pDetailRect-Height= pDetailRect-Parent-Height+1 ;_iIntClearance= 1;_iFieldCount= pDBGrid-FieldCount; /设置表格总列数for(i=0; iParent= ColumnHeaderBand1;

15、/字段标题名称_arrayFieldTypei.pLabel-Caption= pDBGrid-Columns-Itemsi-Title-Caption; /字段标题的字体_arrayFieldTypei.pLabel-Font= pDBGrid-Columns-Itemsi-Title-Font;_arrayFieldTypei.pLabel-Alignment=pDBGrid-Columns-Itemsi-Title-Alignment; /对齐方式_arrayFieldTypei.pLabel-Left = PreLeft+_iIntClearance;_arrayFieldTypei.

16、pLabel-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); /该字段右边的分隔竖条_arrayFieldTypei.pShapeTitle-Parent= ColumnHeaderBa

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号