Database 版 (精华区)

发信人: mengy (LEAR DLLS 命令时,将从内存中清除), 信区: Database
标  题: 为FoxPro中的弹出式菜单增加自学习功能
发信站: 哈工大紫丁香 (2000年12月30日19:48:27 星期六), 站内信件


您在浏览的同时,帮忙点击一下广告吧,谢谢您了!

 
 
为FoxPro中的弹出式菜单增加自学习功能

中国人民银行安徽省分行(230022) 杨晓峰 


  开发过应用系统的人都知道,使用FoxPro for Win-dows在用屏幕生成器进行数据
窗口设 计的过程中,经常要使用弹出式菜单(POPUP)来设计进行数据输入的数据入
口。弹出式菜单平 常在屏幕上只会显示一个选项的内容,当您用鼠标选择它或按下
空白键、ENTER键时,它就在 屏幕上出现一个窗口和一些供用户选择的选项。使用
弹出式菜单有两个方面的优点:一个优 点是用户可以不在该数据入口中输入数据,
而只需在该弹出项提供的有效选项中选择一项即可;使用弹出式菜单的另一个优点
是它能保证数据输入的有效性,由于用户只限于从菜单弹出 的选项中选择数据,所
以不会产生输入错误。但是,我们在开发软件的过程中发现弹出式菜单 存在一个缺
点:就是当弹出式菜单所弹出的选项不包括用户所要输入的数据时,则系统无法让 
用户输入正确的数据。本文所叙述的方法(以FoxPro 2.5 for Windows为例),就是
为了改进 弹出式菜单的
这一缺点,为弹出式菜单增加让用户输入数据的功能,并能够将用户输入的数据自动
添加到弹出式菜单的选项中(即我们所说的自学习功能),以便用户以后输入数据时
选择 使用。 

实现效果 

我们可以在数据窗口中将一个数据入口定义为弹出式菜单(POPUP),并在该弹出式菜
单的 相同位置上定义一个输入字段(INPUT FIELD),该字段与弹出式菜单大小相同
,其初始状态为 Initially Disable Field,被弹出式菜单完全覆盖。当第一次使用
该弹出式菜单时,其弹出 的选项中只出现"其它"一项。如果用户输入数据时发现菜
单弹出的选项中不包括所要输入的 数据,则可以选"其它"项。这时数据窗口中在弹
出式菜单的位置上将出现一个输入字段,并且该输入字段可以把弹出式菜单完全覆
盖,用户就可以在这个输入字段上输入新的数据,输入完 毕后该输入字段将又被弹
出式菜单覆盖,屏幕上弹出式菜单显示为刚输入的内容。用户每次 在这个输入字段
中输入的新数据(必须是原弹出式菜单的选项中没有的)都将作为一个新的选 项加
入到弹出式菜单的选项中,而选项中的"其它"项将始终是选项的最后一项。 

实现方法 

我们假设是为数据库ab.dbf定义一个数据窗口ab.scx,数据库ab.dbf中有一个字符
型字 段aa,数据窗口ab.scx中将与aa字段相对应的数据入口变量m.aa定义为弹出式
菜单(POPUP), 其Array Popup的名为aalist。另为该弹出式菜单定义一个相对应的
输入字段(INPUT FIELD ),其字段名为m.newaa。 

(一)定义数据窗口ab.scx,选择Screen/Layout后进入Screen Code,在
Screen Setup Co de中输入以下程序段: 

&& 该程序段的功能是初始化和生成数组aalist 
PRIVATE m.popupedit, m.savrec, m.aacnt 
m.popupedit = .F. 
m.aacnt = 0 
DIMENSION aalist[1] 
m.savrec = RECNO() 
GO TOP 
SCAN FOR NOT DELETED() 
m.string = ALLTRIM(aa)&& 取字段内容 
IF NOT EMPTY(m.string) AND ASCAN(aalist 
m.string) = 0 
&& 确认数组aalist中是否不包括该字段内容 
m.aacnt = m.aacnt + 1 
IF m.aacnt > ALEN(aalist) 
DIMENSION aalist[m.aacnt] 
ENDIF 
aalist[m.aacnt] = m.string && 把该字段内容加入 
到数组aalist中 
ENDIF 
ENDSCAN 
DIMENSION aalist[m.aacnt] 
= ASORT(aalist) && 为数组aalist排序 
m.aacnt = m.aacnt + 1 
DIMENSION aalist[m.aacnt] 
aalist [m.aacnt] = "其它"&& 把"其它"项加入到数组aalist的最后一项 
GOTO RECORD m.savrec 
SCATTER MEMVAR MEMO BLANK 
(二)在数据窗口ab.scx中定义一个弹出式菜单,进入Popup对话框,把该对话框
的Variab le栏定义为m.aa,Option栏中选Array Popup,并在该栏输入数组名
aalist。Clause栏中选Va lid项,输入以下程序段: 

&& 该程序段的功能是当在弹出式菜单中选择"其它"时,激活输入字段m.newaa 
IF m.aa = "其它" 
m.popupedit = .T. 
SHOW GET m.newaa ENABLE 
_CUROBJ = OBJNUM(m.newaa) 
ENDIF 

(三)在数据窗口ab.scx中与弹出式菜单相同的位置上定义一个输入字段(INPUT 
FIELD) ,并调整该字段的大小使其可以把弹出式菜单完全覆盖。进入Field对话框
后,在Field栏选I nput Field (Get)项,Options栏选In-itially Disable Field和
Select Field on Entry两 项,Input栏输入m.newaa。Clause栏中选Valid项,然后
输入以下程序段: 

IF EMPTY(m.newaa) OR ASCAN(aalist, m.newaa)<>0 
RETURN .T. 
ENDIF &&m.newaa为空或已存在于aalist中,则返回 
= AINS(aalist,m.aacnt) 
aalist[m.aacnt] = ALLTRIM(m.newaa)&&在aalist中插入新元素,其内容为m.newaa
 
= ASORT(aalist)&& 为数组aalist排序 
m.aacnt = m.aacnt+1 
DIMENSION aalist[m.aacnt] 
aalist[m.aacnt] = "其它"&& "其它" 项追加到数组aalist的最后 
REPLACE aa WITH ALLTRIM(m.newaa) && 修改数据库中的字段 
m.newaa = "" 
m.popupedit = .F. 
SHOW GET m.newaa DISABLE 
SHOW GET m.aa 

(四)在数据窗口ab.scx中,选择Screen/Object Order进入Object Order屏幕。在这
个屏 幕中调整弹出式菜单m.aa与输入字段m.newaa的排列顺序,使得m.aa排列在m.
newaa的前面,屏 幕显示时m.aa就可以将m.newaa覆盖。这样,在输入过程中先输入
m.aa,当用户在m.aa中选择 "其它"项时,输入字段m.newaa才显示出来让用户输入新
的数据。 

(五)在定义输入字段m.newaa的过程中,应在其Clause栏Valid项的程序段中,适当加
入一 些有关数据有效性校验的命令,以保证输入数据正确、有效。 
 
返回首页
 


 

--

       大海无边天做岸
               山登绝顶我为风

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.227.121]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.633毫秒