2009-04-20 78 views
7

Mục đích là tạo các menu có thể được sử dụng với các điều khiển nhất định trên biểu mẫu MS Access và có thể nhấp chuột phải vào điều khiển đó, ví dụ: hộp danh sách và cửa sổ menu ngữ cảnh có liên quan cụ thể có các tùy chọn, nếu được nhấp, sẽ kích hoạt chương trình con hoặc hàm được xác định trước.Cách thêm mục menu vào menu ngữ cảnh nhấp chuột phải mặc định

Phương pháp tốt nhất để thực hiện điều này theo chương trình là gì?

Tôi đang sử dụng MS Access 2003 và muốn thực hiện việc này bằng VBA.

+0

Câu trả lời phụ thuộc rất nhiều vào phiên bản của Access. Nếu A2007, một câu trả lời, bất kỳ phiên bản trước nào, một câu trả lời hoàn toàn khác nhau. –

Trả lời

13

Đầu tiên hãy tạo một sự kiện _MouseUp để thực thi trên đồng tương ứng ntrol tìm cách xem nút chuột phải có được nhấp hay không và nếu có, hãy gọi phương thức .ShowPopup.

Tất nhiên điều này giả định

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 

Kể từ thời điểm này Command Bar MyListControlContextMenu là undefined, tôi xác định các Menu trong một module riêng biệt như sau:

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 

Kể từ khi ba chức năng đã được tham chiếu, chúng tôi có thể chuyển sang để xác định những điều sau:

getText: Lưu ý, điều này tùy chọn yêu cầu tham chiếu đến cả tên của tên menu Lệnh thanh công cụ cũng như tên của chú thích kiểm soát .

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: Ví dụ này, tôi sẽ tạo ra một chức năng vỏ và trả lại văn bản "Hello World!".

Public Function LookupDetailsFunction() As String 

    LookupDetailsFunction = "Hello World!" 

    MsgBox LookupDetailsFunction, vbInformation, "Notice!" 

End Function 

DeleteRecordFunction: Ví dụ này, tôi sẽ đảm bảo sự kiểm soát vẫn còn hợp lệ bằng cách kiểm tra nó chống lại null, và nếu vẫn còn hiệu lực, sẽ thực hiện một truy vấn để loại bỏ các bản ghi từ một bảng.

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 

Lưu ý: Đối với LookupDetailsFunction, DeleteRecordFunctiongetText chức năng, những phải nằm trong một phạm vi công cộng để làm việc một cách chính xác.

Cuối cùng, bước cuối cùng là kiểm tra menu. Để thực hiện việc này, hãy mở biểu mẫu, nhấp chuột phải vào điều khiển danh sách và chọn một trong các tùy chọn từ trình đơn bật lên.

Tùy chọn button.FaceID có thể được sử dụng để biểu thị biểu tượng văn phòng đã biết liên kết với từng trường hợp kiểm soát bật lên menu.

Tôi đã tìm thấy Pillai Shyam's work khi tạo Add-In FaceID trình duyệt rất hữu ích.

Tài liệu tham khảo: Microsoft FaceID

+0

FYI Tôi cũng phải thêm 'DoCmd.CancelEvent' vào bên trong khối' If' trong trình xử lý '_MouseUp' để điều khiển danh sách của mình để ngăn trình đơn nhấp chuột mặc định xuất hiện sau trình đơn tùy chỉnh của tôi, cũng thấy rằng tôi đã gõ lỗi cho 'combo As CommandBarComboBox', được dễ dàng giải quyết bằng cách chuyển sang kiểu' CommandBarControl' chung. Nhưng nói chung đây là một câu trả lời rõ ràng và được viết tốt, +1. – DaveRandom

+0

Bạn có biết bất kỳ cơ chế nào để tổ chức mã gọi lại tốt hơn một chút không? Tôi không thích tất cả các mô-đun công cộng cùng với mã biểu mẫu của tôi, tôi lý tưởng muốn gọi một phụ công khai trong mô-đun của biểu mẫu, và có thể cũng bọc nó trong một mô-đun lớp chung. – DaveRandom

+0

Cơ chế? Không. Bạn có thể dễ dàng làm điều đó bằng cách đặt các cuộc gọi cần thiết trong mô-đun tương ứng bằng cách sử dụng chúng. Điều này chỉ làm việc cho trường hợp sử dụng của tôi tốt hơn như mọi thứ khác đã được kiểm soát rất nhiều. Trong các dự án khác, tôi đã chuyển mã vào khu vực thực hiện cuộc gọi đến đó. –

2

Để thay thế menu phím tắt mặc định bằng menu bao gồm các hành động mặc định cộng với hành động tùy chỉnh của bạn, bạn phải tạo menu phím tắt tùy chỉnh bao gồm các hành động mặc định. Không có cách nào để mở rộng menu phím tắt mặc định.

Trình đơn phím tắt trong Access 2003 và trước đây là một loại thanh công cụ đặc biệt. Bạn tạo chúng theo cùng một cách (nhiều hơn hoặc ít hơn) mà bạn tạo một thanh công cụ tùy chỉnh. Giao diện người dùng khá kỳ lạ, vì có một nơi đặc biệt nơi bạn tạo chúng.

