


下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、如何快速自动生成并定制报表在各种管理信息系统应用中,需要产生大量的报表,通常的做法是由编程人员一个个手工制 作,工作效率较低;另外,用户希望能够将在应用程序里查询得到的结果生成报表以便打印。 为了解决以上两种问题,本文利用动态生成 技术实现了快速自动产生报表,允许用户手工对报表进行修饰,并将实现过程封装成一个类。1设计思路使用过C+ Builder或Delphi的编程人员知道,有一个 TDBGrid控件,它能以表格的形式 显示和操作用户查询的数据记录;而要制作一个可供打印的报表,那么需要使用TQuickRep控件,在它上面增加 TQRLabel、TQRDBText、TQRShape等控件,设置
2、它们对应的数据集、 数据字段等属性,然后编排它们的位置,以表格或其它格式显示出来供预览和打印,这是一个很繁琐的过程。有时,用户希望能将查询出来的显示在TDBGrid控件的数据打印出来,按照以往的做法,就需要由编程人员按照TDBGrid的显示内容手工设计报表。在这里,本文利用动态生成技术,读出TDBGrid的有关显示信息,在 TQuickRep控件里动态生成相应 的TQRLabel、TQRDBText、TQRShape等控件,设置各字段的标题和数据以及表格分割条。 这是完全可行的,因为在 C+ Builder里所有的控件都可以由程序 动态生成,不仅仅是在 设计阶段才产生的。另外,如果用户对产生的
3、报表表格布局不太满意,本文提供了接口使用户可对报表进行手工调整,调整表格的高度、 宽度等布局,实现用户对报表的一定程度的定制。利用C+的封装性特点,将自动产生并定制报表的实现封装成一个新类TGridPrint,对外提供编程人员关心的公用接口,屏蔽了内部信息和具体实现,表达了面向对象的设计思想,为编程人员带来方便。 编程人员还可以在它根底上进一步扩充功能。这样设计的新类减轻了编程人员的工作量,同时为用户提供了定制报表的接口,提高了报表的质量和用户参与的积极性。2 实现过程自动产生并定制报表的实现过程包括自动产生和定制两局部。新类的定义和实现分别在GridPrint.h GridPrint.cpp
4、 文件里,另包含 3 个文件 RepRst.h、RepRst.cpp、RepRst.dfm,它们是 已产生的一个窗口 FrmRepRst,在它里面已增加一个 TQuickRep控件,它的属性 Ba nds的各 子属性的值全为true。2.1自动产生报表先定义一个表示表格某一列信息的结构,在报表里一列有固定标题和显示的数据文本两种信息,为了能画出表格,每一列固定标题栏和数据栏右边分别增加一个分隔条。在类TGridPrint的构造函数里,先根据传入的TQuickRep *pSrcQuickRep报表指针,TDBGrid * pSrcDBGrid数据表格指针,TQRBand *SrcTitleBan
5、d1 报表中的总标题栏指针,TQRBand*SrcColumnHeaderBand1报表中的字段标题栏指针,TQRBand * SrcDetailBand1报表中的数据栏指针参数设置类的私有变量。再动态生成并设置总标题文本、字段标题栏矩形框、 数据栏矩形框的属性。然后通过一个循环,读出TDBGrid中各字段的标题和数据信息,|动态生成报表中各字段的标题标签 控件、数据文本控件以及对应的表格分割竖条|控件。在类的 析构函数里,删除所有由构造函数动态生成的对象。类的打印预览函数实现报表的打印预览 功能。其它的函数说明略。自动生成报表类的定义GridPrint.h#include 包含的相关头文件#
6、in clude #in clude#i nclude#i ncludetypedef struct tagFieldType /表示表格某一列信息的结构AnsiString sTitle; /字段标题名称int iWidth; /表格单元的宽度TQRLabel *pLabel; /字段标题控件TQRDBText *pDBText; /显示的数据控件TQRShape *pShapeTitle, *pShapeData; /字段标题和数据的表格分隔条 NEWFIELDTYPE;class TGridPri ntpublic:TGridPrint(TQuickRep *pSrcQuickRep,T
7、DBGrid * pSrcDBGrid,TQRBand *SrcTitleBand1, TQRBand *SrcColumnHeaderBand1,TQRBand * SrcDetailBand1); /构造函数TGridPri nt();析构函数void DoPreview(); /报表的打印预览void SetPrntTitle(AnsiString sTitle); /手工设置表格的总标题void SetColumnsWidth(int *ColumnsWidth); /手工设置表格各列宽度void SetHeadRectHeight(int iHeight); /手工设置字段标题行的高
8、度void SetDetailRectHeight(int iHeight); /手工设置数据行的高度private:TDBGrid * pDBGrid; 将要显示的 DBGridTDataSet * pDataSet; /DBGrid 对应数据集TQuickRep * pQuickRep; 报表控件TQRBand * TitleBand1; 报表的总标题栏TQRBand * ColumnHeaderBand1; 报表的字段标题栏TQRBand * DetailBand1; 报表的数据栏TQRLabel * pTitleLabel; /总标题控件TQRShape * pHeadRect, *
9、pDetailRect; 整个字段标题栏、数据栏的表格矩形控件int iHeadRectHeight, iDetailRectHeight; 对应表格矩形框的高度,它们宽度相同int _iTotalWidth; /整个表格的总宽度int _iIntClearanee; /表格内部数据列到左表格的距离int _iFieldCount; /将要打印的字段数目NEWFIELDTYPE _arrayFieldType40; /支持到 40 个字段的打印void AutoAdjustColumnsWidth(); /程序自动调整各列宽度;类的主要公用方法的实现GridPrint.cppTGridPrin
10、t:TGridPrint(TQuickRep* pSrcQuickRep,TDBGrid * pSrcDBGrid,TQRBand *SrcTitleBand1, TQRBand *SrcColumnHeaderBand1,TQRBand * SrcDetailBandl) 构造函数 int i,PreLeft;pQuickRep = pSrcQuickRep; /根据传入参数设置私有变量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); 生成并设置总标题标签的属性 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、标题栏宽度,就调整各列宽度_iTotalWidth= TitleBa nd1->Width;AutoAdjustColum nsWidth(); PreLeft= ( TitleBand1->Width - _iTotalWidth)/2; 使整个表格居中pHeadRect= new TQRShape(pSrcQuickRep); 生成并设置字段标题栏的矩形框 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); /生成设置数据行的矩形框 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; / 设置表格总列数for(i=0; i< _iFieldCount;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;显示的数据栏_arrayFieldTypei.pDBText= new TQRDBText(pQuickRep); 该字段对应的文本控件 _arrayFieldTypei.pDBText->Pare nt = DetailBa nd1;_arrayFieldTypei.pDBTex
20、t->DataSet = pDataSet; / 数据集_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); 该数据右边的分隔竖条 _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()/ 析构函数 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() /打印预览函数 pQuickRep->Preview(); 2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 氢能源氢燃料电池运行状态测试员合同
- 水泥厂粉尘监测系统租赁与智能化数据分析合同
- 通信行业数据隐私保护协议(GDPRCCPA合规)
- 《心律失常与治疗》课件
- 电视剧原声带音乐改编授权及分成比例补充协议
- 直播平台与电商平台直播带货合作合同
- 《胃溃疡的诊断与治疗》课件
- 《古园林文化》课件
- 驱蚊音乐游戏活动方案
- 《C效果图展示》课件
- 2025年山东地区光明电力服务公司招聘笔试参考题库含答案解析
- 2025年国家工作人员保密教育线上培训必考题库附含参考答案
- 2025年合肥市公安局第一批招考聘用警务辅助人员591人高频重点提升(共500题)附带答案详解
- 纠四风知识竞赛试题及答案
- 科目一考试题库含答案100题
- 医务人员手卫生规范课件
- 江苏省渔船安全隐患排查技能竞赛(海洋组)考试题及答案
- 计算与人工智能概论知到智慧树章节测试课后答案2024年秋湖南大学
- 【MOOC】太极功夫-西南交通大学 中国大学慕课MOOC答案
- 医院培训课件:《医务人员职业暴露及安全防护》
- 第47届世界技能大赛江苏省选拔赛竞赛技术文件-混凝土建筑项目2
评论
0/150
提交评论