菜单:
$PBExportHeader$m_compopup.srm
$PBExportComments$通用右键弹出菜单 common popup menu.Create by lenya on 2010/9/30
forward
global type m_compopup from menu
end type
type m_item1 from menu within m_compopup
end type
type m_item2 from menu within m_compopup
end type
type m_item3 from menu within m_compopup
end type
type m_item4 from menu within m_compopup
end type
type m_item5 from menu within m_compopup
end type
type m_item6 from menu within m_compopup
end type
type m_item7 from menu within m_compopup
end type
type m_item8 from menu within m_compopup
end type
type m_item9 from menu within m_compopup
end type
type m_item10 from menu within m_compopup
end type
type m_item11 from menu within m_compopup
end type
type m_item12 from menu within m_compopup
end type
type m_item13 from menu within m_compopup
end type
type m_item14 from menu within m_compopup
end type
type m_item15 from menu within m_compopup
end type
global type m_compopup from menu
m_item1 m_item1
m_item2 m_item2
m_item3 m_item3
m_item4 m_item4
m_item5 m_item5
m_item6 m_item6
m_item7 m_item7
m_item8 m_item8
m_item9 m_item9
m_item10 m_item10
m_item11 m_item11
m_item12 m_item12
m_item13 m_item13
m_item14 m_item14
m_item15 m_item15
end type
end forward

type items from structure
    string        sname
    string        stext
    string        sevent
end type

global type m_compopup from menu
m_item1 m_item1
m_item2 m_item2
m_item3 m_item3
m_item4 m_item4
m_item5 m_item5
m_item6 m_item6
m_item7 m_item7
m_item8 m_item8
m_item9 m_item9
m_item10 m_item10
m_item11 m_item11
m_item12 m_item12
m_item13 m_item13
m_item14 m_item14
m_item15 m_item15
end type
global m_compopup m_compopup

type variables
PRIVATE:
CONSTANT UINT ITEMCOUNT = 15 //菜单总项数目.

graphicobject igo_parent //弹出菜单所属的parentwindow


end variables

forward prototypes
public function integer setitemenabled (unsignedinteger ai_itemorder, boolean ab_enable)
public function integer setitemvisible (unsignedinteger ai_itemorder, boolean ab_visible)
public function integer setitemchecked (unsignedinteger ai_itemorder, boolean ab_checked)
public function integer initmenu (graphicobject ago_parent, string as_items)
public function integer initmenu (graphicobject ago_parent, string as_items, string as_eventnames)
end prototypes

public function integer setitemenabled (unsignedinteger ai_itemorder, boolean ab_enable);/////////////////////////////////////////////////////////////////////////
//
// Function:  public setitemenabled(unsignedinteger ai_itemorder, boolean ab_enable) returns integer
//
// Purpose:   设置菜单项Enabled.
//            
// Args:      unsignedinteger ai_itemorder 菜单序号
//            boolean ab_enable  Enabled = ab_enable
//
// Return:    成功,返回1;出错,返回-1.
//
// Log:
// 
// Create by lenya on 2010/10/6
//
///////////////////////////////////////////////////////////////////////////
if ai_itemorder > ITEMCOUNT then return -1
This.item[ai_itemorder].Enabled = ab_enable

return 1

end function

public function integer setitemvisible (unsignedinteger ai_itemorder, boolean ab_visible);/////////////////////////////////////////////////////////////////////////
//
// Function:  public setitemvisible(unsignedinteger ai_itemorder, boolean ab_visible) returns integer
//
// Purpose:   设置菜单项Enabled.
//            
// Args:      unsignedinteger ai_itemorder 菜单序号
//            boolean ab_visible  Visible = ab_visible
//
// Return:    成功,返回1;出错,返回-1.
//
// Log:
// 
// Create by lenya on 2010/10/6
//
///////////////////////////////////////////////////////////////////////////
if ai_itemorder > ITEMCOUNT then return -1
This.item[ai_itemorder].Visible = ab_visible

return 1

end function

