用PB做乙個通用右鍵選單

2022-02-07 21:32:36 字數 3508 閱讀 4610

物件被右鍵單擊就彈出乙個功能選單是windows應用程式一項不可缺少的功能。在powerbuilder

應用開發中,可在需彈出右鍵選單物件的rbuttondown事件中呼叫該選單的popmenu( )方法實現這一

功能。但多數情況下,應用中有多處要用到不同的彈出式選單,如一一用這種方法就需要做大量的工

作。能不能做乙個通用的選單,可以用任何物件的rbuttondown事件激發彈出,並在彈出前動態改變

彈出選單項的內容,當點選選單項時又可執行被右擊物件的相應使用者事件?由於這一技術最大的特點

是當函式建立成功後,可在任何應用的任何物件中隨心所欲的使用,隨時隨地彈出自己想要顯示的菜

單項,並執行相應的自己需要的功能指令碼,但目前各種資料上鮮有系統、成型的介紹。筆者抱著一種

探索的態度,作了一番仔細深入的研究,並小有收穫,願和大家共同**。

一、 建立彈出選單m_popup

建立乙個選單m_popup,定義選單條m_main,其下有十五個選單項,分別命名為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_item1的clicked事件

anyobject.triggerevent("ue_item2")

… …anyobject.triggerevent("ue_item15")

---- 4、定義幾個選單函式:

---- 1) setmenuitem(string itemstring),返回值為null。

---- 引數itemstring是由多個子串組成的。各個子串間用「|」間隔,每個子串為乙個選單項的顯示文字(text)。

---- 該函式功能是把itemstring分解為多個子串,並把子串賦給相應選單項的text。指令碼如下:

int itempos,itemorder=1,i string currentitem

if len(itemstring)=0 then return itempos=pos(itemstring,"|") do while itempos<>0

// itempos為間隔符"|"的位置

currentitem=left(itemstring,itempos

-1) //取出子串

itemstring=mid(itemstring, itempos+1)

this.m_main.item[itemorder].text=currentitem

itempos=pos(itemstring,"|")

itemorder++

loop

this.m_main.item[itemorder].text=itemstring

for i=1 to itemorder

this.m_main.item[i].visible=true

this.m_main.item[i].enabled=true

end if

for i=itemorder+1 to 15

this.m_main.item[i].visible=false

next

2)setitemdisable(integer itemorder) 返回值null。 該函式把第itemorder選單項置灰(disable)。 指令碼如下:

if itemorder<1 or itemorder>15

then

return this.m_main.item[itemorder].enabled=false

3)popupmenu(integer x, integer y) 返回值null。 該函式彈出選單條m_main。 指令碼如下: this.m_main.popmenu(x,y)

二、 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_1的rbuttondown事件指令碼:

if not isvalid(om_1)

then om_1= create m_popup

end if //把選單的anyobject指向被右擊的物件(dw_1) om_1.anyobject=this

om_1.setmenuitem("重新整理|插入|刪除|修改") //可在此呼叫om_1.setitemdisable(itemorder)函式

disable某 選單項。

om_1.popupmenu(this.x+this.pointerx(), this.y+this.pointery())

3、 給dw_1定義使用者事件ue_item1、ue_item2、ue_item3 及 ue_item

4。 事件ue_item1指令碼:

dw_1.retrieve()

事件ue_item2指令碼:

long newrow newrow=dw_1.insertrow(0)

dw_1.scrolltorow(newrow)

事件ue_item3指令碼:

dw_1.deleterow(0)

事件ue_item4指令碼:

dw_1.update()

---- 這樣,只要使用者單擊dw_1彈出的右鍵選單,就可完成對dw_1的插入、刪除、修改等功能。

三、 推廣為全程函式

---- 如果應用中有許多地方要用此功能,我們可以把dw_1的rbuttondown事件指令碼改造成乙個全程函式。

---- 1、將變數om_1定義為global變數: ---- m_popup om_1

---- 2、定義乙個全程函式 ---- pupmenu(powerobject sender,string itemstring,integer x,integer y)

返回值null。其中引數sender為被右擊的物件,itemstring為彈出選單的選單項字串,x、y為選單彈

出的座標位置。 指令碼如下:

if not isvalid(om_1)

then om_1= create m_popup

end if

om_1.anyobject=sender

用rhino做乙個地球

利用全球的地形圖,根據灰度生成高度不一的柱體 將球的uv展開 柱體鋪滿uv,使用曲面流動到球上 準備一張地形圖,這裡隨便找了乙個全球地形圖,有灰度區分高度的最好,顏色的區分的相對的高程不夠真實。開啟rhino,繪製乙個球,將球的uv展開。根據uv的大小繪製乙個面,用於在grasshopper中拾取作...

用html做乙個目錄 用555做乙個高壓發生器

用555做乙個高壓發生器。如圖,ne555為脈衝發生晶元 以此晶元外圍電路為準,頻率約1.7khz,占空比 10 q2為n溝道場效電晶體,q1為npn三極體,t1為高壓線圈。如圖所示 晶元為ne555,為脈衝發生晶元,脈衝頻率由c1 r1和r2來調整。開關管q2為n溝道場效電晶體。r3為場效電晶體的...

用C 做乙個懸浮視窗

用c 做乙個懸浮視窗 含三種移動無標題窗體的辦法 2006年08月24日 星期四 16 36 今天看幾個c 原始碼,再到愚翁專欄 第一步 建立乙個窗體,設定其屬性 this.formborderstyle system.windows.forms.formborderstyle.none this....