程序里,建一工具栏,工具栏的名称与菜单里名称保持一致,如:有一菜单m_21,名称:保存,工具栏也有这一按钮,名称为:保存,现在想单击工具栏时执行m_21_click事件,当然可以通过在工具栏单击事件里写:m_21_click,但这样有很多工具栏按钮,那我不要重复写很多相同代码,我是这样做的:Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
   Dim ctl  As Control
   For Each ctl In fmain.Controls
       If TypeOf ctl Is Menu And Len(ctl.Name) > 3 and ctl.Caption = Button.ToolTipText Then ctl.click
   Next
End Sub这样是不行的,只是个思路,回为ctl没有click事件.
简言之:就是单击工具栏,就执行与该工具栏按键有相同名称的菜单事件。在线求解,先谢谢了!

解决方案 »

  1.   

    1.select case ctl.Name2. callbyname
      

  2.   

    我就是不想写select  case,因为之样写的话要二十几个case,太不爽了,有没什么好的捷径撒
      

  3.   

    在你原有的代码之上再加一个判断语句IF,,,,判断是否是CTL然后再执行你要执行的不就OK了,,
      

  4.   

    怎么执行?菜单事件是:m_21_click,ctl得到的是m_21,不会是:ctl & "_click" 吧?
      

  5.   

    可以使用CallByName函数根据菜单名称调用Click方法,不过你必须将Menu的Click方法声明为公有的:
    窗体上一个toolbar,4个按纽,其caption分别为save、new、open、close
    菜单:
    menuedit下有四个子菜单,其caption和按纽的caption相对应,其名称分别为menusave、menunew、menuopen、menuclose  
    代码:
    Option ExplicitPublic Sub menuclose_Click()
        MsgBox "close"
    End Sub
    Public Sub menunew_Click()
        MsgBox "new"
    End SubPublic Sub menuopen_Click()
        MsgBox "open"
    End SubPublic Sub menusave_Click()
        MsgBox "save"
    End SubPrivate Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
        Dim s As String
        s = Button.Caption
        CallByName Form1, "menu" + s + "_Click", VbMethod
    End Sub
      
      

  6.   

    不过,建议你使用select  case的方式,就是代码多一些罢了,但是性能上要比callbyname提高不少
      

  7.   

    但这样有很多工具栏按钮,那我不要重复写很多相同代码????
    但是每个button 的index不一样啊,Select Case Button.Index
       
       case  1
          m_21_click
       case 
           ……
    end select
      

  8.   

    谢谢: rainstormmaster(暴风雨 v2.0),照你上面说的,问题已解决,还是使用的CallByName方法,关键是人懒,想尽量少写代码,哪怕是CTRL+C/V,还有就是现在的机子性能很好,不用担心它的效率了,再次感谢,结贴了。