用browse实现菜单功能的方法
用browse实现菜单功能的方法
dbase或fox,特别是fox的菜单功能很强,但使用起来并不简单。所以在我之前的博文《dbaseIII或foxplus的简化的弹出菜单实现方式》中介绍了借助外部力量实现弹出菜单的功能,简单的目的是达到了,但:一是只能在dos或win31的msdos方式或者dosbox中运行;二是菜单有效的功能项数不能超过22项,对于更多项数功能的要求就有些捉襟见肘了。
早在1998年,当时在用foxpro25写一个用断面法或等高线法计算土石方工程量的程序,就遇到选择项数(如一级的“工程项目”数、二级的“断面”数)很多的情况,怎么解决呢?就是利用browse。
在dbaseIV中,browse的命令可以是:
browse freeze <> [field<>] nomenu noappend noedit nodelete noclear
在foxplus中,browse命令是:
browse freeze <> [field<>] nomenu noappend nomodify nodelete
两者之间有些差别,但不大,可以实现相同的功能。
我的做法是,在建立工程或断面时的browse菜单(这里姑且叫做“菜单”)是开放式的,可以增加、编辑、删除“工程项目”或“断面”;在“工程项目”信息确定后,要选择一个“工程项目”进行下一步操作时,这时的“工程项目”browse选单 (即菜单)除了“选中”这个逻辑字段外,其他都是不能修改的,即用“browse freeze 选中nomenu noappend nodelete”实现,当时设计时,“选中”字段既可以键盘操作修改逻辑值,也可用鼠标单击改变(在foxpro中)。
为简化起见,下面给出一个小例子:数据表名称为 menumain.dbf,其中有两个字段,分别为choose、menu_item,前者为逻辑型,后者为字符型,长度为8,menu_item字段的内容分别为:录入、编辑、查询、打印、帮助、退出,共6条记录。相应的菜单演示程序为:
clear
on escape
on error
set echo off
set talk off
set bell off
do while .t.
sele 1
use menumain
defi window main from 5,25 to 15,55
brow free choose noap node nome field choose,menu_item/20/r wind main
go top
loca all for choose
job=menu_item
repl all choose with .f.
if trim(job)=[退出]
exit
else
@ 20,38 say job
* do &job..prg
endif
enddo
sele 1
use
retu
(程序中直接假定用第2个字段值作为子程序名,程序在dbaseIV2.0中文版中调试通过)
可以看出,这个小例子演示的菜单的实现很简单。
还可以更简单吗?答案时肯定的。上面的方法设置了一个逻辑字段来判断用户的选择(准确地说,是最先的选项有效)。其实可以直接用当前记录号来确定用户的选择,因为在dbase或fox中,无论是browse,还是edit、change命令,当结束这些命令,关闭相关的屏幕时,记录号是不变的。由记录号得到用户的选择,就知道程序的下一步该做什么了 !
也就是说,在browse命令运行时,按几下上、下键,按Esc或Ctrl+W或Ctrl+Q,用户的选择就确定了......