分类: IT综合技术
菜单项有一个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!)
完。