用PB做一个通用右键菜单

西安海星系统集成中心 田俊国

---- 对象被右键单击就弹出个功能菜单是Windows应用项不可缺少功能在PowerBuilder应用开发中可在需弹出右键菜单对象rbuttondown事件中该菜单Popmenu( )思路方法实现这功能但多数情况下应用中有多处要用到区别弹出式菜单用这种思路方法就需要做大量工作能不能做个通用菜单可以用任何对象rbuttondown事件激发弹出并在弹出前动态改变弹出菜单项内容当点击菜单项时又可执行被右击对象相应用户事件?由于这技术最大特点是当创建成功后可在任何应用任何对象中随心所欲使用随时随地弹出自己想要显示菜单项并执行相应自己需要功能脚本但目前各种资料上鲜有系统、成型介绍笔者抱着种探索态度作了番仔细深入研究并小有收获愿和大家共同探讨

、 创建弹出菜单m_popup

创建个菜单m_popup,定义菜单条m_其下有十 5个菜单项分别命名为m_item1,m_item2,……m_item15,各项显示文本(text)分别为item1,item2,… …item15;

为m_popup菜单定义个Powerobject类型Instance变量:Anyobject
脚本为:
Powerobject Anyobject

给m_item1,m_item2,… …m_item15各菜单项Clicked事件下分别输入脚本:
Anyobject.triggerevent("ue_item1")
//m_item1clicked事件
Anyobject.triggerevent("ue_item2")
… …
Anyobject.triggerevent("ue_item15")

---- 4、 定义几个菜单:
---- 1) menuitem( item),返回值为Null

---- 参数Item是由多个子串组成各个子串间用“|”间隔每个子串为个菜单项显示文本(text)

---- 该功能是把item分解为多个子串并把子串赋给相应菜单项text脚本如下:

itempos,itemorder=1,i
currentitem
len(item)=0 then
itempos=pos(item,"|")
DO WHILE itempos<>0        
// itempos为间隔符"|"位置
currentitem=left(item,itempos -1)
       //取出子串
item=mid(item, itempos+1)
this.m_.item[itemorder].text=currentitem
itempos=pos(item,"|")
itemorder
LOOP
   this.m_.item[itemorder].text=item
for i=1 to itemorder
this.m_.item[i].visible=true
this.m_.item[i].enabled=true
end
for i=itemorder+1 to 15
this.m_.item[i].visible=false
next

2)itemdisable(eger itemorder) 返回值Null
把第itemorder菜单项置灰(disable)
脚本如下:

itemorder<1 or itemorder>15 then
this.m_.item[itemorder].enabled=false
3)popupmenu(eger x, eger y) 返回值Null
弹出菜单条m_
脚本如下:

this.m_.popmenu(x,y)

2、 rbuttondown事件激发弹出菜单m_popup
---- 至此我们就可以在窗口中任意对象如DataWindow、 Picture、 SingleLineEdit、 ListBox、 PictureListBox、 DropDownPictureListBox、 MultiLineEdit、 ListView、 TreeView等rbuttondown事件中写脚本m_popup来实现右键单击弹出个菜单下面以数据窗口dw_1为例在其rbuttondown事件下写入脚本使得右击dw_1 可弹出菜单:刷新/插入/删除/修改步骤如下:

1、事先给窗口定义个m_popup 型instance变量om_1:
       m_popup om_1

2、dw_1rbuttondown事件脚本:
    
         not isvalid(om_1) then
       om_1= CREATE m_popup
        end
        //把菜单anyobject指向被右击对象(dw_1)
om_1.anyobject=this
        om_1.menuitem("刷新|插入|删除|修改")
//可在此om_1.itemdisable(itemorder)disable某
   菜单项
om_1.popupmenu(this.x+this.poerx,
    this.y+this.poery)

3、 给dw_1定义用户事件ue_item1、ue_item2、ue_item3
    及 ue_item4
事件ue_item1脚本:
         dw_1.retrieve
事件ue_item2脚本:
long row
row=dw_1.insertrow(0)
dw_1.scrolltorow(row)
事件ue_item3脚本:
dw_1.deleterow(0)
事件ue_item4脚本:
dw_1.update

---- 这样只要用户单击dw_1弹出右键菜单就可完成对dw_1插入、删除、修改等功能
3、 推广为全程

---- 如果应用中有许多地方要用此功能我们可以把dw_1rbuttondown事件脚本改造成个全程

---- 1、将变量om_1定义为global变量:
---- m_popup om_1

---- 2、定义个全程
---- pupmenu(powerobject sender, item,eger x,eger y) 返回值Null其中参数sender为被右击对象item为弹出菜单菜单项x、y为菜单弹出坐标位置

脚本如下:

not isvalid(om_1) then
om_1= CREATE m_popup
end
   om_1.anyobject=sender
   om_1.menuitem(item)
   sender.triggerevent("ue_beforepop")
   //激活sender用户事件
 om_1.popupmenu(x,y)
     这样上述dw_1rbuttondown事件脚本就可改写为:

      items="刷新|插入|删除|修改"
     popmenu(this, items ,this.x+this.poerx,
     this.y+this.poery)
注意:在MDI 应用中popmenu需要改为:
popmenu(this, items ,w_frame.poerx,w_frame.poery)
其中w_frame为MDI主窗口名

---- 在popmenu中,又激活了被右击对象ue_beforepop用户事件如有必要你可以给被右击对象定义个ue_beforepop事件在该事件中可om_1.itemdisable来屏蔽某个菜单项
---- 最后别忘了在应用close事件里加上下列语句及时释放系统内存
---- isvalid(om_1) then destroy om_1

---- 以上代码在Windows98 和Powerbuilder6.5平台上开发并在多个大型系统中应用效果很好 
Tags: 

延伸阅读

最新评论

发表评论