Visual FoxPro编程技巧 定制桌面 是否感觉到VFP提供的桌面有些不合你的口味?如果不喜欢那些最大化最小化和关闭按钮，试试在你的应用程序初始化时加入如下代码段： with_ SCREEN .BackColor=rgb(64,128,128)
.Caption=″通用管理信息系统″
.ControlBox=.F.
.MaxButton=.F.
.MinButton=.F.
.WindowState=2
end with
制作“空白”菜单
通常的表单会因为标题条、控制盒等影响其实际使用面积。能否做出一个纯粹的“空白”表单呢?答案是肯定的。如果你和我一样讨厌Form的标题条，请按如下方式设置其属性：
with Form1
.Caption=″″
.Closable=.F.
.ControlBox=.F.
.MaxButton=.F.
.MinButton=.F.
.Movable=.F.
end with
可以将这样的一个表单保存为一个“空白”表单类，以备不时之需。
协调表单、菜单、工具条
菜单、工具条、表单，无疑使我们的应用程序呈现出一派极“友好”的界面。但是，要使这些“花里胡哨”的东西协同一致地工作，的确要费些神。
设现在有一个为DataInput.scx的数据录入表单集，其表单Form1上有一名为CmdAdd的表单按钮，Caption为“新增”，与之对应的工具条上亦有一“新增”工具条按钮，而对应的菜单上还有一“新增”菜单项，如何使这三者协同工作呢?以下方法可供参考。
以表单按钮为基准，首先定义好其挂接的功能，即在其Click事件中加入相应的代码。然后，在工具条按钮的Click事件中，加入以下代码：
=ThisFormSet.form1.CmdAdd.Click()
在菜单设计器中，打开“新增”菜单项，在其挂接的命令中加入一句：
=DataInput.form1.CmdAdd.Click()
这样，三者就可以“步调一致”地工作了。当然上述情形仅是最简单的一种，实际使用中还要协调其他一些东西：按钮的Enabled属性，菜单项的set skip等等。
按钮、菜单一多，就更显麻烦，以至于有时不得不专门在表单集中设立一个新方法用于协调这些东西。
附带指出，与Visual Basic的菜单不同，VFP的菜单依旧保留FoxPro 2.x的非“对象”化特色，并无Enabled之类属性和Click事件。希望VFP的下一版本会将菜单也“对象”化。
自动停放工具条
工具条已成为Windows程序的标准配置。VFP在制作工具条方面也做得相当不错：只需将工具条类从类库中拖动到表单集中，定义若干按钮之类控件，再定义相应按钮的功能就可以了。
但不知你是否注意到一个小问题：缺省状态下，做好的
工具条是“悬浮”在表单集中的，运行时要人工“停靠”在菜单栏下，这显然会影响使用效率，同时更有碍美观。
解决办法极其简单：在该工具条的Activate或Init事件中，加入如下一行代码：
This.Dock(0)
建议将此代码加入到你的工具条类中去。
小改Combo Box
Combo Box名称的由来就是因其兼有文本框和列表框的功能，按理讲应可以输入列表中没有的项目。但是实际中发现，若输入的是列表中不存在的项目，则光标移出该Combo Box后其输入框中仍是一片空白，而与其绑定的字段中也并未存储输入的值，由此看来，Combo Box的“文本框”功能似并未体现出来。这时需要我们自己来给Combo Box加些手工“补丁”。好在Combo Box属性甚多，这个“补丁”也不太难加。在该Combo Box的LostFocus事件中加入如下两句：
This.Value=This.DisplayValue
This.DisplayValue=This.Value
然后在该Combo Box的GotFocus事件中加入一句：
This.DisplayValue=This.Value
此法将Value及DisplayValue两属性颠来倒去，看上去犹如玩文字游戏一般，实际上也只解决了绑定字段录入及显示，而对Combo Box本身的RowSource未作修改，因而并非良策。欲将新增数据录入RowSource，还得视RowSourceType具体设置情况手工再“补”，这样怕是又要费些周折了。
巧设Listbox属性
留意VFP本身的联机帮助了吗?当选择索引方式查看帮助时，只要在查找文本框内输入一两个字符或汉字，列表框会自动查出以此字符或汉字开头的相应主题供你选择。在你的程序中也可应用这种技术：
在表单上布置一个文本框text1，一个列表框list1，设置list1的RowSourceType为6(字段)，RowSource为table1。名称(table1为一表名，“名称”为该表中一字段名)，在text1的InteractiveChange事件中加入以下代码：
loca for likec(allt(This.Value)＋″＊″，table1.名称)
Thisform.list1.Value=table1.名称
一对多表单中新增子表数据
一对多表单(或称父/子表单，主/细表单)是VFP最重要的录入工具之一。子表的数据通常是利用Grid控件录入。理论上讲只需将Grid的AllowAddNew属性设置为.t.即可录入新的子表数据，但实际中发现这并不十分可取：“下移”光标键(DNARROW)既是记录移动的控制键，又是记录新增的控制键，而最关键的问题则是，当子表中没有与父表中连接字符相符合的记录时，利用DNARROW根本无法在Grid中输入数据。以下提供一个可行方案：
将Grid的AllowAddNew属性设为.F.，让DNARROW键专司“记录移动”之职；让Ctrl(控制键)与DNARROW键的组合来实现新增记录的控制；
将Form的KeyPreview属性设为.T.，以让Form拦截Ctrl＋DNARROW组合键；
在Form的KeyPress事件中加入如下代码：
do case
case nkeycode=145　＆＆Ctrl＋DNARROW
insert into 子表(连接字段) values (父表.连接字段)
Thisform.Refresh
endcase
注意上述insert语句的作用：它可以在子表中保持数据的引用完整性。如果使用append blank语句，后面还应加上一句“rep1子表.连接字段with父表.连接字段”。
一对多表单中删除子表数据
参照上则技巧，将Ctrl＋Del组合键作为删除控制键，在上述endcase语句之前再加入一个case分支：
case nkeycode=147　＆＆Ctrl＋Del
sele 子表
if MessageBox(″是否删除本记录?″,1＋32＋0,″请确认″)=1
set deleted on
dele
Thisform.Grid1.SetFocus
endif
建议将Grid的DeleteMark及RecordMark属性设置为.F.，将ScrollBars属性设置为2(只显示垂直方向的滚动条，如果子表字段不多则更应如此)，这样会显著增加Grid的有效使用面积，而视觉感受也会舒服许多。
用Spinner实施数据检验
尽管可以用数据库容器的字段级规则来检验数据合法性，但许多程序员还是愿意将字段检验功能放到表单中。如果是这样的话，对于数值型字段来讲，最好的选择就是使用Spinner控件，它提供了极简便的合法性检验手段。现在假定有一数值型字段，其数值范围必须在0和5000之间，则可将一Spinner控件与其绑定，且设置该控件的相关属性如下：
with Spin1
.KeyboardHighValue=5000
.KeyboardLowValue=0
.SpinnerHighValue=5000
.SpinnerLowValue=0
endwith
若输入超出设定的范围，系统会自动提示出错信息，光标也无法离开Spinner，可见用Spinner作合法性检查方便而高效。
中英文自动切换
在用VFP5.0开发应用系统时，结合数据进行处理，应用最多的是文本框对象，特别是进行中英文的输入时，来回切换非常繁琐，所以我们可以借助自定义子类，来实现中英文输入的自动切换。其步骤如下：
通过系统菜单栏“文件/新建/类…”启动“新类”对话框，填入类名：gsTextBox,并设置父类为:TextBox。按“确定”键进入类设计器画面。新增一个属性，来作为对象是否启动中文输入法的控制码。新属性设制意义说明如下：

通过系统菜单栏“类/新建属性…”启动“新建属性”对话框，按上表设置属性，其中可视性设为：公共。最后设置GotFocus与LostFocus事件过程：
Gotfocus Event事件过程：
If this.是否中文
=imestatus(1)
else
=imestatus(0)
endif
Lostfocus Event事件过程：
=imestatus(0)
到此，类已经定义完成，以后在设计表单时，通过表单控件“工具栏/查看类/添加…”把自定义类加入，并且设置“是否中文”属性即可实现中英文输入的自动切换。
（周 凡）