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

цель состоит в том, чтобы создать меню, которые могут быть использованы с определенными элементами управления в форме 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: для этого примера я гарантирую, что элемент управления все еще valid, проверив его на 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

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

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

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

нашел работа Пиллай Шиама при создании надстройки браузера FaceID, чтобы быть очень полезным.

ссылки: Microsoft FaceID


Попробуй Такое

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

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

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

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

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

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

для начала щелкните правой кнопкой мыши панель инструментов в интерфейсном MDB доступа. Выберите Настроить. В списке панелей инструментов отметьте контекстные меню. Это даст вам список всех встроенных контекстных меню, за исключением того, что они на самом деле не выглядят так, как в реальном использовании. Например, если щелкнуть правой кнопкой мыши по форме, вы получите следующее контекстное меню:

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

теперь, где это меню в контекстном меню? Ну, это, оказывается, строка заголовка вида формы меню, хотя оно появляется в любое время, когда вы нажимаете в любом месте, кроме элемента управления в форме. Итак, если это меню, которое вы хотите изменить, вы можете отредактировать его, добавив в него пункты меню (операция перетаскивания).

Я думаю, что на самом деле лучше (как я сказал выше) создать пользовательское контекстное меню, которое реплицирует встроенное меню и добавляет ваши улучшения, потому что это позволяет сохранить контекстное меню по умолчанию доступа, а также иметь настроенную версию его для использования, когда вы хотеть его. В этом случае вам нужно будет запустить новое контекстное меню, и вот где пользовательский интерфейс странный:

вы нажимаете на последний выбор в контекстном меню, пользовательский. Вы видите, что он падает на заполнитель. Вы не можете перетащить/падение к нему. Вместо этого вы должны нажать кнопку Создать в главном окне редактирования панели инструментов и создать новую панель быстрого доступа (дайте ей имя, которое вы хотите, чтобы ваше пользовательское контекстное меню имело). Новая панель инструментов теперь отображается в списке панелей инструментов. Выделите его и щелкните свойства, и измените тип на POPUP. Это даст вам информативное предупреждение о том, что это изменение изменяет его с панели инструментов на контекстное меню. Затем вы можете закрыть панель инструментов/контекстное меню на листе свойств, и теперь, если вы снова отключите контекстное меню и посмотрите на пользовательское меню, вы увидите вновь созданное меню. Теперь вы можете перетащить пункты меню для встроенного меню в новое меню, но не бросайте их в самом меню, а на заполнителе во всплывающем окне из > справа от название меню.

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

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

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