打印

全国计算机等级考试二级VFP报表设计的常用技巧

本主题由 System 于 2007-12-4 02:12 提升

全国计算机等级考试二级VFP报表设计的常用技巧

一、部分与打印有关的系统变量
: j$ h# [1 Z$ j+ {. ^
  VFP本身为我们提供了几个与打印有直接关系的系统变量,它们是部分)
6 R$ F6 M7 _3 a_BOX    是否打印文字边框,.T.=打印
* W. R* z3 {* L2 v1 s_GETNPD   指定或保存打印机接口驱动程序的文件名。
# }, H( }  t1 ]6 c. t  D6 E_PADVANCE 设定打印纸进纸方式,=FORMFEED(默认)整张进纸。
4 k5 I% \* q, V1 j* j, D# X" {0 z_PAGENO   设定或保存当前的打印页号。 4 ~- G/ W) I( }* _- }
_PBPAGE   设定或返回打印的起始页号。
7 F$ T) ]7 Q2 n# s5 V. [_PEPAGE   设定或返回打印的终止页号。 ; Q5 Q8 D5 F1 d/ N* H* w3 Y; d* A9 p
_PCOLNO   设定或返回当前打印头的列。
& `- f/ `, c# a3 a* G_PLINENO  设定或返回当前打印头的行。 * V+ f; z! D$ Q, @) H
_PCOPIES  设定或返回打印份数。 - }6 M7 y6 q2 H2 L
_PLENGTH  设定或返回打印纸的页长,默认=66行长。 ' b* ?. I% p* G) o  L9 {# J
_PPITCH   设定打印机的打印密度。
7 p$ c) @: N5 B+ V2 |. [2 q_PQUALITY 设定打印机的打印质量。+ r& N% c0 G: Z! c: u1 Z+ ^
... ...
: q  @! C  O1 `9 g$ H8 t  这些变量在设计报表程序时,有些是很有用的,故在此列出。   二、一些常用的打印技巧
" `# g+ N1 S1 F- ^) m% s5 x+ k  1.怎样打印指定的页 : P% M3 V; w% C# m! p2 Q- u7 i
REPORT FORM XXXX RANGE 2,5 TO PRINTER  &&从第2起打至第5页止 6 a% Y. h- |" s7 r4 x% r- y
  2.如何计算总页数,以实现“第?页/总?页”
+ K! [* K2 t7 S& m  K  在打印前根据细节区所打印的记录条数,先进行计算,然后再打印,具体代码:
) f( ?# O; R  l% f8 I7 cPUBL mPAGE
, l" p/ v, I& o+ M6 C/ ~4 |SELE XXX   &&xxx=供打印的数据表
0 e* u" G3 A$ }( `  U) _4 ~- c7 pXX=10     &&XX=细节区所打印的记录条数 + b( i9 l5 ?0 \6 U
mPAGE=IIF(RECCOUNT()%XX=0,INT(RECCOUNT()/XX),INT(RECCOUNT()/XX)+1)   Y9 p8 r2 t& a
mPAGE就是总页数,这样在需要总页数的地方就可直接引用mPAGE变量了。
: {, a  l% Z) t8 D  3.如何使报表打满一页5 x& h; Y; i4 c- Q
  如果打印的记录不足一页,“页注脚”会自动上移,影响报表的美观,解决的办法和上面的差不多,即补足一页中所缺少的记录(补足空白记录):% k9 m8 a/ i: r. I2 `% Z
SELE XXX    &&xxx=供打印的数据表
4 @, r! U* z6 l% Y6 ]* z( PXX=10     &&XX=一页细节区所打印的记录条数 , r* J$ r# x# F7 n
mI=RECCOUNT()%XX    &&取得缺少的记录条数8 p& ]+ @! A& h; ]3 g0 r# f9 i
FOR I=1 to mI
" u! |0 I0 ?4 S3 W5 A0 n  APPEND BLANK
" V4 B- V) i9 ?" f6 K; Q4 _ENDF

TOP

4.报表在设计时明明可以打印,可一安装到其它机器或重装系统后,就会出现“XXX 带区太大不能放入页中”等提示,而且无法正常退出(尤其是对自定义纸张大小的程序),这是为什么呢?  我们用报表设计器设计的打印程序,保存退出后,磁盘上就会出现 .frx和.FRT文件,我们的所有设计均保存在这两个文件中。在VFP中 .frx相当于.DBF表,.FRT相当于.FPT备注型文件,我们用USE XXX.frx 可以象打开.DBF文件一样打开.frx文件,在.frx文件中有个Expr备注型字段名,在这个字段名中有如下内容:其中()内是我所加的译文
; V5 l  j4 w9 _0 YRIVER=winspool
+ _9 v, L& C# f; h3 hDEVICE=Epson LQ-1600K
& ?" w5 {# b$ Z* N2 \% w5 O4 lOUTPUT=LPT1:
# L4 I  W* r9 R6 E' f( p( S9 V' QORIENTATION=0   
3 l2 `8 v; Y0 \  ~- hPAPERSIZE=256       (纸张大小) & p1 v: V8 |/ }/ x
PAPERLENGTH=1000     (纸张长度)
4 a  Z8 z; Y$ `3 R  JPAPERWIDTH=1600      (纸张宽度) 3 K$ I, A3 q9 @: _+ K' u8 S
DEFAULTSOURCE=8     (默认来源) 9 M1 D& _( C5 D) i5 @
PRINTQUALITY=180     (打印质量) 5 f! W( x' [! p0 G1 J. l
COLOR=2 ) z2 J7 m% G2 A! m5 R
YRESOLUTION=180 ) E5 z# ~, B; r* {+ \/ s
TTOPTION=1 0 ]3 g; O* b! _6 n# d: I; c" C; T
2 ~% I) S  V# u3 L
从这个Expr备注型字段里可以看出:PAPERSIZE=256 这里的256表示是自定义纸张,如果:
1 G& q# c& ?- y" l, APAPERSIZE=9 为A4、11为A5 具体数据见VFP帮助的Printfo()一节, 而:  d" e: n: W  [% |6 H
PAPERLENGTH=1000  (纸张长度) " s1 C0 |1 x& N" b8 z: P+ q
PAPERWIDTH=1600   (纸张宽度)
' o+ m8 I! r% b9 n4 f: R则分别代表自定义纸张的长度和宽度。 之所以会出现上面提到的问题,是因为系统重新安装打印机后,WIN系统一般默认的是A4打印纸,与我们设计时保存在.frx文件里的纸张不符,因而造成这种情况。 那么如何避免出现这个问题呢?
3 b, z. `0 K0 C$ d. ]2 f* O! P& V  下面是一段检测纸张类型的代码,供您参考:
- G; ?0 D3 {" l/ f/ ?这段代码必须放在执行report form ... 命令前。
1 w; _; x' n) d% j4 A3 {0 [1 Q& E
use xxx.frx in 0 ALIAS mPrint    &&在空闲工作区以mPrint别名打开xxx.frx文件
, a1 M/ \* ~6 q4 K& n& Xx=atcline('PAPERSIZE',mPrint.Expr) &&取得PAPERSIZE在Expr字段中的行
8 X5 B9 {4 f. R% I# }8 H" q" q/ ?: J" lsSIZE=subs(mline(mPrint.Expr,x),11) &&取得设计时保存的纸张类型 & Y8 ?' a. g( m, B
mSIZE=allt(str(Prtinfo(2)))     &&取得当前打印机默认的纸张类型 6 {2 x5 J+ B* T, h  i
x=atcline('PAPERLENGTH',mPrint.Expr) &&取得纸张长度在Expr字段中的行 " y4 p0 d5 D7 g* R) G8 }! S
sLEN=subs(mline(mPrint.Expr,x),13)  &&取得纸张长度
5 k  n$ _) W7 t$ S' p; U/ C$ Ix=atcline('PAPERWIDTH',mPrint.Expr) &&取得纸张宽度在Expr字段中的行 3 R* y( q" o! \2 I" L1 f: J! ^, ~6 M
sWIDTH=subs(mline(mPrint.Expr,x),12) &&取得纸张宽度
4 I$ X+ w6 A# }: J; Quse in 'mPrint'          &&关闭xxx.frx文件8 V5 f+ g+ S& Z- F
if sSIZE=mSIZE          &&如果相符,则正常打印
$ [+ j& u7 X/ O; g% D report form xxx.frx to printer
% u: [* _1 A# W+ f" Z" oelse * d3 s# m1 {9 g8 v; m% U
 Messagebox('请设定打印机纸张为自定义:长='+sLEN+',宽='+sWIDTH,0+48+0,'提示') 3 C" _' D* g- m8 g  n/ n
 report form xxx.frx to printer prompt &&打印前先打开打印机设置对话窗口
" Z: z9 w& k0 F! i6 Vendi - M& X% u. {9 a1 f
! O% h) N. I  H& G  j3 M; N
  5.不让打印的结果显示在屏幕上! {0 g- Y8 `/ k
report form xxx.frx to printer Noconsole! u% C/ y. X; A. v: q# c

+ G. E+ z/ T: ?' c) e  6.打印或打印预览时,如何使系统打印工具条不出现  系统提供的打印工具条,我们无法检测其各按钮的事件,不能掌握用户当时操作的情况,那如何不让它出现呢? 1 M8 v/ ?+ U7 P$ s% M, {- Z
 首先您得做一个表单(最好是模式表单),用于代替系统的预览窗口(Preview),然后:; M/ g& b, G; @$ }6 {
do form dybd          &&打开这个表单 4 |9 w# i$ T8 G% `$ {8 u
report form xxx.frx windows dybd % h+ h2 W9 O5 L2 d
  这样系统提供的打印工具条就不会出现了。
; R' a. `' {3 I9 \% e4 H  当然如果自己再做个类似于打印工具条的类,既可掌握按钮事件又美观就更好了,注:经查VFP3.0可能没有windows子句。

TOP



站长QQ:82335368
请严格遵守中华人民共和国法律和本论坛规章制度.
本论坛(除总公告版外)中的所有言论纯属发表者个人观点,与 海师后院 立场无关.