2009-09-29 12 views
7

पैरामीटर द्वारा फ़ंक्शन को पास करने के लिए मैं कैसे कर सकता हूं, बाद में वीबी 6 में बुलाया जा सकता है? होगा कि मैं क्या जरूरत है की तरह कुछ, इन विकल्पों में से कोई भी हो सकता है:vb6 - पैरामीटर के लिए फ़ंक्शन कैसे पास करें?

Private Sub Command1_Click() 

    Call callMethod(MyPrivateFunction) 
    Call callMethod(MyPublicFunction) 
    Call callMethod(MyPrivateSub) 
    Call callMethod(MyPublicSub) 

End Sub 

Private Function MyPrivateFunction() 
    MsgBox "MyPrivateFunction" 
End Function 

Public Function MyPublicFunction() 
    MsgBox "MyPublicFunction" 
End Function 

Private Sub MyPrivateSub() 
    MsgBox "MyPrivateSub" 
End Sub 

Public Sub MyPublicSub() 
    MsgBox "MyPublicSub" 
End Sub 

Public Function callMethod(ByRef func As Object) 
    Call func 
End Function 
+0

क्या यह फ़ंक्शन ऑब्जेक्ट स्वयं ही होना चाहिए? स्ट्रिंग पास क्यों न करें, फिर उपयुक्त फ़ंक्शन को कॉल करने के लिए केस स्टेटमेंट का उपयोग करें? –

+0

मैं "माइक्रोसॉफ्ट.एक्सएमएलटीटीपी" का उपयोग कर रहा हूं और फिर विधि को कॉल करने के लिए myHttp.OnReadyStateChange = xFunction की आवश्यकता है। और xFunction पैरामीटर –

+0

के माध्यम से पारित किया जाना चाहिए मुझे vb6 को बहुत अच्छी तरह याद नहीं है, लेकिन मुझे लगता है कि आपको कॉलबैक पंजीकृत करने के लिए पताOf का उपयोग करने की आवश्यकता है। और समारोह को एक मॉड्यूल में घोषित किया जाना है। – Joepro

उत्तर

6

IIRC वहाँ VB6 में एक "AddressOf" समारोह समारोह पतों प्राप्त करने के लिए है, लेकिन आप की संभावना वास्तव में उस समारोह पते का उपयोग कर बड़ी मुश्किल होगा वीबी 6 के भीतर से।

इसे संभालने के लिए एसओपी तरीका "CallByName()" है जो आपके नामों से आपको पता है, आप जानते हैं, कॉल फ़ंक्शन इत्यादि के साथ है।

आखिरकार, आप मानक ओओ समाधान का उपयोग करके उच्च सड़क भी ले सकते हैं: फ़ंक्शन को पारित करने के बजाय, अपनी खुद की कक्षा लिखें जो "MyFunctionInterface" के अपने विशेष इंटरफ़ेस को लागू करती है। इस इंटरफ़ेस में केवल एक ही विधि है "FunctionToCall (..)", जिसे आप विभिन्न वर्गों में लागू कर सकते हैं ताकि आपको आवश्यक विभिन्न कार्यों को कॉल किया जा सके। फिर आप इन कक्षाओं में से किसी एक को अपने दिनचर्या में एक उदाहरण देते हैं, जो इसे "MyFunctonInterface" के रूप में प्राप्त करता है और उस पर "FunctionToCall" विधि को कॉल करता है। बेशक इसमें बहुत सारे मामूली डिज़ाइन परिवर्तन होते हैं ...

+0

ठीक है, यह देखते हुए कि मैं एक और संरचना का चयन करूंगा, क्योंकि मुझे अन्य समाधान की आवश्यकता है, धन्यवाद –

1

आपकी टिप्पणी जो आप Microsoft.XMLHTTP OnReadyStateChange का उपयोग कर रहे हैं, दिलचस्प है। MSDN page for OnReadyStateChange कहता है कि "इसे स्क्रिप्टिंग वातावरण में उपयोग के लिए डिज़ाइन किया गया है और माइक्रोसॉफ्ट® विजुअल बेसिक® में आसानी से सुलभ नहीं है"।

एक ही पृष्ठ का कहना है कि विजुअल बेसिक 6 में आपको यह करना चाहिए। मॉड्यूल स्तर

Dim WithEvents xmldoc As DOMDocument30 

पर इस परिवर्तनीय घोषणा को रखें और फिर आप इस तरह के सामान्य तरीके से ईवेंट को संभालने में सक्षम होंगे।

Private Sub xmldoc_onreadystatechange() 
    ' Deal with the event here ' 
End Sub 

एक के रूप में एक तरफ वहाँ this question में नाम से कार्यों बुला के बारे में अधिक चर्चा है। लेकिन मुझे लगता है कि यह आपकी समस्या का गलत समाधान है।

+0

धन्यवाद, सभी 3 उत्तरों ने मुझे निर्णय लेने के लिए बहुत कुछ करने में मदद की। –

3

आप कोई फ़ंक्शन पास नहीं कर सकते हैं, लेकिन आप किसी ऑब्जेक्ट को पास कर सकते हैं जो फ़ंक्शन के रूप में व्यवहार करता है (कभी-कभी "फ़ैक्टर" कहा जाता है)। यह मेरे लिए हर समय उपयोगी है। यदि आप "मज़ेदार" वर्ग एक इंटरफेस लागू करता है, तो कॉल सुरक्षित प्रकार होगा।

सार वर्ग (इंटरफेस) IAction.cls:

Option Explicit 

Public Sub Create(ByVal vInitArgs As Variant) 

End Sub 

Public Function exe() As Variant 

End Function 

functor कि डिफ़ॉल्ट ब्राउज़र में एक यूआरएल प्रदर्शित करता है: उदाहरण के लिए

Option Explicit 

Implements IAction 
Dim m_sUrl As String 

Public Sub IAction_Create(ByVal vInitArgs As Variant) 
     m_sUrl = vInitArgs  
End Sub 

Public Function IAction_exe() As Variant 


     Call RunUrl(m_sUrl) 'this function is defined elsewhere 

Exit Function 

अब आप इन कक्षाओं का एक समूह बना सकते हैं, उन्हें एक संग्रह में सहेजें, उन्हें किसी भी फ़ंक्शन या विधि से पास करें जो IAction, आदि की अपेक्षा करता है ...

+0

धन्यवाद, सभी 3 उत्तरों ने मुझे निर्णय लेने के लिए बहुत कुछ करने में मदद की। –

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