PB中实现菜单的动态生成(函数递归实现)

            PB中实现菜单的动态生成(函数递归实现) 2005-06-27 13:29:57

分类: IT综合技术

前段时间看到一篇关于PB中动态生成菜单的文章,觉得不错。但认为仍有缺陷,尤其对菜单项的层数,位置等不能实现动态指定。所以我将其加以改进,用函数的递归来实现菜单的动态生成。[@more@]

菜单项有一个ITEM属性,我们可利用该属性来实现菜单项的动态生成。

(一)基本工作

创建一个WINDOW窗口和二个MENU菜单,其中一个菜单命名为m_main,用作窗口的基本主菜单,新增菜单将在其上添加,该菜单初始可以包含一些基本菜单,如:文件、添加、删除、保存、退出等;另外一个菜单命名为m_new,该菜单只有主菜单一个ITEM,其下没有进一步的子菜单,因此该菜单其实就是一个菜单ITEM。

声明全局变量(GLOBAL VARIABLES):

menu gm_new[] //声明一菜单数组用于引用新增菜单

integer gi_cnt //声明一变量记录总共新增菜单个数

(二)主要函数

/************************************************************************/
//函数名:f_createmenu
//-------------------------------------------------------------------------
//功能:动态生成菜单
//-------------------------------------------------------------------------
//参数:
// ai_lev 菜单项所位于层数
// as_fnam 上层菜单编号
// as_nam 菜单编号
// as_txt 菜单名称
// as_bool 菜单enabled属性
// am_menu 窗口菜单
// ab_bo boolean变量,确定菜单是否找到其父菜单
//-------------------------------------------------------------------------
//返回值:integer
// 1 成功 0 失败
/************************************************************************/

//====================================================
//变量声明
//====================================================

menu lm_menu /*声明菜单变量用于菜单层次的分解*/
integer li_num, /*用于记录当前层下菜单项数量*/&
li_cnt /*计数器*/


//判断要插入菜单项是否以找到正确位置,如是,则插入

if ai_lev =1 and ab_bo=true then

//新创建一个菜单对象,并将其放到菜单数组im_new[]当中
gi_cnt++
gm_new[gi_cnt]=create m_new

//此处对新创建的菜单对象获取引用
li_num=upperbound(am_menu.item[])
am_menu.item[li_num + 1] = gm_new[gi_cnt]

//设置菜单相关属性
am_menu.item[li_num + 1].text = as_txt
am_menu.item[li_num + 1].tag = as_nam
am_menu.item[li_num + 1].mergeoption=exclude!
am_menu.item[li_num + 1].menuitemtype=menuitemtypenormal!

//根据as_bool值来设定该菜单项的可用性
if as_bool='Y' then
am_menu.item[li_num + 1].enabled=true
else
am_menu.item[li_num + 1].enabled=false
end if

else
//判断ai_lev的值,当其为1时,表示菜单项已位于正确的层,否则,将菜单继续向下分解
if ai_lev >1 then

ai_lev=ai_lev -1

//将ab_bo设置为假,表示未找到菜单的正确插入位置
ab_bo=false

li_num=upperbound(am_menu.item[])

//再次判断ai_lev的值,如其为1,表示已找到其上层菜单
if ai_lev=1 then

//搜寻其父菜单,如找到,将ab_bo设为TRUE退出循环。
for li_cnt=1 to li_num
if as_fnam=am_menu.item[li_cnt].tag then
lm_menu=am_menu.item[li_cnt]
ab_bo=true
exit
end if
next

//找到父菜单后,再次调用f_createmenu函数
if ab_bo=true then
f_createmenu(ai_lev,as_fnam,as_nam,as_txt,as_bool,lm_menu,ab_bo)
end if

else

//该循环语句用于逐层剥解菜单,直到找到菜单项的正确插入位置
for li_cnt=1 to li_num
lm_menu=am_menu.item[li_cnt]
f_createmenu(ai_lev,as_fnam,as_nam,as_txt,as_bool,lm_menu,ab_bo)
next
end if
end if
end if

//显示新生成的菜单对象
m_menu.item[1].hide()
m_menu.item[1].show()

(三)函数调用

可在窗口打开时调用该函数,生成菜单。

菜单的相关信息可放入数据库中,并可将其设置成数据窗口,这样,用户便可根据自己的需要,对菜单进行编辑了。

(四)定义菜单CLICKED 事件

定义一MENU对象 m_new

定义其clicked事件:

string ls_win

//定义窗口变量
window lw_win

//下面代码是避免点击含有下一级子菜单的菜单时会弹出对话框,导致无法显示下一级菜单的情况
if upperbound(this.item[])>0 then
return
end if

ls_win=this.tag

//根据菜单TAG值,打开相应窗口。
opensheet(lw_win,ls_win,w_mdi,1,original!)

完。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值