vfp怎么真正可以控制打印机?
vfp怎么真正可以控制打印机
譬如打印报表选打印机、设置打印机字体、预览、等等
怎么控制啊?
[解决办法]
打印报表选打印机、预览:
Report Form 报表 To Printer Prompt Preview
设置打印机字体:
应该需要打开报表,代码替换了。
USE 报表.FRX
参考
对 报表.FRX文件 的分析
*-----------------------------
其实报表文件.FRX是一个表,其.FPT是一个备注库,其库结构和一般自由表没什么不同,都可以USE打开他的???.FRX,其字段总共有74项,分别介绍如下,希能给大家有所帮助:
字段名称 类型 长度 小数 说明
1 PLATFORM C 8 操作平台(_DOS或_WINDOWS)
2 UNIQUEID C 10 唯一标识(当NAME合EXPR都为空时以_RHE开头, 否则以_RNR开头)
3 TIMESTAMP N 10 时间标签(先后次序)
4 OBJTYPE N 2 目标类型(1.环境; 2.数据库; 5.文字; 8.变量;9.TIMESTAMP为空; 23.TIMESTAMP为空)
5 OBJCODE N 3 目标代码(1.;4.;7.;53)
6 NAME M 10 名称(数据库名称)
7 EXPR M 10 表达式
8 VPOS N 9 3 行座标
9 HPOS N 9 3 列座标
10 HEIGHT N 9 3 高度
11 WIDTH N 9 3 宽度
12 STYLE M 10 风格(透明,不透明)
13 PICTURE M 10 格式或OLE文件名称
14 ORDER M 10 索引排序
15 UNIQUE L 1 唯一数据库(.F.,.T.,空)
16 COMMENT M 10 注释
17 ENVIRON L 1 是否报表运行环境(.T.时)
18 BOXCHAR C 1 画框字符
19 FILLCHAR C 1 表达式类型(C,N,D等,文字型的为空)
20 TAG M 10 (当该记录为记录环境的记录时,该字段储存打印信息等;记录数据库时,储存数据库名称)
21 TAG2 M 10 当该记录为记录环境的记录时,该字段储存打印控制等
22 PENRED N 5 前景红
23 PENGREEN N 5 前景绿
24 PENBLUE N 5 前景蓝
25 FILLRED N 5 填充红
26 FILLGREEN N 5 填充绿
27 FILLBLUE N 5 填充蓝
28 PENSIZE N 5 划线宽度
29 PENPAT N 5 指定填充图案(0.空;1.实体;2.水平;3.垂线;4.左 斜;5右斜;6.交叉;7.斜交叉)
30 FILLPAT N 5 划线类型(0.无;1.点;2.虚线;3. 虚线-点;4. 虚线-点-点)
31 FONTFACE M 10 字体类型
32 FONTSTYLE N 3 字体风格
33 FONTSIZE N 3 字体大小
34 MODE N 3 模式
35 RULER N 1 标尺(2-默认值,3-象素)
36 RULERLINES N 1 标线宽度
37 GRID L 1 是否显示网格线
38 GRIDV N 2 垂直网格线刻度
39 GRIDH N 2 水平网格线刻度
40 FLOAT L 1 浮动
41 STRETCH L 1 溢出时伸展
42 STRETCHTOP L 1 相对于顶端伸展
43 TOP L 1 相对于顶端固定
44 BOTTOM L 1 相对于底端固定
45 SUPTYPE N 1 控制类型
46 SUPREST N 1 控制设置
47 NOREPEAT L 1 每页都打印页标题
48 RESETRPT N 2 重置报表
49 PAGEBREAK L 1 每组从新的一页开始
50 COLBREAK L 1 从新的一列开始
51 RESETPAGE L 1 每组页号重新从1开始
52 GENERAL N 3 通用
53 SPACING N 3 空格
54 DOUBLE L 1 是否加倍
55 SWAPHEADER L 1 头互换
56 SWAPFOOTER L 1 脚注互换
57 EJECTBEFOR L 1 打印前走纸
58 EJECTAFTER L 1 打印后走纸
59 PLAIN L 1 指定只在报表开始位置出现页标题
60 SUMMARY L 1 是否仅打印总计和分类总计信息
61 ADDALIAS L 1 是否增加别名
62 OFFSET N 3 偏移(0-左;1-右;2-居中)
63 TOPMARGIN N 3 上边界高度
64 BOTMARGIN N 3 下边界高度
65 TOTALTYPE N 2 计算类型
66 RESETTOTAL N 2 重置(1-表尾,2-页尾)
67 RESOID N 3 源标识
68 CURPOS L 1 是否显示当前位置
69 SUPALWAYS L 1 是否打印重复值
70 SUPOVFLOW L 1 当细节区数据溢出时到新页或新列打印
71 SUPRPCOL N 1 当此列改变时打印
72 SUPGROUP N 2 当此组改变时打印
73 SUPVALCHNG L 1 若空行则删除
74 SUPEXPR M 10 是否打印控制条件
==============================
Objtype Objcode Offset 含义
5 0 文字
8 0 表达式
6 0 1 直线(水平线)
6 0 0 直线(垂直线)
7 4 矩形框(0~99椭圆)
用于报表布局的控制的特征值列入下表:
Objtype Objcode 含义
9 0 页头高度
9 1 页细节高度
9 3 组标头高度
9 4 组细节高度
9 5 组脚注高度
9 7 页脚注高度
其他常用到的字段有:
①水平坐标(Hpos);
②宽度(Width);
③表达式类型(Fillchar);
④字体(Fontface);
⑤对齐方式(Offset)。
[解决办法]
接上:
------------------------------------------
基本原理
----VFP报表生成器生成一个报表文件(.frx)和一个报表备注文件(FRT),这两个文件记载了在报表生成器中设定的所有内容,而这两个文件与一般自由表并没有本质区别,那么,只要我们弄清报表布局和控件在其中的存贮方式,我们就可以绕过报表设计器,直接对报表文件进行操作来设置报表的列、字型、字体、图形等,报这些对操作包含到应用程序中,则可实现前面所说的,可由最终用户按需设定的报表。
----VFP报表文件的记录主要有三类,一类记载了报表的数据环境、有关设置,一类为报表的各个带区划分。一类为报表上的各种控件(将打印的变量、线条等),各种信息用类别(OBJTYPE)和代码(OBJCODE)来区分。
----在开始构造报表文件时,我们可由现成的报表文件中拷贝报表文件的结构和环境设置记录。如:第一条记录(其OBJTYPE=1,OBJCODE=3)记录系统的打印机设置,然后要据需要,设定带区和控件。注意:在报表文件中有一字段PLATFORM,在WINDOWS环境中,对所有的记录应置其值为WINDWOS。
带区的设置
----VFP报表的页面被标题区、页标头区、细节区、页注脚区等,这些被称为带区,在报表文件中的类别为9,即OBJTYPE=9。其代码OBJCODE分别是:
标题:0页标头:1
组标头:2细节:4
组注脚:5页注脚:7
总结:8
----一般来说,带区都是具有高度而不需宽度(组标头和注脚有时也有“宽度”,稍后我们将解释其意义)。报表文件中的HEIGHT字段用于记载其高度。高度的单位为点(1CM≈3437点)。
----设定整个报表分为多少个带区,以及各带区的高度是我们首先要做的工作。
----如:设置标题区、页标头、页细节、页注脚的高分别为:4000,4100、2300、3000,则在报表文件中应有如下记录:
OBJTYPEOBJCODEHEIGHT
904000
914100
942300
973000
报表控件的设置
----报表文件中主要有以下几种控件:
OBJTYPEOBJCODE
标签50
域80
线条60
矩形74
图形或OLE170
控件主要需设置以下信息:
VPOS起始纵坐标
HPOS起始横坐标
HEIGHT控件高度
WIDTH控件宽度
EXPR备注型,对于标签记载标签的字符串,
对于域控件记载其变量或表达式
FONTSIZE标签或域中字符的磅值
FONTFACE备注型,标签或域中字符的字体
PICTURE备注型,保存图片控件的文件名和路径
SUPALWAYS是否输出重复值.
----需要注意的是起始纵坐标(VPOS)的推算,带区划分完毕后,报表控件起始纵坐标决定了该控件所属带区,也就决定了它的输出位置和次数,比如细节带区的控件随每个记录重复输出,总结带区的控件则只在报表结束时才输出一次。
----VPOS值并非报表输出时的实际位置。而应想象为在报表设计器界面中的位置。所以,推算VPOS值时应考虑两个因素:在这个控件之前的带区个数(N)和这些带区高度之和(H)。参考以下公式:
----VPOS=H+2083*N
----结合前例,现在要在报表中输出表D1的ID字段,只需在报表文件中增加一条记录,主要的设置如下:
OBJTYPE8
OBJCODE0
VPOS12266(4000+4100+2083*2)
HPOS1000
HEIGHT2000
WIDTH5000
EXPRd1.id
FONTSIZE12
FONTFACE宋体
SUPALWAYS.T.
----在实际应用中,VPOS的值经过公式计算后,还可以作进一步的调整。
有关数据分组
----如报表需要分组,则需设置分组带区,分组带区组标头、组注脚,在组标头的EXPR中写入分组表达式。还有几个与分组有关的字段:
----BREAKEPAGE设定是否每一组从新的一页开始,RESETPAGE设定是否每组都重设页号,NOREPEAD设定是否每页都要打印组标头。为使组标头不孤立的打印在页末,可设定一个高度,当打印组标头时,如果此时该页所剩的区域高度小于设定一个高度,则组标头将打印到下一页。这个高度通过组标头和组注脚的WIDTH来设定。
有关数据环境和其它问题
----报表文件一般用中最后的两条记录(其OBJTYPE的值分别为25、26)来记载数据环境。但在编程中,我们总是先对数据源进行一些筛选、过滤处理后随及传递给报表文件,即在报表文件创建数据环境。因此无需把数据环境写入报表文件。
------------------------------------------
《报表.frx字段及内容解释》
platform=”WINDOWS”
objtype = 8 且 objcode = 0 表示这是一个字段对象(expr为表达式)
objtype = 5 且 objcode = 0 表示这是一个标签对象(expr为标签内容)
objtype = 6 且 objcode = 0 表示这是一个线条对象
objtype = 7 且 objcode = 4 表示这是一个方框对象
objtype =17 且 objcode = 0 表示这是一个OLE
objtype = 9 且 objcode = 3 表示这是一个分组表达式
objtype = 9 且 objcode =0 增加标题带区
objtype = 9 且 objcode =8 增加总结带区
objtype=18 时 name=定义的变量名,expr=变量初始值
vpos 字段的纵向位置
hpos 字段的横向位置
height 字段的高度
width 字段的宽度(在组表达式中,表示小于这个值时从新的一页上开始)
fillchar 字段的类型
picture存放格式,例如”@Z”
comment存放备注
penred、pengreen、penblue、fillred、fillgreen、fillblue为颜色显示,一般值为-1
pensize=0、1、2、4、6表示细线、1、2、4、6磅
penpat值0、1、2、3、4、8,表示无、点线、虚线、点划线、双点划线、直线
fillpat值为方框的填充图形号
fontface 字体
fontstyle的数值从0到4,分别为(常规、粗体、斜体、粗斜体、下划线)128表示删除线
fontsize 字号
mode=1表示透明,mode=0表示不透明
folat=t 代表域控件位置为浮动
stretch=t 表示溢出时伸展
top=t 代表域控件位置为相对带区顶端固定
bottom=t代表域控件位置为相对带区底端固定
norepeat=t表示若是空白行则删除(在组表达式中表示每页都打印组标头)
pagebreak=t表示每组从新的一页上开始
resetpage=t表示每组的页号重新从1开始
resettotal值为1、2、5+I(I表示组编号,如组1为1)分别表示计算时重置到报表尾、页尾、组尾
offset值为0至2,表示格式为(左、右、中对齐)
offset为0、12、16、24、32、99分别表示矩形、圆角矩形1、2、3、4、5
totaltype的数值从0到7,分别为(不计算、计数、总和、平均值、最小值、最大值、标准误差、方差
supalways=t 且supvalchng=f打印重复值
supovflow=t表示当细节区数据溢出到新页/列时打印
suprpcol=3表示“在新页/列的第一个完整信息带内打印”,suprpcol=0表示否
supexpr存放打印条件表达式