如何将菜单项添加到默认的右键单击上下文菜单

时间:2009-04-20 22:59:34

标签: ms-access vba menu controls popup

目标是创建可以与MS Access表单上的某些控件一起使用的菜单,并且能够右键单击该控件,例如在列表框和带有选项的相关上下文特定菜单弹出窗口,如果单击,将触发预定义的子例程或函数。

以编程方式完成此操作的最佳方法是什么?

我正在使用MS Access 2003,并且希望使用VBA执行此操作。

3 个答案:

答案 0 :(得分:14)

首先在相应的控件上创建一个_MouseUp事件,查看是否单击了鼠标右键,如果是,请调用.ShowPopup方法。

当然这假设了

Private Sub MyListControlName_MouseUp(ByVal Button As Integer, _
                                      ByVal Shift As Integer, _
                                      ByVal X As Long, ByVal Y As Long)

  ' Call the SetUpContextMenu function to ensure it is setup with most current context
  ' Note: This really only needs to be setup once for this example since nothing is 
  ' changed contextually here, but it could be further expanded to accomplish this
  SetUpContextMenu  
  ' See if the right mouse button was clicked
  If Button = acRightButton Then
    CommandBars("MyListControlContextMenu").ShowPopup
  End If
End Sub

由于此时命令栏MyListControlContextMenu未定义,我在单独的模块中定义菜单如下:

Public Sub SetUpContextMenu()
  ' Note: This requires a reference to Microsoft Office Object Library
    Dim combo As CommandBarComboBox

    ' Since it may have been defined in the past, it should be deleted, 
    ' or if it has not been defined in the past, the error should be ignored

    On Error Resume Next 
    CommandBars("MyListControlContextMenu").Delete
    On Error GoTo 0

    ' Make this menu a popup menu 
    With CommandBars.Add(Name:="MyListControlContextMenu", Position:=msoBarPopup)

    ' Provide the user the ability to input text using the msoControlEdit type
    Set combo = .Controls.Add(Type:=msoControlEdit)
        combo.Caption = "Lookup Text:"           ' Add a label the user will see
        combo.OnAction = "getText"               ' Add the name of a function to call

    ' Provide the user the ability to click a menu option to execute a function    
    Set combo = .Controls.Add(Type:=msoControlButton)
        combo.BeginGroup = True                  ' Add a line to separate above group
        combo.Caption = "Lookup Details"         ' Add label the user will see
        combo.OnAction = "LookupDetailsFunction" ' Add the name of a function to call

    ' Provide the user the ability to click a menu option to execute a function        
    Set combo = .Controls.Add(Type:=msoControlButton)
        combo.Caption = "Delete Record"          ' Add a label the user will see
        combo.OnAction = "DeleteRecordFunction"  ' Add the name of the function to call

  End With

End Sub 

由于已经引用了三个函数,我们可以继续按如下方式定义它们 -

getText :注意,此选项需要同时引用命令栏菜单名称的名称以及控件标题的名称

Public Function getText() As String

   getText = CommandBars("MyListControlContextMenu").Controls("Lookup Text:").Text

   ' You could optionally do something with this text here, 
   ' such as pass it into another function ...
   MsgBox "You typed the following text into the menu: " & getText

End Function

LookupDetailsFunction :对于这个例子,我将创建一个shell函数并返回文本“Hello World!”。

Public Function LookupDetailsFunction() As String

   LookupDetailsFunction = "Hello World!"

   MsgBox LookupDetailsFunction, vbInformation, "Notice!"

End Function

DeleteRecordFunction :对于这个例子,我将通过对null检查它来确保控件仍然有效,如果仍然有效,将执行查询以从表中删除记录。

Public Function DeleteRecordFunction() As String

   If Not IsNull(Forms!MyFormName.Controls("MyListControlName").Column(0)) Then
     Currentdb.Execute _
      "DELETE * FROM [MyTableName] " & _
      "WHERE MyKey = " & Forms!MyFormName.Controls("MyListControlName").Column(0) & ";"
     MsgBox "Record Deleted", vbInformation, "Notice!"
   End If