public function integer setitemchecked (unsignedinteger ai_itemorder, boolean ab_checked);/////////////////////////////////////////////////////////////////////////
//
// Function:  public setitemchecked(unsignedinteger ai_itemorder, boolean ab_checked) returns integer
//
// Purpose:   设置菜单项Checked or UnChecked.
//            
// Args:      unsignedinteger ai_itemorder 菜单序号
//            boolean ab_checked  true 为Checked, false 为UnChecked
//
// Return:    成功,返回1;出错,返回-1.
//
// Log:
// 
// Create by lenya on 2010/10/6
//
///////////////////////////////////////////////////////////////////////////
if ai_itemorder > ITEMCOUNT then return -1
This.item[ai_itemorder].Checked = ab_checked

return 1

end function

public function integer initmenu (graphicobject ago_parent, string as_items);/////////////////////////////////////////////////////////////////////////
//
// Function:  public initmenu(graphicobject ago_parent, string as_items) returns integer
//
// Purpose:   通用右键菜单的初始化,包括显示Text,EventName,Enabled,Visible.
//            
// Args:      graphicobject ago_parent    //菜单依附的图形对象
//            string as_items  //Text{tag}|Text{tag}|Text{tag}的格式,
//                             //其中Text显示菜单文本,Tag为要触发的事件名称.
//
// Return:    成功,返回1;出错,返回-1.
//
// Log:
// 
// Create by lenya on 2010/10/6
//
///////////////////////////////////////////////////////////////////////////

if not isvalid(ago_parent) then return -1
igo_parent = ago_parent
if isnull(as_items) or len(as_items) = 0 then return -1

UINT itemnum, curitemcnt
UINT pos_start, pos_end, pos_len
string ls_items[]

n_cst_string lo_string
curitemcnt = lo_string.of_parsetoarray(as_items,"|",ls_items[])
if curitemcnt > 0 and curitemcnt <= ITEMCOUNT then
    for itemnum=1 to curitemcnt    //设置菜单显示及事件名称关联,如:"全选{ue_all}|全否{ue_nall}"
        pos_start = Pos(ls_items[itemnum], "{")
        pos_end = Pos(ls_items[itemnum], "}")
        if pos_end - pos_start > 0 then
            This.item[itemnum].Tag = Mid(ls_items[itemnum], pos_start + 1, pos_end - pos_start - 1)
            This.item[itemnum].Text = Replace(ls_items[itemnum], pos_start, pos_end - pos_start + 1, "")
        else
            This.item[itemnum].Text = ls_items[itemnum]
        end if
        This.item[itemnum].Visible = True
        This.item[itemnum].Enabled = True
    next
    for itemnum=curitemcnt+1 to ITEMCOUNT    //设置不可用项
        This.item[itemnum].Visible = FALSE
        This.item[itemnum].Enabled = FALSE
    next
else
    return -1
end if

return 1

end function

public function integer initmenu (graphicobject ago_parent, string as_items, string as_eventnames);/////////////////////////////////////////////////////////////////////////
//
// Function:  public initmenu(graphicobject ago_parent, string as_items) returns integer
//
// Purpose:   通用右键菜单的初始化,包括显示Text,EventName,Enabled,Visible.
//            
// Args:      graphicobject ago_parent    //菜单依附的图形对象
//            string as_items  //Text|Text|Text的格式,其中Text显示菜单文本
//            String as_eventnames//格式:eventname|eventname|,菜单项要触发的事件名称.
//
// Return:    成功,返回1;出错,返回-1.
//
// Log:
// 
// Create by lenya on 2010/10/6
//
///////////////////////////////////////////////////////////////////////////

if not isvalid(ago_parent) then return -1
igo_parent = ago_parent
if isnull(as_items) or len(as_items) = 0 then return -1

UINT itemnum, curitemcnt, curevencnt
string ls_items[]
String ls_eventname[]

n_cst_string lo_string
curitemcnt = lo_string.of_parsetoarray(as_items,"|",ls_items[])
curevencnt = lo_string.of_parsetoarray(as_eventnames,"|",ls_eventname[])

