用delphi编写医院的复杂报表
江苏省无锡市中医医院电脑房袁波
---- 我院的信息管理系统采用delphi编程,由于各科要求不同,报表形式也多种多样,编写起来让人头痛。delphi运行在windows平台下,打印同dos下完全不同,而quick report即难以控制又占用资源,对于一个稍复杂的、有特殊要求的报表,quick report无法实现。这里介绍几个在编程中遇到的比较典型的报表的实现方法。
---- 1、哪个单位的财务科都有几本厚厚的台帐,我院财务科提出打印药库的台帐,好脱掉手工帐,也算是办公现代化了,要求合情合理,院长也说应当如此。看着财务科提供的红绿相间的、统一印制的、行间距3毫米的台帐专用小卡片,我不由想到中国人节俭的美德。考虑到每个药品至少打印一张,而且表格线一个都不能少,加上中医院药品有二千多种,所以这个报表必须用激光打印机来打印(至于如何让院长同意购买激光打印机,则是另一回事,办公自动化哪能没有代价呢)。程序实现的思路基本上是把打印纸当做画布在上面画一个个小矩形,具体由以下几个过程实现:(设form名为ttzview)。
先在程序中定义二个类:
titlerecord=record
currect:trect;
atitle:string;
end;
detailrecord=record
arect:trect;
alignment:word;
end;
---- 再建立以下四个过程;
---- rectdraw(acanvas:tcanvas;s:string;r:trect;frame:boolean;position:word);
---- 这个过程就是画矩形用的,frame决定是否画线(这里当然要画啦!);
---- printinitit(firsttop,firstleft:integer);
---- 这个过程是初始化用的,就是定义各个小矩形在纸上的位置;
---- printtitle(acanvas:tcanvas);
---- 这个过程是打印表头的,因为表头的字总是要大一些;
---- printdetail(acanvas:tcanvas;qtz:tdataset;acount:integer;firstpage:integer);
---- 这个过程才是打印具体内容的,一页打印40行,不够就换页,总之一页只能是一个药品;
---- printhj(acanvas:tcanvas);
---- 一看就知道,这个过程就是打印合计的啦!
---- 只要建个botton,顺序调用printinitit,printtitle,printdetail,printhj这四个过程就行了,
---- (调用格式:printtitle(printer.canvas);)
---- 对了,qtz就是查询出来的台帐数据,如何生成的这里就不谈了。
---- 具体程序如下
---- 此程序在delphi1,delphi3版本win3.2,win95,win97,win98平台下运行通过,顺便提供台帐数据库的库结构
---- 2、非常复杂,无法取巧的报表
---- 我院肿瘤科需要打印病人的病案,这可是特色专科现代化建设的一部分,卫生局要来检查的,所以必须完成任务。每一个病案有100多个项目,若用qreport,中间如果要加减一个项目(这事常有),几十个项目的调整排列会使人昏倒。我一下子建立100多个临时变量,在虚拟的画布上画啊画,运行在我的pii233,64m内存的机子上倒是顺顺当当的,不过换到肿瘤科的486,8m内存的机子上时(大家别笑),系统堆栈马上溢出,所以只好祭出指针大法(我的编程水平好象又有长进,窃喜),方法如下:
先建立titleprint类:
titleprint=^titlerecord;
titlerecord=record
currect:trect;
atitle:string[50];
end;
再建立过程printnow(form的名称叫
zlk,printdot就是打印机的点数,一般针打是180);
procedure tzlk.printnow(acanvas:tcanvas);
var i,x,y,pc_count:integer;
myprint:array[0..200] of titleprint;
begin
firsttop:=round(int(0.5/2.54*printdot));
firstleft:=round(int(0.1/2.54*printdot));
rowheight:=round(int(0.7/2.54*printdot));
x:=0+firstleft;y:=round(int
(1.3/2.54*printdot))+firsttop;
pc_count:=0;
inc(pc_count); new(myprint[pc_count]);
myprint[pc_count]^.currect:=rect
(x+round(int(0.1/2.54*printdot))+firstleft,y,
x+round(int(3.0/2.54*printdot))+firstleft,
y+firsttop+round(int(0.5/2.54*printdot)));
myprint[pc_count]^.atitle:=lname.
caption+dbname.text;
acanvas.moveto(myprint[pc_count]^.
currect.left,
myprint[pc_count]^.currect.top-round
(rowheight/5));
{下面的四行还要重复100多次,基本差不多,
就不都写出来赚稿费了}
inc(pc_count); new(myprint[pc_count]);
myprint[pc_count]^.currect:=scalerect(
myprint[pc_count-1]^.currect,round(int
(2.5/2.54*printdot)),0);
myprint[pc_count]^.atitle:=lxb.caption+cxb.text;
acanvas.lineto(myprint[i]^.currect.right,
myprint[i]^.currect.top-round(rowheight/5));
.......
{打印}
printtitle(acanvas);
{这个函数就不提供了,表头不要也没关系}
for i:=1 to pc_count do
begin
rectdraw(acanvas,myprint[i]^.atitle,
myprint[i]^.currect,false,
dt_left or dt_singleline or dt_vcenter);
end;
dispose(myprint[pc_count]);
{别忘了把指针占用的内存释放}
end;
---- 最后建个botton,加个是否真的打印的判断,再调用这几个函数就行了。
---- (调用格式:printtitle(printer.canvas);)
---- 看了以上两个例子,是不是觉得windows下的打印其实很简单,就跟你手工画表一样,而且表格内容的位置是居中、居左、还是居右,全由打印内容的alignment决定,打印格式由内容的display format决定,用不着自己去算,方便极了。
- · 关于精简BDE的一点疑问----我的几封信
- · 在DELPHI2.0/3.0中直接操作端口
- · 网络和通讯编程
- · 在Delphi程序中应用IE浏览器控件
- · Borland与Microsoft关于Delphi的对话
- · 远程控制篇:服务端程序关机时的处理
- · 远程控制篇:通过IP地址得到机器名
- · 远程控制篇:服务端程序的隐藏
- · 远程控制篇:模拟按键
- · 远程控制篇:获得网络邻居所有机器名
- · 远程控制篇:抓取远程屏幕图像
- · 有了网络监控 网络自由还会有吗?
- · 将某一主机域名解析为IP地址。
- · TWebBrowser流程讲解及如何判断下载网页成功
- · Kylix预览
- · 关于WEB应用程序的打印组件开发初探
- · 让你的“小猫”发传真技巧攻略
- · 安全技术:基于ARP欺骗的TCP伪连接DOS
- · 如何关闭端口防止病毒与黑客入侵
- · 运行多个系统 全线引爆虚拟机VMware
- · IE7 Build 5299 RSS新功能抢先看
- · 一些Windows系统安全配置方法
- · 网管必知 防溢出提权攻击解决办法
- · 自己动手做服务器安全(初级篇)
- · 披着“羊皮”的狼 TXT下的病毒阴谋
- · 让系统安全起来 把间谍软件请出硬盘
- · 简单三步走堵死SQLServer注入漏洞
- · 从细微处做起 全面打造系统安全
- · Windows上网后速度越来越慢怎么办?
- · 如何让让IE6也能实现反“钓鱼”
- · 上网安全 谨防ActiveX插件成病毒帮凶
- · 解析Windows Vista 5270的UAP功能
- · 世界之窗对决GB:浏览器截图功能比拼
- · 小技巧御大敌:如何防止IE被恶意修改
- · 在Cisco交换机上实现隔离访问
- · 与一个黑客的较量
- · 办公室共用电脑系统安全防范攻略
- · 一种“您无权查看该网页”的原因和解决方法
- · SQL注入程序带来的攻击及防范
- · 学习心得 TCP/IP攻击原理分析总结
- · SQL注入技术和跨站脚本攻击的检测
- · 真正安全起来 网页脚本攻击防范全攻略
- · 视频:ADSL宽带共享上网 2
- · 突破网络限制之三十六计篇
- · ADSL上网的常见问题及分析集锦
- · 视频:ADSL宽带共享上网
- · Windows系统中常见网络故障与解决方法
- · 揭开ADSL真正速度之谜:宽带到底该有多快
- · 网络管理之IP地址篇
- · 网络管理之网关篇
- · 一步一步学习代理服务器
- · 网络安全基础:防火墙的概念及实现原理
- · FTP登录错误详解
- · 测试网络通断的另类方法
- · 基于短信网关WAP推送的实现
- · 我写CC DDOS攻击器的思路及防范方法
- · 雅虎拟加强交友网站安全 防止成员账号泄露
- · ADSL常见问题精彩问答
- · 上网不用防火墙!一招克死所有病毒
- · SANS发布2005全球20大网络安全隐患排行

