仅在特定表单控件(TextBox)上启用快捷菜单

时间:2017-03-03 15:53:09

标签: ms-access access-vba

这与this question密切相关,但尚未找到答案。

我有一个表单,我希望只有在该表单上的TextBox内部单击时才启用快捷菜单(弹出右键单击的菜单)(在其他地方禁用)。问题是,该选项似乎只对整个表格是全局的。

将Form的ShortcutMenu设置为False,我可以在TextBox" On Enter"中将其设置为True。事件使用" ShortcutMenu = True",在输入TextBox之前,右键单击不执行任何操作。这个问题是,当用户输入TextBox时,如果他右键单击表单中的任何其他位置,将出现右键菜单,这不是我想要的。

使用" ShortcutMenu = False"禁用ShortcutMenu在"退出"同一TextBox的事件有效但仅当用户点击另一个控件时,而不是之前,这不能解决问题。

无论如何都要运行" ShortcutMenu = False"在某个地方执行右键单击操作之前? (进入TextBox后)。类似于"鼠标远离此控件"事件

1 个答案:

答案 0 :(得分:1)

您可以通过动态创建2个自定义快捷菜单来实现此目的。一个基本上是整个表单的虚拟快捷菜单,没有控件,另一个将是你想要在实际控件上显示的那个。我将这些设置为临时的。您需要将自定义控件调整为右键单击时显示的内容。

Private Const CntrlShortcutMenu As String = "CntrlShortCutMenu"
Private Const FormShortcutMenu As String = "FormShortCutMenu"

Private Sub Form_Load()
 Call CreateControlShortcutMenu("txtvalue1")
 Call CreateDummyShortcutMenuonForm
End Sub

Private Sub Form_Unload(Cancel As Integer)
 DeleteShortCutMenu (CntrlShortcutMenu)
 DeleteShortCutMenu (FormShortcutMenu)
End Sub

Private Sub CreateDummyShortcutMenuonForm()
    Call DeleteShortCutMenu(FormShortcutMenu)
    Call CommandBars.Add(FormShortcutMenu, 5, False, True)
    Me.ShortcutMenuBar = FormShortcutMenu
End Sub

Private Sub DeleteShortCutMenu(MenuName As String)
  On Error Resume Next
  CommandBars(MenuName).Delete
End Sub

Private Sub CreateControlShortcutMenu(CntrlName As String)

On Error GoTo errhandler

    Dim cmdShortcutMenu As Object 'Office.CommandBar

    Call DeleteShortCutMenu(CntrlShortcutMenu)

    Set cmdShortcutMenu = CommandBars.Add(CntrlShortcutMenu, 5, False, True)

        With cmdShortcutMenu

             With .Controls.Add(Type:=10)
                .Caption = "Text Editing"
                .Controls.Add Type:=1, Id:=19   'Copy
                .Controls.Add Type:=1, Id:=22   'Paste
                .Controls.Add Type:=1, Id:=2941 'Select All
             End With

             With .Controls.Add(Type:=10)
                .Caption = "Filter"
                .Controls.Add Type:=1, Id:=210  'Sort Ascending
                .Controls.Add Type:=1, Id:=211  'Sort Descending
                .Controls.Add Type:=1, Id:=640  'Filter By Selection
                .Controls.Add Type:=1, Id:=3017 'Filter Excluding Selection
                .Controls.Add Type:=2, Id:=2863 'Filter For
                .Controls.Add Type:=1, Id:=605  'Remove Filter/Sort
             End With

        End With

        Me.Controls(CntrlName).ShortcutMenuBar = CntrlShortcutMenu

ExitSub:
    Set cmdShortcutMenu = Nothing
    Exit Sub
errhandler:
    Debug.Print "CreateControlShortcutMenu", Err.Description
    Resume ExitSub
End Sub