if curitemcnt > 0 and curitemcnt <= ITEMCOUNT then
    for itemnum=1 to curitemcnt    //设置菜单显示文本及事件名称
        This.item[itemnum].Text = ls_items[itemnum]
        if curevencnt >= itemnum then
            This.item[itemnum].Tag = ls_eventname[itemnum]
        else
            This.item[itemnum].Tag = "ue_item"+string(itemnum) //设置默认事件名称,如"ue_item1"
        end if
        This.item[itemnum].Visible = True
        This.item[itemnum].Enabled = True
    next
    for itemnum=curitemcnt+1 to ITEMCOUNT    //设置不可用项
        This.item[itemnum].Visible = FALSE
        This.item[itemnum].Enabled = FALSE
    next
else
    return -1
end if

return 1

end function

on m_compopup.create
m_compopup=this
call super::create
this.text = "m_compopup"
this.m_item1=create m_item1
this.m_item2=create m_item2
this.m_item3=create m_item3
this.m_item4=create m_item4
this.m_item5=create m_item5
this.m_item6=create m_item6
this.m_item7=create m_item7
this.m_item8=create m_item8
this.m_item9=create m_item9
this.m_item10=create m_item10
this.m_item11=create m_item11
this.m_item12=create m_item12
this.m_item13=create m_item13
this.m_item14=create m_item14
this.m_item15=create m_item15
this.Item[UpperBound(this.Item)+1]=this.m_item1
this.Item[UpperBound(this.Item)+1]=this.m_item2
this.Item[UpperBound(this.Item)+1]=this.m_item3
this.Item[UpperBound(this.Item)+1]=this.m_item4
this.Item[UpperBound(this.Item)+1]=this.m_item5
this.Item[UpperBound(this.Item)+1]=this.m_item6
this.Item[UpperBound(this.Item)+1]=this.m_item7
this.Item[UpperBound(this.Item)+1]=this.m_item8
this.Item[UpperBound(this.Item)+1]=this.m_item9
this.Item[UpperBound(this.Item)+1]=this.m_item10
this.Item[UpperBound(this.Item)+1]=this.m_item11
this.Item[UpperBound(this.Item)+1]=this.m_item12
this.Item[UpperBound(this.Item)+1]=this.m_item13
this.Item[UpperBound(this.Item)+1]=this.m_item14
this.Item[UpperBound(this.Item)+1]=this.m_item15
end on

on m_compopup.destroy
call super::destroy
destroy(this.m_item1)
destroy(this.m_item2)
destroy(this.m_item3)
destroy(this.m_item4)
destroy(this.m_item5)
destroy(this.m_item6)
destroy(this.m_item7)
destroy(this.m_item8)
destroy(this.m_item9)
destroy(this.m_item10)
destroy(this.m_item11)
destroy(this.m_item12)
destroy(this.m_item13)
destroy(this.m_item14)
destroy(this.m_item15)
end on

type m_item1 from menu within m_compopup
end type

on m_item1.create
call super::create
this.tag = "event"
this.visible = false
this.text = "item1"
end on

on m_item1.destroy
call super::destroy
end on

event clicked;igo_parent.TriggerEvent(Tag)

end event

type m_item2 from menu within m_compopup
end type

on m_item2.create
call super::create
this.tag = "event"
this.visible = false
this.text = "item2"
end on

on m_item2.destroy
call super::destroy
end on

event clicked;igo_parent.TriggerEvent(Tag)

end event

type m_item3 from menu within m_compopup
end type

on m_item3.create
call super::create
this.tag = "event"
this.visible = false
this.text = "item3"
end on

on m_item3.destroy
call super::destroy
end on

event clicked;igo_parent.TriggerEvent(Tag)

end event

type m_item4 from menu within m_compopup
end type

on m_item4.create
call super::create
this.tag = "event"
this.visible = false
this.text = "item4"
end on

on m_item4.destroy
call super::destroy
end on

event clicked;igo_parent.TriggerEvent(Tag)

