说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

Delphi应用程序中中国式报表的制作

HTML文档下载 WORD文档下载 PDF文档下载
Delphi应用程序中中国式报表的制作

在众多可视化数据库开发工具中

Delphi以其真正的面向对象、高效率、支持多层结构应用开发、支持多层B/S结构开发等优良特性脱颖而出,成为广大编程人员的首选开发工具。

在数据库应用程序开发中,系统设计员、程序设计员需要考虑的一个重要问题是如何设计和输出报表,在Delphi中我们可以采用多种方案来解决这一问题,如运用OLE自动化技术将数据输出到MS-WORD、MS-EXCEL中等,但其中最直接、最本地化的还是使用Delphi3.0/40中的QuickReport报表组件,它是挪威QuSoft公司专门为Delphi编写的,使用QuickReport可以迅速设计出符合西方人习惯的报表。

然而,在设计中国式报表时,笔者发现在QuickReport中设计列与列之间的竖线和斜线比较困难;虽然QuickReport提供了TQShape控件

使用该控件可以画出列与列之间的竖线,但如果用户不能正确调整TQShape实例的高度,输出报表中的竖线不是不连续就是超长,另外如果我们调整了某个Band的高度,我们将不得不调整该Band下的所有TQShape实例的高度;至于斜线,QuickReport报表组件根本就没有提供这一功能。笔者认真查找了有关资料,成功地解决以上问题,并愿意将解决方法与大家共享,希望能对大家有所帮助。

1、 解决思路

(1)以TQShape为父类,建立新的控件,新控件可以画竖线、斜线和反斜线。

(2)重载TQShape 类的Paint方法,这样在设计阶段可以非常直观地画斜线、反斜线和竖线,用户可以在设计阶段选择线的类型,如果选择直线,控件自动将其高度调整为所属Band的高度,用户可以调整其横向位置但不能调整其高度;如果选择斜线,用户可以根据需要调整斜线的长度和倾角。

(3)重载TQShape 类的Print方法,这样可以在运行阶段输出直线和斜线。

说明:该控件只能画直线和斜线,如果读者需要画矩形和园,可以使用TQShape控件来实现。

2、控件设计步骤

(1)使用Delphi提供的控件向导,选择TQShape为父类,建立新类TMyQRShape,并选择适当的包(Package),最后生成单元文件。

(2)在生成的单元文件中,增加枚举类型,

TLines = ( None

TopBottom

BottomTop ) ;

None、TopBottom、BottomTop三种取值,分别代表直线、斜线 \ 和反斜线 / 。

(3)在新类TMyQRShape 中增加private 成员 FLineType:TLines ,增加published属性 LineType:TLines Read FLineType Write SetFLineType 。

(4)建立过程SetFLineType 。

procedure TMyQRShape.SetFLineType(Value:TLines);

begin

if Value<>FLineType then

begin

FLineType:=Value ;

Invalidate ;

end ;

end ;

(5)重载Paint方法

procedure TMyQRShape.Paint ;

begin

case LineType of

BottomTop:

begin //反斜线 /

Canvas.MoveTo(0

Height) ;

Canvas.LineTo(width

0 ) ;

end ;

TopBottom: //斜线 \

begin

Canvas.MoveTo(0

0) ;

Canvas.LineTo(width

Height ) ;

end ;

None: //直线

begin

Height := Parent.Height ;

Top:=0 ;

Width:=4 ;

Shape:=qrsVertLine ;

Inherited Paint ;

end ;

end ;

end ;

(6)重载Print方法

procedure TMyQRShape.Print(OfsX

OfsY : Integer);

begin

with QRPrinter do

begin

case LineType of

BottomTop:

begin

Canvas.MoveTo(XPos(OfsX + Size.Left)

YPos(OfsY + Size.Top)+Height) ;

Canvas.LineTo(XPos(OfsX + Size.Left)+width

YPos(OfsY + Size.Top) ) ;

end ;

TopBottom:

begin

Canvas.MoveTo(XPos(OfsX + Size.Left)

YPos(OfsY + Size.Top)) ;

Canvas.LineTo(XPos(OfsX + Size.Left)+Width

YPos(OfsY + Size.Top)+Height ) ;

end ;

None:

Inherited Print(OfsX

OfsY ) ;

end ;

end ;

end;

(7)保存并安装TMyQRShape控件。

本控件在Delphi40下调试、安装,并成功应用于某数据库管理系统的开发。该控件的完整代码如下。源程序:

unit MyQRShape;

interface

uses

Windows

Messages

SysUtils

Classes

Graphics

Controls

Forms

Dialogs

QuickRpt

Qrctrls;

type

TLines = ( None

TopBottom

BottomTop ) ;

TMyQRShape = class(TQRShape)

