用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决定,用不着自己去算,方便极了。

用delphi编写医院的复杂报表相关推荐

  1. delphi打包python_使用Delphi 编写Python Extension

    使用Delphi 编写Python Extension 作者:1000copy 摘要: 在互联网公共可访问领域内,关于Python/C interface的介绍,手册都是比较多的.Py直接支持C编写扩 ...

  2. Delphi编写后台监控软件

    Delphi编写后台监控软件 文章来源:Delphi程序员之家   后台监控软件,为了达到隐蔽监控的目的,应该满足正常运行时,不显示在任务栏上,在按Ctrl+Alt+Del出现的任务列表中也不显示,管 ...

  3. 用Delphi编写ASP的ActiveX

    ASP中的ActiveX服务器组件为标准的Automation ActiveX组件,只要使用由ASP提供的接口和遵守ASP有关规则便可.Delphi 4.0作为一种高效.快速.强大的开发语言,为开发C ...

  4. 利用Delphi编写Socket通信程序

    一.Delphi与Socket计算机网络是由一系列网络通信协议组成的,其中的核心协议是传输层的TCP/IP和UDP协议.TCP是面向连接的,通信双方保持一条通路,好比目前的电话线,使用telnet登陆 ...

  5. Delphi 编写数字签名验证并获取签名信息

    [摘要]本文介绍Delphi 编写数字签名验证并获取签名信息,并提供详细的示例代码供参考. 一个客户想通过编程实现验证程序自身的数字签名来确保程序的完整性,防范病毒感染以及防止一些无聊人士的修改(通过 ...

  6. 最全面的常用Delphi第三方控件汇总—报表、图表、界面、数据库等

    有网友问我常用的控件及功能.我先大概整理一下,以后会在文章里面碰到时再仔细介绍. 报表图表方面: TeeChart Pro 在delphi 的图形显示方面目前唯一的选择,虽然从delphi 3 就随d ...

  7. 使用Delphi编写自动关闭Windows信使服务窗体程序

    使用Delphi编写自动关闭Windows信使服务窗体程序 Windows信使服务是Windows为了方便尽心系统管理而设置的一项工具,初衷是很好的可以使得管理员方便的在局域网内发布消息给各个用户. ...

  8. Delphi控制Excel自动生成报表

    摘要:Excel是当前最流行的数据报表制作工具.本文介绍如何使用Delphi来控制Excel完成数据库与报表之间的数据交换,讨论了报表制作工程中的一些细节性问题. 关键字:Delphi,Excel,报 ...

  9. 编写的vs2005水晶报表程序在vs2008下正常使用的一些实现方法

    一.没有安装部署好水晶报表:(vs2008安装后,不等于安装了vs2008水晶报表) 二.源程序中:VS2008和v2005的水晶报表版本号不对:vs2008的版本号是:Version=10.5.37 ...

最新文章

  1. java spring cloud版b2b2c社交电商spring cloud分布式微服务:分布式配置中心
  2. 如何攻克异地协作难题?看 Tower 的 72 个月远程工作实践
  3. linux 网络 read,Linux read命令的使用
  4. 7-7 汉密尔顿回路 (25 分)(C语言实现)
  5. JavaScript中的“ this”关键字
  6. ·通过wifi_scan学习esp32wifi程序编写
  7. 关于小程序setdata一些使用方法
  8. ffmpeg转码参数
  9. 蓝鸽智慧计算机教室云服务平台操作说明,智慧教室操作说明.PDF
  10. 用excel和python做数据分析的优缺点
  11. linux gcc/g++编译参数 -l(大写i)-L(大写l) -l(小写l)
  12. word表格中多行只有一行字,让一行字居中的设置操作
  13. 【第17天】SQL进阶-查询优化- SHOW STATUS(SQL 小虚竹)
  14. 小技巧之统计代码行数
  15. unity启动Logo大小的问题
  16. Python 遍历文件夹下所有文件 合并txt内容
  17. 软件测试人事自我介绍,软件测试面试自我介绍范文
  18. [ Office 365 开发系列 ] 开发模式分析
  19. 《OpenCV编译》七、编译OpenBLAS
  20. jqWEUI对图片压缩并上传

热门文章

  1. python语言下划线怎么打_python下划线 | 学步园
  2. 绿色智慧档案馆构想之智慧档案馆环境综合管控一体化平台
  3. 4月以来北京,上海,广州,深圳,杭州Java程序员涨工资400倒500,南京涨了800元
  4. kali攻击wifi、破解wifi详细教程(仅供学习使用)
  5. Linux中gcc4.8.5升级到gcc5.4.0用已经编译好的安装包升级(重点是不用编译安装,可以更省时)
  6. 华为手机计算机怎么语音算术,华为自带的语音识别功能太实用了!这样操作,3秒语音变文字...
  7. docker build 18.04 镜像出现 Configuring tzdata - Please select the geographic area in which you live
  8. 复旦大学管理学院2017年考博(高级微观经济学+管理理论综合)真题,高微老师上课资料
  9. robotframework基础入门:(3):找不到关键字的对应方法
  10. 微信浏览器字体调整 PHP,如何针对微信浏览器的调整字体大小功能进行适配?...