end event

type m_item5 from menu within m_compopup
end type

on m_item5.create
call super::create
this.tag = "event"
this.visible = false
this.text = "item5"
end on

on m_item5.destroy
call super::destroy
end on

event clicked;igo_parent.TriggerEvent(Tag)

end event

type m_item6 from menu within m_compopup
end type

on m_item6.create
call super::create
this.tag = "event"
this.visible = false
this.text = "item6"
end on

on m_item6.destroy
call super::destroy
end on

event clicked;igo_parent.TriggerEvent(Tag)

end event

type m_item7 from menu within m_compopup
end type

on m_item7.create
call super::create
this.tag = "event"
this.visible = false
this.text = "item7"
end on

on m_item7.destroy
call super::destroy
end on

event clicked;igo_parent.TriggerEvent(Tag)

end event

type m_item8 from menu within m_compopup
end type

on m_item8.create
call super::create
this.tag = "event"
this.visible = false
this.text = "item8"
end on

on m_item8.destroy
call super::destroy
end on

event clicked;igo_parent.TriggerEvent(Tag)

end event

type m_item9 from menu within m_compopup
end type

on m_item9.create
call super::create
this.tag = "event"
this.visible = false
this.text = "item9"
end on

on m_item9.destroy
call super::destroy
end on

event clicked;igo_parent.TriggerEvent(Tag)

end event

type m_item10 from menu within m_compopup
end type

on m_item10.create
call super::create
this.tag = "event"
this.visible = false
this.text = "item10"
end on

on m_item10.destroy
call super::destroy
end on

event clicked;igo_parent.TriggerEvent(Tag)

end event

type m_item11 from menu within m_compopup
end type

on m_item11.create
call super::create
this.tag = "event"
this.visible = false
this.text = "item11"
end on

on m_item11.destroy
call super::destroy
end on

event clicked;igo_parent.TriggerEvent(Tag)

end event

type m_item12 from menu within m_compopup
end type

on m_item12.create
call super::create
this.tag = "event"
this.visible = false
this.text = "item12"
end on

on m_item12.destroy
call super::destroy
end on

event clicked;igo_parent.TriggerEvent(Tag)

end event

type m_item13 from menu within m_compopup
end type

on m_item13.create
call super::create
this.tag = "event"
this.visible = false
this.text = "item13"
end on

on m_item13.destroy
call super::destroy
end on

event clicked;igo_parent.TriggerEvent(Tag)

end event

type m_item14 from menu within m_compopup
end type

on m_item14.create
call super::create
this.tag = "event"
this.visible = false
this.text = "item14"
end on

on m_item14.destroy
call super::destroy
end on

event clicked;igo_parent.TriggerEvent(Tag)

end event

type m_item15 from menu within m_compopup
end type

on m_item15.create
call super::create
this.tag = "event"
this.visible = false
this.text = "item15"
end on

on m_item15.destroy
call super::destroy
end on

event clicked;igo_parent.TriggerEvent(tag)

end event

调用:

string ls_Band
ls_Band    = GetBandAtPointer()

if Pos(ls_Band,"detail")>0 or Pos(ls_Band,"background")>0 then //只有在"数据"区域才弹出右键
    m_compopup lm_pop
    
    if GetRow() <> Row Then SetRow(row) 
    if GetColumn() <> GetClickedColumn() Then SetColumn(GetClickedColumn())

    lm_pop = Create m_compopup
    if 1 = lm_pop.initmenu(This,"复制(&C)|-|查看所有记录|-|撤销(&U)", + &
                                    "ue_copy|-|ue_ret_bigmk|-|ue_cancel") then
        lm_pop.setitemenabled(1,Len(This.SelectedText())>0)//设置"复制"Enabled属性.
        lm_pop.setitemenabled(5,m_third.m_handle.m_unto.Enabled)//设置"撤销"Enabled属性.
    
        lm_pop.PopMenu(w_main.pointerx(),w_main.pointerY())
    end if
    destroy lm_pop
end if