private

FLineType:TLines ;

procedure SetFLineType(Value:TLines) ;

protected

procedure Print(OfsX

OfsY : integer); override;

procedure Paint ;Override ;

public

published

property LineType:TLines Read FLineType Write SetFLineType ;

end;

procedure Register;

implementation

procedure TMyQRShape.SetFLineType(Value:TLines);

begin

if Value<>FLineType then

begin

FLineType:=Value ;

Invalidate ;

end ;

end ;

procedure TMyQRShape.Paint ;

begin

case LineType of

BottomTop:

begin //反斜线 /

Canvas.MoveTo(0

Height) ;

Canvas.LineTo(width

0 ) ;

end ;

TopBottom: //斜线 \

begin

Canvas.MoveTo(0

0) ;

Canvas.LineTo(width

Height ) ;

end ;

None: //直线

begin

Height := Parent.Height ;

Top:=0 ;

Width:=4 ;

Shape:=qrsVertLine ;

Inherited Paint ;

end ;

end ;

end ;

procedure TMyQRShape.Print(OfsX

OfsY : Integer);

begin

with QRPrinter do

begin

case LineType of

BottomTop:

begin

Canvas.MoveTo(XPos(OfsX + Size.Left)

YPos(OfsY + Size.Top)+Height) ;

Canvas.LineTo(XPos(OfsX + Size.Left)+width

YPos(OfsY + Size.Top) ) ;

end ;

TopBottom:

begin

Canvas.MoveTo(XPos(OfsX + Size.Left)

YPos(OfsY + Size.Top)) ;

Canvas.LineTo(XPos(OfsX + Size.Left)+Width

YPos(OfsY + Size.Top)+Height ) ;

end ;

None:

Inherited Print(OfsX

OfsY ) ;

end ;

end ;

end;

procedure Register;

begin

RegisterComponents('QReport'

[TMyQRShape]);

end;

end.

