2009-04-20 16 views
7

लक्ष्य मेनू बनाना है जिसका उपयोग एमएस एक्सेस फॉर्म पर कुछ नियंत्रणों के साथ किया जा सकता है और उस नियंत्रण पर राइट क्लिक करने में सक्षम होने के लिए, उदाहरण के लिए सूची बॉक्स और विकल्प के साथ एक प्रासंगिक संदर्भ विशिष्ट मेनू पॉपअप, जो क्लिक किया गया है, एक पूर्वनिर्धारित subroutine या समारोह ट्रिगर करेगा।डिफ़ॉल्ट मेनू पर मेनू आइटम को जोड़ने के लिए संदर्भ मेनू पर क्लिक करें

इस प्रोग्राम को पूरा करने के लिए सबसे अच्छी विधि क्या है?

मैं एमएस एक्सेस 2003 का उपयोग कर रहा हूं और वीबीए का उपयोग करके ऐसा करना चाहता हूं।

+0

जवाब पहुंच के संस्करण के बहुत निर्भर करता है। यदि ए2007, एक उत्तर, कोई पिछले संस्करण, एक पूरी तरह से अलग जवाब। –

उत्तर

13

सबसे पहले संबंधित सह पर अमल करने के लिए एक _MouseUp घटना बनाने ntrol यह देखने के लिए देख रहा है कि सही माउस बटन क्लिक किया गया था और यदि ऐसा है, तो .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: इस उदाहरण के लिए, मैं एक खोल समारोह बना सकते हैं और पाठ वापस आ जाएगी "नमस्ते दुनिया!"।

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's work मिला।

संदर्भ: Microsoft FaceID

+0

FYI मुझे अपने कस्टम मेनू के बाद दिखाई देने से डिफ़ॉल्ट राइट-क्लिक मेनू को रोकने के लिए '_MouseUp' हैंडलर' में 'if' block' के अंदर 'DoCmd.CancelEvent'' जोड़ना पड़ा, यह भी पाया कि मैं प्रकार मार रहा था 'कॉम्बो के रूप में कमांडबारकंबोबोक्स' के लिए त्रुटियां, जिसे सामान्य 'कमांडबैरकंट्रोल' प्रकार पर स्विच करके आसानी से हल किया गया था। लेकिन आम तौर पर यह एक स्पष्ट और अच्छी तरह से लिखित उत्तर है, +1। – DaveRandom

+0

क्या आप कॉलबैक कोड को व्यवस्थित करने के लिए किसी भी तंत्र के बारे में जानते हैं? मुझे अपने फॉर्म कोड के साथ इन सभी सार्वजनिक मॉड्यूल पसंद नहीं हैं, मैं आदर्श रूप से फॉर्म के मॉड्यूल में एक सार्वजनिक सब को कॉल करना चाहता हूं, और संभवतः इसे सामान्य क्लास मॉड्यूल में भी लपेटना चाहता हूं। – DaveRandom

+0

तंत्र? सं। कोड प्लेसमेंट हां। आप आसानी से संबंधित मॉड्यूल में आवश्यक कॉल करके उन्हें आसानी से कर सकते हैं। यह सिर्फ मेरे उपयोग के मामले के लिए बेहतर काम करता है क्योंकि बाकी सब कुछ बहुत नियंत्रित था। अन्य परियोजनाओं में मैंने कोड को उस क्षेत्र में कॉल करने के लिए स्थानांतरित कर दिया है। –

2

डिफ़ॉल्ट शॉर्टकट मेनू को उस मेनू के साथ प्रतिस्थापित करने के लिए जिसमें डिफ़ॉल्ट क्रियाएं और आपके कस्टम क्रियाएं शामिल हैं, आपको कस्टम शॉर्टकट मेनू बनाना होगा जिसमें डिफ़ॉल्ट क्रियाएं शामिल हों। डिफ़ॉल्ट शॉर्टकट मेनू का विस्तार करने का कोई तरीका नहीं है।

एक्सेस 2003 में शॉर्टकट मेनू और पहले एक विशेष प्रकार की टूलबार हैं। आप उन्हें एक ही तरीके से बनाते हैं (अधिक या कम) कि आप एक कस्टम टूलबार बनाते हैं। यूआई एक अजीब तरह का है, हालांकि, एक विशेष जगह है जहां आप उन्हें बनाते हैं।

प्रारंभ करने के लिए, अपने फ्रंट-एंड एक्सेस एमडीबी में टूलबार पर राइट क्लिक करें। अनुकूलित करें चुनें। टूलबार की सूची में, शॉर्टकट मेनू देखें। यह आपको सभी अंतर्निर्मित शॉर्टकट मेनू की एक सूची देगा, सिवाय इसके कि वे वास्तव में वास्तविक उपयोग में ऐसा नहीं दिखते हैं।

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 ब्लॉग सिर्फ तैनात एक article on doing this programmatically रिबन इंटरफेस की वजह से पहुँच 2007 में, वहाँ मतभेद होने जा रहे हैं, लेकिन कुछ चीजें एक ही हो जाएगा।

+0

एक्सेल, वर्ड इत्यादि के अनुसार एक्सेस का उपयोग Office.CommandBar और Office.CommandBarButton ऑब्जेक्ट्स का उपयोग करता है? – onedaywhen

+0

डेविड, यह समझने में बहुत मददगार है कि कमांड बार के साथ निपटने के तरीके तक पहुंच कैसे होती है। हालांकि, मैं प्रोग्रामिंग के अनुसार जो कुछ भी कहता हूं वह करने के लिए देख रहा हूं। –

+0

यह मेरे अनुभव में प्रोग्रामेटिक रूप से करने योग्य है, बल्कि बदसूरत है। वीबीई में "प्रोग्राम टूलबार" की खोज में मदद करें और वहां सहायता पढ़ें। चूंकि शॉर्टकट मेनू टूलबार का एक रूप है, इसलिए आप उसी विधि का उपयोग करेंगे। मैं खुद को इस तरह से नहीं करूँगा, हालांकि। मैं कस्टम मेनू बनाउंगा और उसके बाद आवश्यक वस्तुओं को संदर्भित करने के रूप में उन पर विशेष आइटम दिखाऊंगा/छुपाऊंगा। –

2

प्रयास करें यह

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 

आप इसे "फ़ॉर्म देखें पॉपअप" कमांड बार में आइटम जोड़ देगा देख सकते हैं और जब इस आइटम क्लिक किया जाता है यह प्रक्रिया लोड होगा qtrReport

और इस सुविधा का उपयोग Access में सभी CommandBars देखने के लिए

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

यह वही है जो मैं खोज रहा था। धन्यवाद –

संबंधित मुद्दे