![]() ![]() |
|
为FoxPro中的弹出式菜单增加自学习功能 | |
作者:佚名 文章来源:不详 点击数 更新时间:2008/4/18 14:51:41 文章录入:杜斌 责任编辑:杜斌 | |
|
|
实现效果 我们可以在数据窗口中将一个数据入口定义为弹出式菜单(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项的程序段中,适当加入一 些有关数据有效性校验的命令,以保证输入数据正确、有效。 |
|
![]() ![]() |