明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1549|回复: 3

求高手纠正宏工程里面的创建菜单的自定义函数

[复制链接]
发表于 2014-1-14 13:16 | 显示全部楼层 |阅读模式
20明经币
本帖最后由 清风明月名字 于 2014-1-14 13:20 编辑


上面宏工程的代码,我的总体设想是,我每次打开一个窗体,它就会帮我创建一个按钮,这样就避免了我再去查找启动这个窗体的宏了,运行菜单就行了。所以按钮只能运行一次创建一个。
我写了一套代码,是创建多级菜单的。
我碰到的问题是:
如果初次创建,三级菜单都会被成功创建。第二次运行的时候要在上次创建的菜单中添加按钮,则失败了。我跟踪代码发现,“菜单二”就无法获得对象,也就无法创建第二个按钮。

希望有高手能帮我解决,纠正里面的创建菜单的自定义函数。
下面是宏工程中的自定义函数之一:


Function 创建三级菜单按钮(一级菜单名, 二级菜单名, 三级菜单名, VBA或LSP, 按钮标题, 命令)
        On Error Resume Next
        Dim macro As String
        macro = Chr(vbKeyEscape) + Chr(vbKeyEscape) '这是在向命令行发送命令时需要的前缀。

        Dim currMenuGroup As AcadMenuGroup
        Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0)

        '下面是创建菜单“工”
        Dim 菜单一 As AcadPopupMenu
        Set 菜单一 = currMenuGroup.Menus.Add(一级菜单名 & Chr(Asc("&"))) '这是说在没有时创建菜单“小多”
        Set 菜单一 = currMenuGroup.Menus(一级菜单名 & Chr(Asc("&"))) '这是说在已有菜单“小多”时就让它赋给变量“newMenu”

        Dim 菜单二 As AcadPopupMenu
        Set 菜单二 = 菜单一.AddSubMenu(菜单一.Count + 1, 二级菜单名 & Chr(Asc("&")))
        Set 菜单二 = 菜单一.Item(二级菜单名 & Chr(Asc("&")))

        Dim 菜单三 As AcadPopupMenu
        Set 菜单三 = 菜单二.AddSubMenu(菜单二.Count + 1, 三级菜单名 & Chr(Asc("&")))
        Set 菜单三 = 菜单二.Items(三级菜单名 & Chr(Asc("&")))

        Dim subMenuItemPoint As AcadPopupMenuItem
        Set subMenuItemPoint = 菜单三.Item(按钮标题)
        subMenuItemPoint.Delete '是如果存在以程序文件简单名为名的按钮,则删除它,再创建,以免同名而内容不同的错误

        If VBA或LSP = "LSP" Then
            '创建程序文件简单名为名的按钮,单击按钮时发出"-VBARUN XIANSHISHIYIANDAIMAYONGCHUANGTI "命令
            Set subMenuItemPoint = 菜单三.AddMenuItem(菜单三.Count + 1, Chr(Asc("&")) & 按钮标题, macro & 命令 & " ")
        Else
             Set subMenuItemPoint = 菜单三.AddMenuItem(菜单三.Count + 1, Chr(Asc("&")) & 按钮标题, macro & "-VBARUN " & 命令 & " ")
        End If

菜单一.InsertInMenuBar (ThisDrawing.Application.MenuBar.Count + 1)

End Function





附件: 您需要 登录 才可以下载或查看,没有账号?注册

最佳答案

查看完整内容

创建三个通用函数,简化操作。 最后过程: 这样整个过程就清晰了,对于四级、五级菜单,只要重复调用AddSubMenu函数即可。
发表于 2014-1-14 13:16 | 显示全部楼层
创建三个通用函数,简化操作。
  1. ' AddMenu 在菜单组中创建菜单,如果菜单已经存在,直接返回
  2. ' mg 菜单组
  3. ' name 要创建的菜单名称
  4. Function AddMenu(ByVal mg As AcadMenuGroup, ByVal name As String) As AcadPopupMenu
  5.     Dim pm As AcadPopupMenu
  6.     Dim b As Boolean
  7.     b = False
  8.     Dim i As Integer
  9.     For i = 0 To mg.Menus.Count - 1
  10.         If mg.Menus(i).name = name Then
  11.             Set pm = mg.Menus(i)
  12.             b = True
  13.             Exit For
  14.         End If
  15.     Next
  16.     If b = False Then
  17.         Set pm = mg.Menus.Add(name)
  18.     End If
  19.     Set AddMenu = pm
  20. End Function

  21. ' AddSubMenu 在菜单、子菜单中创建子菜单,如果子菜单已经存在,直接返回
  22. ' parentpm 父级菜单
  23. ' caption 要创建的子菜单标题
  24. Function AddSubMenu(ByVal parentpm As AcadPopupMenu, ByVal caption As String) As AcadPopupMenu
  25.     Dim pm As AcadPopupMenu
  26.     Dim b As Boolean
  27.     b = False
  28.     Dim i As Integer
  29.     For i = 0 To parentpm.Count - 1
  30.         If parentpm(i).caption = caption Then
  31.             Set pm = parentpm(i).SubMenu
  32.             b = True
  33.             Exit For
  34.         End If
  35.     Next
  36.     If b = False Then
  37.         Set pm = parentpm.AddSubMenu(parentpm.Count + 1, caption)
  38.     End If
  39.     Set AddSubMenu = pm
  40. End Function

  41. ' AddMenuItem 在菜单、子菜单中创建菜单项,如果delete为真,先删除菜单项再创建。如果delete为假,菜单项已经存在时直接返回
  42. ' parentpm 父级菜单
  43. ' label 要创建的菜单项标签
  44. ' macro 要创建的菜单项宏
  45. ' delete 是否先删除菜单项
  46. Function AddMenuItem(ByVal parentpm As AcadPopupMenu, ByVal label As String, ByVal macro As String, Optional ByVal delete As Boolean = True) As AcadPopupMenuItem
  47.     Dim pmi As AcadPopupMenuItem
  48.     Dim b As Boolean
  49.     b = False
  50.     Dim i As Integer
  51.     For i = 0 To parentpm.Count - 1
  52.         If parentpm(i).caption = label Then
  53.             Set pmi = parentpm(i)
  54.             If delete = True Then
  55.                 pmi.delete
  56.                 b = False
  57.             Else
  58.                 b = True
  59.             End If
  60.             Exit For
  61.         End If
  62.     Next
  63.     If b = False Then
  64.         Set pmi = parentpm.AddMenuItem(parentpm.Count + 1, label, macro)
  65.     End If
  66.     Set AddMenuItem = pmi
  67. End Function