乐视网联手富士康推新盒子C1S “0+290元”新浪微博发售 吸引开发者:只要开发新应用 微软便奖100美元 PaintCode - 将矢量图转化为Objective-C代码的开发神器 苹果发布iOS 6.1.3 封杀evasi0n越狱所用漏洞 [API快讯] Google开放实时协作API 58同城开源轻量级Java Web框架 Argo 初创公司AppNeta:4轮融资,4780万美元 MongoDB释放2.4版本:692更新及8大得意之作 十年6亿美元!Amazon云计算喜获CIA大单! 国人当自强:HTML5+联盟首次筹备会成功举行 开源框架TAAE发布 快速打造iOS音频应用 如何学会600多种编程语言 “第五届中国云计算大会”将于2013年6月5-7日在京召开 Ridiculous Fishing:游戏遭遇山寨如何一雪前耻 老游戏的今天:Doodle Jump每周进账2万美元 剑指Evernote 谷歌正式推出Google Keep 开源的JS MVC框架 Backbone.js 1.0发布 前Facebook资深员工王淮给技术创业团队的十点建议 微软发布Windows Embedded 8系列操作系统 Google Play 4.0抢先体验 中国 vs. 非洲:移动医疗的前世今生 Java大数据框架初创企业Concurrent获400万美元融资 基于Edge Animate开发CSS3 Animations 后端服务商Firebase发布全新iOS SDK [爆料]百度云或在秘密打造实时移动Web App开发框架 打造最佳开发团队的几点建议 Facebook与开发者交恶 扼杀第三方应用 负载大逃亡:四十二路怪兽联军及七条逃生法则 那些年,MIT技术男们奇妙的黑客作品 深度分析:腾讯3.3亿美元收购Epic股份值吗? 传下一代iOS或将推行扁平化设计 linux 0.01是在UNIX上开发的吗? 裸机上怎么成功引导它的呢? 大家看看我程序错在何处,谢谢了 winroute代理怎么设置让指定的用户只能在指定的时间上网。。。 怎样写一份采用J2EE的框架的软件测试报告? C#还能使用BHO吗?如果能100分求C#使用BHO(browser helper object)的例子。 请问如何制作Win98启动盘(我现在没有Win98的机子)? 关于换行的问题 javascript判断操作系统 一个奇怪的time问题,偶是菜鸟了~~~~~~~~~~~ d7版本所带的qr是什么版本的? 请教:创建数据库表时,怎样突破默认字段长度? 免费注册 Jboss 或 应用服务器 除了网上有,买d版的不知道有没有啊,下载太慢啊!! datagrid 中的一例为4位小数的数据,如何在datagrid设置使其值显示为带二位小数?? 让你的企业、产品、网站一夜成名 企业中一般如何写数据字典阿?急,在线等待 文件上传 如何将txt文件导入mdb文件之中,在线等,解决问题立即给分。 在菜单中打开MDI窗口,但是每一次点击,就出现一个新窗口,如何只出现一个? 大侠,救命啊,这个编译错误,折磨我好几天了,如何解决啊?????? 求C语言程序:从键盘上输入若干个证书,去掉重复的,将剩余数的前n个输出显示 新手发问(有关C#和MySQL数据库)! 试用期的前几天会被安排做什么?(对于一个没有一点工作经验的大学生) 如何合并两个字符串?急!!! 请问哪有jive 的中文版原代码下载啊?? jdon的压缩包不好使!!谢谢 关于静态方法! tomcat 406 错误 如何遍历任务栏上已经打开的程序呢? 动态添加commandbutton后如何写其clicked()的事情 今天晚上可能要時間長了,那個算法的流程你看看,服務器的負載太大了,不斷的連接,數據碎片太多了 把dataSet里的多个表插入数据库时,怎么把这多个表作为一个事务? tomcat报出406号错误 CDONTS.NewMail发送邮件? 继承的问题 我的问题 C++ Primer和C++ Programming Language 哪本好一些呢? 哪位朋友可以给一个PHP4导航栏的代码(1 2 3 4 5 6 这样的) redhat9.0是否支持ich5 在VS2002中可以用的设置星期格式的代码,在VS2003下不能用,为什么? 请教一个关于时间的SQL语句! 关于多级菜单问题 我的电脑里的chm文档打不开了,求救~~~~~~~~~~~! 购买QQ,共1000分(1) 大家帮忙分析一下 请教,关于“name not Unique in this context”的错误。50分,急!!!! 请教一个小问题 显示属性打不开? 购买QQ,共1000分(2) 很简单的问题,最好详细写listput 这个组件怎么用? 80分够不?在线等待中。 改好了告訴我一下,等0點去機房,這邊的認證服務器不動了,VMS系統我不懂 MIDAS 高手请进,这个问题在大富翁上出了600分,也没人拿到,难道真的没人明白吗? 英语翻译FULL SET OF ON BOARD (3)ORIGINAL OCEAN BILLS OF LADING INCLUDING 3 NON-NEGOTIABLE COPIES ISSUED TO THE ORDER OF BANK LEUMI USA,NYMARKED NOTIFY:AND MARKED FREIGHT COLLECT 英语翻译COMMERCIAL INVOICES SIGNED AND STAMPED IN 5 FOLDS WITH 4 ORIGINAL ESTABLISHED FOR USD 269.320,00 INDICATING THE PAYMENT OF THE ADVANCE.怎么翻译?尤其是最后INDICATING INDICATING THE PAYMENT OF THE ADVANCE怎么理解 英语翻译stipulating that clatms are payable in the currency of the draft and also indicating a claim-settling agent in korea covering institute连接上cargo clauses:against all risk and war clauses of the people's insurance company of china date Retroactive Payment 什么含义经咨询相关人员,确切含义是"应缴款",就是应该在上个月交的钱,这个月才扣. regulate和adjust有什么区别 求 science fair All questions should be able to be restated as "what is the relationship between this and that?" NOT "Does this have any effect?" Also,you need to be able to measure your results.就是一个题目关于两个物质之间的关系的 Can you show me the way to a house.这个句子对不对 还有I like a pen on the desk.这个句子对不对填空()They are not( )nurses.A. a B.an C.the D./ I didn`t know you______ to the new house.i'm glard you invite me to your house.A.move B.moving C.move to We( )him( )the city(带.参观) The boy usually gets____(dress)at 6:30.用所给词的适当形式填空 The little boy _____ his clothes and goes to bed. 美国欠全世界一个道歉西方盟友不会因“监听”散伙美电视台脱口秀节目“杀中国人言论”被美国电视荧屏常可看到公开对中国人侮辱俄“质子”火箭搭载美国通讯卫星升空美国承认窃听事件对美国与伙伴国关系造中国周边外交分量加重 升级、提速、加西方盟友会不会因“监听”散伙?美国监听丑闻变“质”环保部:上半年新疆青海等省区氨氮排放人社部:正研究办法治理公职人员“吃空男子假冒“铁路高官”无票占座续:接受外交部副部长王超会见克罗地亚外交和欧“中国农业第一飞”天祥通航蓄势高飞韩国客运站仓库火灾已致6人死亡数十人港媒吁马英九进行自我调整 改变被动雾霾频发“呼唤”清洁能源 李景明称沼湖南新邵暴雨成灾 当地全力抗洪黑龙江林区再次发现野生东北虎踪迹图解:印度新总理纳伦德拉·莫迪其人其新加坡70岁老医生非礼女病人获刑10上海国企土地探秘:如何盘活工业用地
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