优化VFP的组合框
2000-08-14 16:25:47
在Windows操作系统和它的众多应用软件中,组合框(Combo)有着十分广泛的应用,它集中了文本框和列表框的特点,既可输入,又能选择,给我们录入资料带来了很大的方便。但由于组合框本身的特点,在实际应用中,还是有许多时候无法满足我们的一些特定需求。下面以VFP为例,谈谈利用编程优化组合框的方法。
一、输入与选择的结合使用
为了防止录入错误,组合框拒绝接受键入的非列表项中的内容,而且往往不给出提示,这种限制并非我们每时每刻都需要,实际应用中很多时候希望直接输入与下拉选择都能被接受。举一个实际例子:假设想从列表框中得到城市名,由于我国的城市非常之多,把每个城市都放进列表项里是不现实的,只能放一些有名的大城市,这时就很迫切需要列表框能接受直接输入的列表里不存在的一些小城镇名了。
通过keypress事件中捕捉键入的字符固然能部分解决问题,但有局限。另一种做法是建立一个文本框和一个组合框,然后用双击鼠标等方法切换使用,或干脆两个摆在一起使用。这样做的确能解决问题,但操作不方便,而且极不美观。笔者同样是将文本框和组合框结合在一起,不过做了一点小手脚,让使用者误认为只有一个组合框,非常难觉察到其实是两个控件在工作。具体思路和做法如下:
先建立一文本框text1和一列表框combo1,然后调整combo1的大小,让它的高度与text1一致,宽度是刚好显示出下拉按扭,tablestop属性设为.f.,并将combo1紧挨在text1的右边,表面看起来像一个列表框。
在combo1的gotfocus过程中加入如下代码:
this.width=thisform.text1.width+18
this.left=thisform.text1.left
其中,18是combo1的原始宽度。这样做的目的是当列表框得到焦点时自动扩充,并盖住text1,这样看起来跟只有一个列表框没有什么区别。
在combo1的lostfocus过程中,加入如下代码:
thisform.text1.value=this.value
this.width=18
this.left=this.left+thisform.text1.width
在列表框里选择了内容后,列表框恢复原大小和位置,将选择的内容传给text1,并将焦点交给text1。
为了模拟在列表框中按Alt+↓可打开列表,可在text1的keypress过程中写如下代码:
LPARAMETERS nKeyCode, nShiftAltCtrl
if nkeycode=160
thisform.combo1.setfocus
endif
二、自动打开组合框的列表
实际应用中,我们往往通过Tab键让组合框得到焦点,然后按Alt+↓键打开组合框的列表。但对于不很熟悉电脑操作的人,往往又要用鼠标去打开列表。当组合框得到焦点时,如果能让其列表自动打开,就易用多了。在组合框的Style属性为2(下拉列表框时)的情况下,按空格键可打开列表,因此在其gotfocus过程中写上一句:keyboard chr(32)即可。但通过keyboard语句不能成功发送功能组合键Alt+↓,因此对Style属性为0的下拉组合框,我们就得动脑筋另寻出路了。
我们知道,用鼠标点击组合框右边的下拉按扭可打开列表,因此用mouse click命令在特定的地方模拟单击鼠标即在其gotfocus过程中键入如下代码:“mouse click at (this.top+this.height)/12-1,(this.left+this.width)/6-1”就可让组合框在得到焦点时自动打开列表。
其中,(this.top+this.height)/12-1,(this.left+this.width)/6-1是根据组合框的大小和位置算出该在什么地方单击鼠标,这个公式是在800×600的分辨率下得出的,在别的分别率下使用的公式要修正。
三、自动搜索符合条件的项目
实际应用中,由于列表项目数非常大,想找到需要的项目要花费很多时间,如果能在组合框里输入条件,然后自动滤去不符合条件的项目,那该多方便啊。这里我有一个能较简单解决问题、但不一定是最优的方案。
在VFP中,填充组合框的项可以是表中的字段,也可以是数组,也可以是手工输入的数据,我们这里讨论项是字段的情况。具体方法步骤如下:
1. 建立一个员工名单表,取名为List,里面有一个字段,名为Name,并录入记录。
2. 建立一个新表单,取名为Myform,里面建一个组合框控件,取名为Test—combo。其RowSource属性为List.name,样式Style无关重要。
3. 在对象Myform的Load过程中写如下代码:
public input—value &&定义一个全局变量
input—value=″ ″
set dele on
4. 在对象Test—combo的gotfocus过程中写如下代码:
Input—value=″ ″
this.value=″ ″
在lostfocus过程中编写如下代码:
sele list
recall all
在keypress过程中编写如下代码:
LPARAMETERS nKeyCode, nShiftAltCtrl
if nkeycode=127 &&按了退格键
if asc(right(Input—value,1))<128
&&删除的是非汉字
Input—value=left(Input—value,len(Input—value)-1)
Else &&删除的是汉字
Input—value=left(Input—value,len(Input—value)-2)
endif
else
if nkeycode〈〉160
&&按的不是Alt+↓键
input—value=input—value+chr(nkeycode)
&&保存所键入的内容
endif
endif
sele List
dele all for not alltrim(input—value)$list.name
&&删除表中不符合条件的记录
count to num &&看看剩下的记录的数目
if num=0 then
recall all
&&如果没有符合条件的记录则需重新键入
Input—value=″ ″
this.value=″ ″
endif
this.requery &&刷新组合框的项目
至此,可说大功告成了。此方法的思路是通过keypress事件捕捉键入的内容,然后根据键入的内容更新表的记录,从而实现项目的筛选。
摘自《赛迪网》 张镜明、刘春燕/文 |
404 Not Found
404 Not Found
nginx
|
|