Как добавить пункт меню в контекстное меню по умолчанию правой кнопкой мыши

Цель состоит в том, чтобы создать меню, которые можно использовать с определенными элементами управления в форме MS Access, и иметь возможность щелкнуть правой кнопкой мыши на этом элементе управления, например, в списке и в соответствующем контекстном меню с опциями, которые при нажатии будут вызвать предопределенную подпрограмму или функцию.

Каков наилучший способ сделать это программно?

Я использую MS Access 2003 и хотел бы сделать это с помощью VBA.

3 ответа

Решение

Сначала создайте _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: для этого примера я создам функцию оболочки и верну текст "Hello World!".

Public Function LookupDetailsFunction() As String

   LookupDetailsFunction = "Hello World!"

   MsgBox LookupDetailsFunction, vbInformation, "Notice!"

End Function

DeleteRecordFunction: в этом примере я позабочусь о том, чтобы элемент управления все еще действовал, проверив его на ноль, и, если он все еще действителен, выполнит запрос для удаления записи из таблицы.

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

Примечание: для LookupDetailsFunction, DeleteRecordFunction а также getText функции, они должны быть в публичном доступе для правильной работы.

Наконец, последний шаг - проверить меню. Для этого откройте форму, щелкните правой кнопкой мыши элемент управления списком и выберите один из вариантов во всплывающем меню.

По выбору button.FaceID может использоваться для указания известного значка офиса, чтобы связать его с каждым экземпляром всплывающего меню.

Я считаю, что работа Pillai Shyam по созданию надстройки браузера FaceID очень полезна.

Рекомендации: Microsoft FaceID

Чтобы заменить контекстное меню по умолчанию на меню, которое включает в себя действия по умолчанию и ваши пользовательские действия, необходимо создать пользовательское контекстное меню, которое включает в себя действия по умолчанию. Невозможно расширить контекстное меню по умолчанию.

Контекстные меню в Access 2003 и более ранних версиях представляют собой особый вид панели инструментов. Вы создаете их так же (более или менее), как вы создаете пользовательскую панель инструментов. Тем не менее, пользовательский интерфейс довольно странный, поскольку есть специальное место, где вы их создаете.

Чтобы начать, щелкните правой кнопкой мыши на панели инструментов в вашем внешнем MDB Access. Выберите 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 по умолчанию, а также иметь настроенную версию для использования при ты хочешь это. В этом случае вам нужно запустить новое контекстное меню, и вот где странный интерфейс:

Вы нажимаете на последний выбор в контекстном меню, CUSTOM. Вы видите, что это падает заполнитель. Вы не можете перетащить / опустить его. Вместо этого вам нужно нажать кнопку NEW в главном окне редактирования панели инструментов и создать новую панель быстрого доступа (дайте ей имя, которое вы хотите иметь в своем пользовательском контекстном меню). Ваша новая панель инструментов теперь отображается в списке панелей инструментов. Выделите его и нажмите СВОЙСТВА и измените тип на POPUP. Это даст вам информативное предупреждение о том, что это изменение меняет его с панели инструментов на контекстное меню. После этого вы можете закрыть страницу свойств панели инструментов / контекстного меню, и теперь, если вы снова отключите SHORTCUT MENUS и посмотрите на меню CUSTOM, вы увидите только что созданное меню. Теперь вы можете перетаскивать элементы меню встроенного меню в новое меню - но не перетаскивайте их в само меню, а в местозаполнитель во всплывающем меню из> справа от названия меню.

Затем вы можете перетащить любые параметры из любых меню или панелей инструментов в свое пользовательское меню.

Я предполагаю, что вы знаете, как использовать контекстное меню, поскольку оно является частью листа свойств всех объектов формы.

ОБНОВЛЕНИЕ 2009/05/21: Официальный блог Access 2007 только что опубликовал статью об этом программно в Access 2007. Из-за ленточного интерфейса будут различия, но некоторые вещи будут такими же.

Попробуй это

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

Как вы можете видеть, он добавит элемент в командной строке "Form View Popup" и при щелчке по этому элементу загрузит процедуру qtrReport.

И используйте эту функцию, чтобы увидеть все панели команд в Access

Sub ListAllCommandBars()
For i = 1 To Application.CommandBars.Count
    Debug.Print Application.CommandBars(i).Name
Next
End Sub
Другие вопросы по тегам