最后过程:
  1. Function 创建三级菜单按钮(一级菜单名, 二级菜单名, 三级菜单名, VBA或LSP, 按钮标题, 命令)
  2.         'On Error Resume Next
  3.         Dim macro As String
  4.         macro = Chr(vbKeyEscape) + Chr(vbKeyEscape) '这是在向命令行发送命令时需要的前缀。

  5.         Dim currMenuGroup As AcadMenuGroup
  6.         Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0)

  7.         '下面是创建菜单“工”
  8.         Dim 菜单一 As AcadPopupMenu
  9.         Set 菜单一 = AddMenu(currMenuGroup, 一级菜单名 & Chr(Asc("&")))   '这是说在没有时创建菜单“小多”
  10.         
  11.         Dim 菜单二 As AcadPopupMenu
  12.         Set 菜单二 = AddSubMenu(菜单一, 二级菜单名 & Chr(Asc("&")))
  13.         
  14.         Dim 菜单三 As AcadPopupMenu
  15.         Set 菜单三 = AddSubMenu(菜单二, 三级菜单名 & Chr(Asc("&")))
  16.         
  17.         Dim subMenuItemPoint As AcadPopupMenuItem
  18.         If VBA或LSP = "LSP" Then
  19.             '创建程序文件简单名为名的按钮,单击按钮时发出"-VBARUN XIANSHISHIYIANDAIMAYONGCHUANGTI "命令
  20.             Set subMenuItemPoint = AddMenuItem(菜单三, Chr(Asc("&")) & 按钮标题, macro & 命令 & " ")
  21.         Else
  22.              Set subMenuItemPoint = AddMenuItem(菜单三, Chr(Asc("&")) & 按钮标题, macro & "-VBARUN " & 命令 & " ")
  23.         End If
  24.         
  25.         Dim b As Boolean
  26.         b = False
  27.         Dim i As Integer
  28.         For i = 0 To ThisDrawing.Application.MenuBar.Count - 1
  29.             If ThisDrawing.Application.MenuBar(i).name = 一级菜单名 & Chr(Asc("&")) Then
  30.                 b = True
  31.                 Exit For
  32.             End If
  33.         Next
  34.         If b = False Then
  35.             菜单一.InsertInMenuBar (ThisDrawing.Application.MenuBar.Count + 1)
  36.         End If

这样整个过程就清晰了,对于四级、五级菜单,只要重复调用AddSubMenu函数即可。

点评

Set subMenuItemPoint = 菜单三.SubMenu(i) 上面这一句有错,“subMenuItemPoint”不能获得对象,也就无法删除。所以标题A(其命令为B)一旦创建,则第二次并不能将它改为命令为C,它的命令永远是B。望老师调试改正   发表于 2014-1-22 14:47
谢谢您!  发表于 2014-1-22 11:58
回复

使用道具 举报

 楼主| 发表于 2014-1-22 14:53 | 显示全部楼层
efan2000 发表于 2014-1-14 13:16
创建三个通用函数,简化操作。

最后过程:

Set subMenuItemPoint = 菜单三.SubMenu(i) 上面这一句有错,“subMenuItemPoint”不能获得对象,也就无法删除。所以标题A(其命令为B)一旦创建,则第二次并不能将它改为命令为C,它的命令永远是B。望老师调试改正


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复

使用道具 举报

发表于 2014-1-22 16:39 | 显示全部楼层
本帖最后由 efan2000 于 2014-1-22 17:24 编辑

Set subMenuItemPoint = 菜单三.SubMenu(i)
如果菜单三是AcadPopupMenu对象,那么应该是Set subMenuItemPoint = 菜单三(i)
如果菜单三是AcadPopupMenuItem对象,那么应该是Set subMenuItemPoint = 菜单三.SubMenu(i)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 1明经币 +1 收起 理由
清风明月名字 + 1 很给力!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-7 05:23 , Processed in 0.280900 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表