Để bắt đầu, hãy nhấp chuột phải vào thanh công cụ trong Access MDB đầu cuối của bạn. Chọn CUSTOMIZE. Trong danh sách các thanh công cụ, hãy kiểm tra SHORTCUT MENUS. Thao tác này sẽ cung cấp cho bạn danh sách tất cả các menu lối tắt được tích hợp sẵn, ngoại trừ việc chúng không thực sự trông giống như trong thực tế sử dụng. Ví dụ: nếu nhấp chuột phải vào biểu mẫu, bạn sẽ thấy menu lối tắt này:

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

Hiện tại, menu này ở menu lối tắt ở đâu? Vâng, điều này xảy ra là menu FORM VIEW TITLE BAR, mặc dù nó bật lên bất cứ khi nào bạn nhấp vào bất kỳ nơi nào khác ngoài điều khiển trên biểu mẫu. Vì vậy, nếu đó là menu bạn muốn thay đổi, bạn có thể chỉnh sửa nó bằng cách thêm các mục trình đơn vào nó (thao tác kéo và thả). Tôi nghĩ rằng nó thực sự tốt hơn (như tôi đã nói ở trên) để tạo menu phím tắt tùy chỉnh sao chép trình đơn được tích hợp sẵn và thêm các cải tiến của bạn bởi vì điều này cho phép bạn giữ lại menu lối tắt mặc định Access trong khi cũng có phiên bản tùy chỉnh của bạn nó để sử dụng khi bạn muốn. Trong trường hợp đó, bạn cần bắt đầu trình đơn phím tắt mới và đây là giao diện người dùng lạ:

Bạn nhấp vào lựa chọn cuối cùng trên menu lối tắt, CUSTOM. Bạn thấy nó thả xuống một trình giữ chỗ. Bạn không thể kéo/thả vào nó. Thay vào đó, bạn phải nhấp vào MỚI trong cửa sổ chỉnh sửa thanh công cụ chính và tạo một thanh công cụ phím tắt mới (đặt tên cho nó mà bạn muốn trình đơn phím tắt tùy chỉnh của mình có). Thanh công cụ mới của bạn hiện xuất hiện trong danh sách các thanh công cụ. Đánh dấu nó và bấm ĐẶC TÍNH, và thay đổi loại thành POPUP. Điều này sẽ cung cấp cho bạn một thông báo cảnh báo rằng thay đổi này thay đổi nó từ một thanh công cụ để một menu phím tắt. Sau đó, bạn có thể đóng trang thuộc tính của thanh công cụ/lối tắt của menu, và bây giờ nếu bạn kiểm tra lại SHORTCUT MENUS một lần nữa và nhìn vào menu TÙY CHỈNH, bạn sẽ thấy thực đơn mới được tạo. Bây giờ bạn có thể kéo và thả các mục trình đơn cho trình đơn được tích hợp trong menu mới của bạn - nhưng không thả chúng vào chính trình đơn, nhưng trên trình giữ chỗ trong flyout từ> ở bên phải của tên menu.

Sau đó, bạn có thể kéo và thả bất kỳ tùy chọn nào bạn muốn từ bất kỳ menu hoặc thanh công cụ nào vào menu tùy chỉnh của bạn.

Tôi giả sử bạn biết cách sử dụng menu lối tắt vì đây là một phần của trang thuộc tính của tất cả các đối tượng biểu mẫu.

Cập nhật 2009/05/21: Blog Access 2007 chính thức vừa đăng article on doing this programmatically trong Access 2007. Do giao diện ribbon, sẽ có sự khác biệt, nhưng một số thứ sẽ giống nhau.

+0

Truy cập có sử dụng các đối tượng Office.CommandBar và Office.CommandBarButton, theo Excel, Word, v.v. không? – onedaywhen

+0

David, Điều này rất hữu ích trong việc hiểu cách Access tiếp cận giao dịch với Thanh Lệnh. Tuy nhiên, tôi đang tìm cách làm những gì bạn đã lập trình. –

+0

Nó có thể thực hiện được lập trình, nhưng thay vào đó là theo kinh nghiệm của tôi. Trong VBE, hãy tìm kiếm "thanh công cụ chương trình" và đọc trợ giúp ở đó. Vì các menu phím tắt chỉ là một dạng thanh công cụ, bạn sẽ sử dụng cùng một phương thức. Mặc dù vậy, tôi sẽ không làm theo cách đó. Tôi muốn tạo các menu tùy chỉnh và sau đó hiển thị/ẩn các mục cụ thể trên chúng dưới dạng ngữ cảnh bắt buộc. –

2

Hãy thử này

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 

Như bạn có thể nhìn thấy nó sẽ thêm mục trong "Mẫu Xem Popup" Command Bar và khi mặt hàng này được nhấp vào nó sẽ được tải thủ tục qtrReport

Và sử dụng chức năng này để xem tất cả các Commandbars trong Access

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

Đây chính xác là những gì tôi đang tìm kiếm. Cảm ơn –

Các vấn đề liên quan