VFP 6.0的十个实用技巧 一.选择网络打印机 当安装有多台网络打印机，在使用VFP 6.0编制的程序进行打印操作时，是否可以选择其中的某一台空闲的网络打印机进行打印，而不一定非要从默认打印机输出，从而提高工作效率呢？我们可以在执行命令：Report From … To Printer 之前，先执行下列程序代码：Set Printer To Name Getprinter()，就可以调用操作系统的“打印设定”对话框，用户利用该窗口即可达到灵活选择空闲打印机进行打印输出的功能。(注:可供选择的打印机名是用户计算机上已安装好的打印机名)
二.恢复丢失了的FPT文件
由于误操作，将自由表的备注文件删除，致使自由表无法打开。遇到这种情况我们可采用下述方法解决:
1.创建一个新的自由表，且该自由表只含一个字段，其类型为备注型。关闭该自由表，将其扩展名为FPT的备注文件复制给误删除的自由表的备注文件，或将该备注文件改名为误删除的自由表的备注文件即可。运行下面的程序同样也可以恢复丢失了的FPT 文件：
accept '请输入丢失了.FPT
文件的自由表名称(不带扩展名)：' to namef
namef=trim(namef)+'.bbb'
crea dbf &namef (aa m)
use
dele file &namef
2.用VFP低级文件函数创建一个空的FPT文件，原自由表即可打开。程序清单如下：
accept '请输入丢失了.FPT
文件的自由表名称(不带扩展名)：' to namef
namef=trim(namef)+'.FPT'
hand=fcreate(namef)
abc=repl(chr(0),3)+chr(8)+
repl(chr(0),3)+'@'+repl(chr(0),504)
=fwrite(hand,abc)
=fclose(hand)
return
上述方法只是为丢失了FPT文件的自由表建立了一个新的FPT文件，原FPT文件中的内容已经丢失，无法恢复。在实际操作中若遇到这种情况，最好是恢复原来的FPT文件，若原FPT文件无法恢复时再采用上述方法。
三.脱离VFP运行程序
利用VFP 6.0创建的应用程序，被编译成可执行程序后，若要使其脱离VFP环境独立运行，除了我们所知道的在应用程序目录中需包含一个名为“CONFIG.FPW”的配置文件外，还必须包含“VFP6R.DLL”、“VFP6RCHS.DLL”、“VFP6RENU.DLL”这三个动态链接库文件。这三个文件在“Windows\System”目录下，用户可直接将其复制到自己的应用程序目录中。最后再经过编译形成可执行程序，运行安装向导创建发布磁盘，我们开发的小应用程序就可以堂堂正正地在Windows 98下安装运行了。
四.低级文件函数加密数据库
VFP有一个十分薄弱的环节就是数据库的保密性差。由于.DBF文件都是敞开式的，甚至用DOS中最简单的TYPE命令都可以浏览，因此,我们可以从以下两方面对数据进行加密：
1.在向自由表中增加数据时,就进行加密,即更新自由表时就对数据进行加密,在读取数据时再解密。
2.用VFP提供的低级文件函数进行加密，加密后的文件无法打开、浏览，使用时，再执行该加密程序即可将加密的自由表还原。
**加密数据库程序(同时也是解密程序)**
set talk off
close all
clea
@10,10 say "请输入要加密的
自由表名(含扩展名):" get file1 defa ' '
read
handle=fopen("&file1",2)
if handle< 0
@14,10 say "不能打开文件!"
=inkey(0)
retu
endif
j=0
do while .not.feof(handle)
bb=fread(handle,1)
cc=chr(mod(asc(bb)+128,256))
=fseek(handle,j)
=fwrite(handle,cc)
?asc(bb),asc(cc)
j=j+1
enddo
=fclose(handle)
close all
retu
五.设置TextBox对象的输入长度
在以前的Xbase语法中，我们可以通过Picture参数定义某变量或文本栏的输入长度格式，而在VFP中的TextBox对象中则支持了Format和InputMask属性来定义输入的格式。我们可以使用比较原始的方法来进行设定，比如当要求输入有20个栏位的文本框对象时，我们可以在此对象的InputMask属性中定义为InputMask=“XXXXXXXXXXXXX XXXXXXX”。
但是这样的设定方法非常麻烦，尤其是当面对更长的字符串输入时更是不方便。其实我们完全可以用另外一种方法来把这样的需求设计过程变得很简单，下面就具体介绍一下这种简易的快速设定输入栏位的方法。
利用Replicate()函数设定输入长度这里我们同样利用了对象的InputMask属性来定义输入格式和输入长度，但是当对象的输入比较长时，则可以借助算术表达式的方式来对其进行设定。通过属性窗口中的InputMask属性建立表达式对话框，我们可以利用Replicate()函数设定重复的“X”的个数(本例为20)。完成后回到属性设置窗口，我们可以看到在InputMask属性栏中出现了“=Replicate(20)”位值的表达式，这样，我们就轻松地完成了长字符输入的长度控制。由此我们也可以体会到善于使用表达式给我们带来的方便之处。
六.中文文本框的设计方法
在程序开发过程中,我们经常要设计一些文本框,而且这些文本框要求只能输入中文。在这种情况下,通常需手工启动某一种中文输入法。如果软件能够自动启动缺省的中文输入法,那么将会给编程人员带来很大的方便。下面的类便能实现这一功能,具体的设计步骤如下:
1.创建一个新类,其基类是“TextBox”,类名为“中文TextBox”,存储于“myclass”类库中。
2.进入类设计器后，设置“中文TextBox”的各项属性，如字体、颜色等。
3.设计GotFocus事件，代码为:=IMESTATUS(1)表示当光标移到此框后，自动启动中文输入法。
4.设计LostFocus事件,代码为: =IMESTATUS(0) 表示当光标移开此框后,自动关闭中文输入法。设计好后,保存到文件即可。
七.立体框类的设计方法
在VFP的标准类里提供了一个形状控制类(Shape),可以简单地将Shape的“SpecialEf fect”属性设置为“0-3D”，将“BackStyle”属性设为“0-透明”,来设计三维立体框。
然而这样的三维立体框太单调,缺少变化。通过以下的设计方法, 我们可以作出类似于VB中的Three_D Panel那样的效果。具体设计步骤如下:
1.新建一个类,基类是“Container”,类名为“Three_Panel”,存储于“myclass”类库中。
2.进入类设计器后,设置“Three_ panel”的各项属性。属性设计完毕后,存入文件,就可以得到凸起效果的边框类。
3.通过调整“SpecialEffect”的值为“1-凹下”,可以设计凹下效果的边框类(three_p anel_ao)。 调整其余参数可以得到不同效果的边框。
八.在程序中播放动画
我们知道，VFP只支持静止的图片，无法直接播放GIF动画。但网上许多有趣而华丽的GIF动画的确令人心动，如何将这些动画插入到你的VFP程序中，让你的程序更吸引人呢？
其实很简单，将GIF动画分解成各单独的静止的GIF或BMP图片，然后在VFP使用计时器让这些静止的图片轮流出现，就产生动画效果了。
将GIF动画分解为静止图片的软件有很多，在网上很容易找到，如Animagic GIF 等。分解出来的图片我们分别以a0.bmp、a1.bmp……这样的形式保存。在表单中添加计时器TIMER1，TIMER1的Interval属性设为100，Enabled属性设为.T.，再添加Image1控件，其Backstyle属性设为0(透明)，Stretch也设为0(裁剪)。
在FORM的LOAD过程中写代码：
Public I , N
I=0
N=5(静止图片的总共数目)
在TIMER1的TIMER过程中写代码：
Local j
i = mod (i+1,n)
j = alltrim( str(i) )
thisform.image1.picture="a"－j－".bmp"
运行表单，我们就可以看到熟悉的GIF动画了。
九.粘贴VFP顶层表单
当你将表单设置为顶层表单并独立运行于Windows下时，就会发现表单中复制粘贴功能失效，给实际工作造成极大的不便，从而使编制的软件达不到专业水准。通过认真分析与实践，造成这一问题的原因是微软设计VFP时，只考虑了位于系统选单下的表单的复制和粘贴情况，即位于系统选单下的表单可使用复制及粘贴热键，而处于Windows下的表单完全脱离了系统选单的控制，因此复制及粘贴热键失效。
解决的办法是可在表单的控件(本文举例为文本框)中,为KeyPress Event编写如下事件处理程序,该事件处理程序首先将选择内容复制到Windows剪贴板上，然后再将剪贴板上的内容添加到控件中。
KeyPress Event
LPARAMETERS nKeyCode, nShiftAltCtrl
if nkeycode=3
&& CTRL+C 复制
-cliptext=this.seltext
endif
if nkeycode=22
&& CTRL+V 粘贴
do case
case this.selstart=0
this.value=-cliptext+this.value
case this.selstart〉=1
and this.selstart〈=len(this.value)
this.value=subs(this.value,1,this.selstart)+
-cliptext+subs(this.value,this.selstart+1)
endcase
endif
thisform.grid1.column1.setfocus()
sele recetem
if not eof()
skip
endif
thisform.refresh
十.为VFP添加循环微调控件类
在VFP编程中，微调控件是最常用的控件之一。按照微调控件提供的基本功能，通过单击向上或向下箭头，而达到微调控件的最大或最小值时，如继续单击向上或向下箭头，将保持最大或最小值不变。笔者通过对Spinner控件属性和事件的分析，用编程的方法实现了循环微调控件功能。
循环微调控件(CycleSpinner)所实现的功能是：当单击向上箭头而达到最大值时，再单击向上箭头，能自动跳到最小值;当单击向下箭头而达到最小值时，能自动跳到最大值;其余功能均继承Spinner基类的功能。具体实现方法如下：利用表单控件，在表单中设计一个微调按钮，并设置如下属性：
SpinnerHighValue=Max
&&Max应小于Spinner基类所
&&提供的最大默认值
SpinnerLowValue=Min
&&Min应大于Spinner基类所
&&提供的最小默认值
Value=1
Name='CycleSpinner'
在Init事件中写入如下代码：
This.SpinnerHighValue=This.
SpinnerHighValue+This.Increment
This.SpinnerLowValue=This.
SpinnerLowValue－This.Increment
在InteractiveChange事件中写入如下代码：
If This.Value=This.SpinnerHighValue
This.Value=Int(This.
SpinnerLowValue+This.Increment)
Endif
If This.Value=This.SpinnerLowhValue
This.Value=Int(This.
SpinnerHighValue－This.Increment)
Endif
Thisform.Refresh
再将其作为类保存起来，添加到你的类库中。
若你在编程中，需用此功能，就可直接用此循环微调控件类了。

(朱运喜)