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