End Function

注意:对于LookupDetailsFunctionDeleteRecordFunctiongetText函数,这些函数必须在公共范围内才能正常工作。

最后,最后一步是测试菜单。要执行此操作,请打开表单,右键单击列表控件,然后从弹出菜单中选择一个选项。

可选地,button.FaceID可用于指示与菜单弹出控件的每个实例相关联的已知办公室图标。

我发现创建FaceID浏览器加载项时Pillai Shyam's work非常有帮助。

参考文献: Microsoft FaceID

答案 1 :(得分:2)

要使用包含默认操作和自定义操作的菜单替换默认快捷菜单,您必须创建包含默认操作的自定义快捷菜单。无法扩展默认快捷菜单。

Access 2003及之前的快捷菜单是一种特殊的工具栏。您可以使用创建自定义工具栏的相同方式(或多或少)创建它们。然而,用户界面有点奇怪,因为有一个特殊的地方你可以创建它们。

要开始使用,请右键单击前端Access MDB中的工具栏。选择CUSTOMIZE。在工具栏列表中,选中SHORTCUT MENUS。这将为您提供所有内置快捷菜单的列表,不同之处在于它们实际上看起来并不像实际使用中那样。例如,如果右键单击表单,则会显示以下快捷菜单:

Form Design
Datasheet View
PivotTable View
PivotChart View
Filter By Form
Apply Filter/Sort
Remove Filter/Sort
Cut
Copy
Paste
Properties

现在,快捷菜单上的这个菜单在哪里?好吧,这个恰好是FORM VIEW TITLE BAR菜单,即使它在任何时候点击表单上的控件以外的任何地方弹出。因此,如果这是您要更改的菜单,您可以通过向其添加菜单项来进行编辑(拖放操作)。

我认为实际上更好(如上所述)创建一个自定义快捷菜单,复制内置菜单并添加增强功能,因为这样可以保留Access默认快捷菜单,同时还可以保留自定义版本在你想要的时候使用。在这种情况下,您需要启动一个新的快捷菜单,这里的UI很奇怪:

单击快捷菜单上的最后一个选项CUSTOM。你看它掉落了一个占位符。你无法拖放到它。相反,您必须在主工具栏编辑窗口中单击“新建”并创建一个新的快捷工具栏(为其指定您希望自定义快捷菜单具有的名称)。您的新工具栏现在显示在工具栏列表中。突出显示它并单击“属性”,然后将类型更改为“POPUP”。这将为您提供信息警告,表明此更改会将其从工具栏更改为快捷菜单。然后,您可以关闭工具栏/快捷菜单的属性表,现在如果再次选中SHORTCUT MENUS并查看CUSTOM菜单,您将看到新创建的菜单。现在,您可以将内置菜单的菜单项拖放到新菜单中 - 但不要将它们放在菜单本身上,而是放在>中弹出的占位符上。菜单名称右侧。

然后,您可以将任何菜单或工具栏中的任何选项拖放到自定义菜单中。

我假设您知道如何使用快捷菜单,因为它是所有表单对象的属性表的一部分。

更新2009/05/21: 官方Access 2007博客刚刚在Access 2007中发布了article on doing this programmatically。由于功能区界面,会有差异,但有些事情会相同。

答案 2 :(得分:2)

试试这个

Sub Add2Menu()
  Set newItem = CommandBars("Form View Popup").Controls.Add(Type:=1)
  With newItem
    .BeginGroup = True
    .Caption = "Make Report"
    .FaceID = 0
    .OnAction = "qtrReport"
  End With
End Sub

如您所见,它将在“表单视图弹出”命令栏中添加项目,当单击此项目时,它将加载过程 qtrReport

并使用此功能查看Access中的所有命令栏

Sub ListAllCommandBars()
For i = 1 To Application.CommandBars.Count
    Debug.Print Application.CommandBars(i).Name
Next
End Sub