VFP动态定位打印表格

来源:百度文库 编辑:神马文学网 时间:2024/04/26 08:31:32
在使用VFP设计应用系统的过程中,应用系统的表格输出部分一般都是在报表设计器下设计完成的,设计出来的表格,格式固定,位置固定。但在实践中我们发现:在一种打印机下调试设计出来的表格,换到另一种打印机时,表格的位置发生了变化,常常要靠移动纸张来解决。笔者经过多次测试后,利用编程解决了这个问题。
笔者通过对VFP的报表文件进行分析,发现报表文件其实同数据表的结构是相同的。其中后缀为.frx的文件存放报表控件一些主要信息,而后缀为.frt的文件存放的是备注部份内容。这些文件都可以使用数据表的操作命令,可以使用VFP的命令和函数来改变报表控件中一些值的大小,如在VFP命令窗口中对一个盘中已存在的名为“干部登记表"的报表文件进行操作:
USE 干部登记表.frx
BROW
这时我们看到的是一个数据表的内容列表方式,表中包含报表的字体、大小、颜色、对象性质等信息。这里我们关心的是各对象的位置参数,通过对这个数据表的测试、分析,可以得出objtype关键字段的信息。
Objtype代表的是报表中的各控件的类型,下面列出的是报表设计器中各控件在数据表文件中的objtype的值:
控件名
objtype值
标签
5
域控件
8
线条
6
矩形
7
圆角矩形
7
图片/active绑定控件
17
(其中圆角矩形offset值为16,矩形为0)
数据表中的vpos代表控件距报表左边的距离,hpos值为距报表最上边的距离,height值为控件的高度,width值为控件的宽度。
当objtype为9时,为报表设计器中基本项,它们通过objcode来区分。下面是报表中的基本项的objcode的值:
基本项 objtype值
标题项 0
页标头项 1
细节项 4
页注脚项 7
总结项 8
以上这些项的vpos、hpos值都为0,height值为高度(距上一项目的高度),width值一般都为零,实际宽度是由打印设置中的纸张大小决定的。
当我们了解这些字段所代表的内容之后,在程序中我们只要增加或减少数据表中所有报表控件的vpos值,就可以增大或减小打印输出中的左边距;增加或减少数据表中所有报表控件的hpos值,同时增加或减少报表相关基本项的height值,就可以改变打印输出中的上边距。下面我们用一个简单的例子演示程序操作过程。
一、利用报表设计器设计如图1的程序报表,报表命名为“干部登记表”。

图1 干部登记表
二、新建一个表单命名为“打印测试”,表单设计如图2。

图2 打印设置表单
表单中包括三个Lable控件,两个微调按钮,二个命令组按钮。
在“改变位置”按钮的Click. Event 事件中加入如下代码,移动距离分别为上下移动数、左右移动数乘以392.7。
SELE 0
USE 干部登记表.frx
GO 2
REPL HEIGHT WITH HEIGHT+THISFORM.SXYD.VALUE*392.7  &&移动标题项或页标头项的位置
REPL VPOS WITH VPOS+THISFORM.上下移动数.VALUE*392.7 FOR (OBJTYPE>4 AND OBJTYPE<9) OR OBJTYPE=17  &&移动报表中各控件的上下位置,移动数为“上下移动数”微调按钮中输入的值,值为正数向下移动,负数向上移动。
REPL HPOS WITH HPOS+THISFORM.左右移动数.VALUE*392.7 FOR (OBJTYPE>4 AND OBJTYPE<9) OR OBJTYPE=17
USE  &&打开报表库后一定要关闭,不然在运行这个报表时要出错。
THISFORM.上下移动数.VALUE=0   &&执行后上下移动数归零
THISFORM.左右移动数.VALUE=0  &&执行后左右移动数归零
“打印”命令按钮的Click Event 事件中加入如下代码:
REPO FORM 干部登记表 TO PRINT NOCO
“预览”命令按钮的Click Event 事件中加入如下代码:
REPO FORM 干部登记表 PREV NOCO
“退出”命令按钮的Click Event 事件中加入如下代码:
THISFORM.RELEASE
在运行该程序后,在打印纸放置位置不变的情况下,只需改变上下移动数、左右移动数的值,就可以改变打印纸上输出内容的位置。
通过上面的介绍,我们可以在各类表格设计过程中,利用以上的方法,就可以生成灵活方便实用的各式报表。