动态下拉式按钮组菜单在VFP中的应用
2014-10-21何文辉
何文辉
摘 要:采用面向对象的设计思想开发动态下拉式按钮组菜单(以下简称动态菜单),规划完善动态菜单的各项功能及其在信息管理系统中的应用。
关键词:VFP;面向对象;动态下拉式按钮组菜单;数据库;信息管理系统
使用传统菜单必须要一层一层地点击,才能执行一个表单,有时容易点错,为用户带来不便,并且界面也不美观。而采用传统菜单结合动态菜单的设计,不仅使用户操作便捷,而且界面更加友好、更加专业化,并且动态菜单完全实现了用户自定义菜单功能,大大降低了应用程序的修改维护,满足各种用户需求。
一、动态菜单的功能介绍
1.动态菜单布局:第一级菜单作为动态菜单的第一层,第二级菜单作为动态菜单的第二级,本例只用了两级,可以根据需要拓展到多级,并且一般情况下,级数不要多于2层,否则影响使用效果。其用法是,当点击第一层菜单,如“查询统计”,系统将下拉展开“查询统计”的二级菜单。再次点击其他的第一层菜单时,如“日常管理”时,只展开“日常管理”的二级菜单。其他一级菜单关闭。
2.动态菜单将根据用户ID和用户自定义的菜单项,自动生成动态菜单。不同的用户可根据自己的实际需要,由系统管理员分配菜单项及规定各级菜单的文本和图标等。
二、设计思想
1.按照其功能,可以把每个一级菜单看作一个树型节点,并且其行为也与树型控件很相似,当展开一级菜单中的一个时,其他一级菜单自动关闭,也可全部展开等。当要实现其动态设定菜单项时,也需要将每个一级菜单作为一个节点类来处理
2.设计时,可以将动态菜单分为三个部分来进行。第一部分是设计子节点,子节点的功能是实现执行命令或过程等。第二部分是设计带有子节点的父节点,父节点的功能是子节点的容器,实现二级菜单的动态填充及展开、关闭二级菜单。第三部分是設计动态菜单的主体,主体是父节点的容器,实现一级菜单的动态数据填充及管理一级菜单。
三、关键步骤、技术与核心代码
1.设计子节点类。代码如下:
DEFINE CLASS tb_cbnode as Commandbutton
Alignment=0
Height=25
Pictureposition =1
Width=124
runcmd=“”&&增加的新属性
PROCEDURE Click
LOCAL ls_runcmd
ls_runcmd =This.runcmd
&ls_runcmd &&执行增加的新属性runcmd宏
ENDPROC
ENDDEFINE
2.设计父节点类。
(1)增加新属性。
DEFINE CLASS tb_node as Container &&定义父节点
ENDDEFINE &&这条语句放在整个类定义之后
c_height =0 &&展开时容器的高度
c_maxheight =200 &&容器的最大高度,即容器显示的子节点最多数量,当c_height
&&大于c_maxheight时,容器将显示上、下滚动箭头。
itemcnt =0 &&包含的子节点数
preheight =25 &&单位高度,即点击上、下滚动箭头时子节点移动的单位
caption =0
(2)增加两个对象。
增加一个命令按钮,用来显示父节点的标题及展开、关闭父节点等功能,然后增加一个容器,用以放置子节点。代码如下:
ADD OBJECT node_cb AS CommandButton
PROCEDURE node_cb.Click
This.Parent .Parent.LockScreen =.t. &&防止刷屏
This.Parent.Parent.collapseall&&调用父节点所在容器的collapseall方法
This.Parent.expand &&调用父节点展开方法
This.Parent .Parent.LockScreen =.f.
ENDPROC
ADD OBJECT node_c AS Container &&用来包含子节点的容器
(3)增加几个方法。
增加collapse、expand、downclick、upclick、setp及ynhidecb方法,其含义分别是节点收缩、节点展开、点击向下滚动箭头、点击向上滚动箭头、运行宏及隐藏显示命令按钮。下面仅介绍关键代码
PROCEDURE expand
LOCAL li_height
IF This.c_maxheight>=This.c_height
li_height=This.c_height
ELSE
li_height=This.c_maxheight
ENDIF
This.node_c .Height =li_height
This.Height=This.node_cb.Height +This.node_c.Height
ENDPROC
3.设计动态菜单的主体。
设计用户自定义菜单录入表。根据需要,分别设计了两个表,一个menu_sub用于保存一级菜单项目,另一个menu_item用于保存二级菜单项目,两个表为一对多关系,menu_sub为主表,menu_item为从表。
总之,这个动态菜单是由三部分组成,分别为子节点、父节点和动态菜单本身,它们的关系均为前一个对象是后一个类的子对象。并且动态菜单的行为方式与树型控件的行为方式很相似,因此在设计此类时自然会产生分别设计三个类的想法。并且为了使其子节点能动态关联执行命令或过程,这里采用了宏,使得在类内的子对象可以执行外部函数。
参考文献:
张洪举.Visual FoxPro 6.0~9.0解决方案与范例大全.人民邮电出版社,2006.
编辑 温雪莲