VFP 8.0 中实现多种自定义纸张格式的报表打印
作者:徐小栋
摘要:本文叙述了在VFP8.0开发的应用程序中,利用报表设计器设计的各种非WINDOWS标准页面大小的报表,在WIN2000/XP下如何打印的问题。通过在WIN2000/XP的“打印机和传真”窗口中设置“服务器属性”,创建多种自定义纸张规格和修改VFP报表文件,在开发的应用程序中让用户控制各种打印报表的纸张大小。
关键词:VFP 8.0 Windows 2000/XP 纸张格式 报表打印
一、VFP报表设计器概述
VFP从3.0版开始,提供了图形界面的报表设计器,报表设计器是对所需打印的内容通过报表控件进行排列,这样能大大地减少编写程序时所录入的代码,把编程者从烦琐的代码编写中解脱出来。VFP中提供的报表设计器可以进行多种样式的排列,运用各种报表控件,可以设计出各种复杂的打印作业,甚至打印图形对象,这样比用编程方式设计的打印程序要灵活得多。
二、问题的引出
在以往的VFP版本中,使用VFP提供的报表设计器设计的报表,如果报表页面大小不是Windows操作系统提供的标准规格的纸张大小,在Windows 9X下,可通过自定义纸张来确定纸张的大小,但只能定义一种自定义纸张规格。在Windows 2000/XP下,虽可创建多种纸张格式,在开发程序的机器上,确实也可以实现多种自定义纸张格式的报表打印。但当把程序发布到其他运行Windows 2000/XP的机器上时,即使按同样方式定义了各种纸张格式,在打印报表时却不一定是按定义的纸张格式打印报表。问题出在哪呢?在两台机器上分别打开报表文件(.frx),它实标上也是一种数据表文件,浏览其第一条记录的Expr字段的内容如图1所示,通过比较,问题找到了。
图1
Expr字段的内容记录着相关的打印参数,其中的PAPERSIZE=140行说明了纸张尺寸大小的编号,但在Windows 2000/XP下,在不同机器上所定义的相同规格的自定义纸张,在VFP报表文件中其PAPERSIZE的值并不一定是相同的,这也就是在不同机器上会出现同一自定义纸张规格的报表却打印出不同页面大小的报表的原因。
三、解决问题的方法
引起问题的原因找到了,如何解决呢?方法可能有多种,笔者通过实验发现,在VFP8.0的报表设计器中,首先按自定义的纸张规格设计报表。自定义纸张规格可通过WIN2000/XP的“打印机和传真”窗口,设置“服务器属性”,“创建新格式”进行定义,如图2、图3所示。
图2
图3
在图3中,可以看出创建了“10x5.5”和“14 7/8 x 33”两种自定义的纸张格式。在VFP8.0的报表设计器中,通过“文件”|“页面设置”菜单项来设置纸张的大小。按自定义纸张格式设计好报表后,保存并退出报表设计器,使用“数据工作期”对话框打开报表文件(.frx),双击其第一条记录的Expr字段打开编辑窗口如图1所示,清空Expr字段中的所有内容,关闭报表文件。通过上述修改,报表文件中没有了相关打印参数的记录信息,报表打印时的页面大小将由当前打印机的“纸张大小”决定。
接下来的问题是如何在程序中设置当前打印机的“纸张大小”。这个问题比较好解决,VFP提供了一个SYS(1037)函数,该函数的功能是显示如图4所示的“打印设置”对话框,允许用户调整打印机设置(诸如:打印机名、打印纸张大小、打印方向等)。
图4
图5
在程序的适当位置(如“文件”菜单中或表单中)调用SYS(1037)函数,即可设置要打印报表的打印机名,纸张大小和打印方向等参数。如图5所示,在表单中添加一个“页面设置”按钮,在按钮的click事件中写入:=SYS(1037)一条语句即可。在程序运行时,如果用户要打印清单,可先点击“页面设置”按钮,在弹出的如图4所示的“打印设置”对话框中选择打印机、纸张大小和打印方向后,再点击图5中的“打印清单”按钮,其后输出的报表将按“10x5.5”的纸张规格输出。
四、总结
本文所述方法的核心是修改报表文件(.frx)第一条记录的Expr字段的内容,清除其记录的相关打印参数信息,使报表的页面大小随当前打印机的纸张大小而定。只要通过WIN2000/XP的“打印机和传真”窗口,设置“服务器属性”,创建好各种所需要的自定义纸张格式,在应用程序中调用SYS(1037)函数,让用户在程序运行时控制各种打印报表的纸张大小,以实现多种自定义纸张格式的报表打印。
在这里需要说明的是,对于使用Windows系统提供的标准纸张格式(如A4,A5)的报表,无需修改报表文件(.frx)第一条记录的Expr字段的内容,其纸张格式也不受当前打印机的纸张大小设置的影响。只有自定义纸张格式的报表才需要修改报表文件。“打印设置”对话框中的设置,在程序退出前或重新设置前一直起作用,对同样格式的自定义纸张大小的报表,只需设置一次。但在第一次打印前,或要打印不同规格的自定义纸张大小的报表前,需重新设置。
该方法只能用于运行在WIN2000/XP环境下的用VFP 8.0编译的应用程序,对其他VFP版本编译的应用程序无效。
本文地址:http://com.8s8s.com/it/it27902.htm