Как добавить пункт меню в контекстное меню по умолчанию правой кнопкой мыши - PullRequest
7 голосов
/ 21 апреля 2009

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

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

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

Ответы [ 3 ]

14 голосов
/ 24 мая 2011

Сначала создайте событие _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 может использоваться для обозначения известного значка офиса, связанного с каждым экземпляром всплывающего меню.

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

Ссылка: Microsoft FaceID

2 голосов
/ 24 апреля 2009

Попробуйте

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
2 голосов
/ 22 апреля 2009

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

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

Для начала щелкните правой кнопкой мыши на панели инструментов в вашем внешнем MDB Access. Выберите CUSTOMIZE. В списке панелей инструментов отметьте ОТКРЫТЫЕ МЕНЮ. Это даст вам список всех встроенных контекстных меню, за исключением того, что в действительности они не выглядят так, как в реальном использовании. Например, если щелкнуть правой кнопкой мыши на форме, вы получите это контекстное меню:

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...