2008-09-02 12 views
17

मुझे अपने वर्तमान कार्यस्थल पर एक बड़ा वीबी 6 ऐप मिला है। मैं नौकरी पर वीबी 6 सीख रहा हूं और मेरे पास कई समस्याएं हैं I इस समय प्रमुख मुद्दा यह है कि मैं यह नहीं समझ सकता कि संग्रह वस्तु में कोई कुंजी मौजूद है या नहीं। क्या कोई मदद कर सकता है?जांचें कि वीबी 6 संग्रह में कोई रिकॉर्ड मौजूद है या नहीं?

उत्तर

8

मैं हमेशा इस तरह एक समारोह के साथ यह किया है:

public function keyExists(myCollection as collection, sKey as string) as Boolean 
    on error goto handleerror: 

    dim val as variant 

    val = myCollection(sKey) 
    keyExists = true 
    exit sub 
handleerror: 
    keyExists = false 
end function 
22

@Mark Biek आपका keyExists बारीकी से मेरी मानक मौजूद है() फ़ंक्शन मेल खाता है। कक्षा को COM-खुला संग्रहों के लिए और अधिक उपयोगी बनाने के लिए और संख्यात्मक अनुक्रमणिका की जांच करने के लिए, मैं टाइप करने के लिए sKey और myCollection को बदलने की अनुशंसा करता हूं। यदि ऑब्जेक्ट्स के संग्रह के साथ फ़ंक्शन का उपयोग किया जा रहा है, तो 'सेट' आवश्यक है (उस लाइन पर जहां वैल सेट है)।

संपादित करें: यह मुझे परेशान कर रहा था कि मैंने कभी ऑब्जेक्ट-आधारित और मूल्य-आधारित मौजूद() फ़ंक्शन के लिए अलग-अलग आवश्यकताओं को नहीं देखा है। मैं बहुत ही कम वस्तुओं के लिए संग्रह का उपयोग करता हूं, लेकिन यह एक बग के लिए इतनी सही बाधा लगती है कि जब मुझे अस्तित्व की जांच करने की आवश्यकता होती है तो ट्रैक करना इतना मुश्किल होगा। चूंकि त्रुटि प्रबंधन विफल हो जाएगा यदि कोई त्रुटि हैंडलर पहले से सक्रिय है, तो एक नया त्रुटि स्कोप प्राप्त करने के लिए दो फ़ंक्शंस की आवश्यकता होती है। केवल मौजूद है() फ़ंक्शन कभी कहा जाता है की जरूरत:

Public Function Exists(col, index) As Boolean 
On Error GoTo ExistsTryNonObject 
    Dim o As Object 

    Set o = col(index) 
    Exists = True 
    Exit Function 

ExistsTryNonObject: 
    Exists = ExistsNonObject(col, index) 
End Function 

Private Function ExistsNonObject(col, index) As Boolean 
On Error GoTo ExistsNonObjectErrorHandler 
    Dim v As Variant 

    v = col(index) 
    ExistsNonObject = True 
    Exit Function 

ExistsNonObjectErrorHandler: 
    ExistsNonObject = False 
End Function 

और कार्यक्षमता को सत्यापित करने के लिए:

Public Sub TestExists() 
    Dim c As New Collection 

    Dim b As New Class1 

    c.Add "a string", "a" 
    c.Add b, "b" 

    Debug.Print "a", Exists(c, "a") ' True ' 
    Debug.Print "b", Exists(c, "b") ' True ' 
    Debug.Print "c", Exists(c, "c") ' False ' 
    Debug.Print 1, Exists(c, 1) ' True ' 
    Debug.Print 2, Exists(c, 2) ' True ' 
    Debug.Print 3, Exists(c, 3) ' False ' 
End Sub 
+1

इस समस्या से बचने के लिए, यह काम हिस्सा छोड़ बेहतर है, कि है, निर्देश ओ = col (इंडेक्स) या वी = col (इंडेक्स) और चर घोषणा सेट ड्रॉप, और बस col लिखें। आइटम इंडेक्स, जो ऑब्जेक्ट्स और सरल मानों के साथ समान कार्य करता है। – Clon

+1

अब मुझे लगता है कि यह पहले से ही ईसाई हैटर – Clon

5

के रूप में थॉमस ने कहा, आप Let के बजाय एक वस्तु सेट की जरूरत है। यहाँ मेरी लाइब्रेरी से एक सामान्य समारोह है कि मूल्य और वस्तु प्रकार के लिए काम करता है:

Public Function Exists(ByVal key As Variant, ByRef col As Collection) As Boolean 

'Returns True if item with key exists in collection 

On Error Resume Next 

Const ERR_OBJECT_TYPE As Long = 438 
Dim item As Variant 

'Try reach item by key 
item = col.item(key) 

'If no error occurred, key exists 
If Err.Number = 0 Then 
    Exists = True 

'In cases where error 438 is thrown, it is likely that 
'the item does exist, but is an object that cannot be Let 
ElseIf Err.Number = ERR_OBJECT_TYPE Then 

    'Try reach object by key 
    Set item = col.item(key) 

    'If an object was found, the key exists 
    If Not item Is Nothing Then 
     Exists = True 
    End If 

End If 

Err.Clear 

End Function 

के रूप में भी थॉमस ने सलाह दी, तो आप इस सामान्यीकरण करने के लिए वस्तु के संग्रह प्रकार बदल सकते हैं। Item (कुंजी) वाक्यविन्यास अधिकांश संग्रह वर्गों द्वारा साझा किया जाता है, ताकि वास्तव में उपयोगी हो।

संपादित करें ऐसा लगता है कि मुझे कुछ हद तक थॉमस द्वारा पेंच पर पीटा गया था। हालांकि आसान पुन: उपयोग के लिए मैं व्यक्तिगत रूप से एक एकल कार्य को प्राथमिकता देता हूं जिसमें निजी निर्भरता नहीं होती है।

3

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

+0

द्वारा प्रदर्शित किया गया था यह सही नहीं है: आप किसी भी प्रकार की ऑब्जेक्ट/वैल्यू को डिक्टियोनियन https://msdn.microsoft.com/en-us/library/x4k5wbx4%28v= में स्टोर कर सकते हैं बनाम.84% 29.aspx "आइटम डेटा का कोई भी रूप हो सकता है" – Clon

+0

एक साधारण शब्दकोश पर्याप्त है जब आप चाहते हैं कि एक कुंजी के साथ कई मूल्य/वस्तुओं को स्टोर करना है, और जांचें कि शब्दकोश में कोई कुंजी मौजूद है या नहीं। यदि आप यह सुनिश्चित करना चाहते हैं कि डिक्शनरी में केवल कुछ प्रकार का डेटा है, तो आपको शब्दकोश को किसी ऑब्जेक्ट में लपेटना होगा और इसकी गुणधर्मों और विधियों को वैयक्तिकृत करना होगा। यह अन्य प्रतिक्रियाओं में दिए गए संग्रह ऑब्जेक्ट और मौजूद() विधि के साथ भी किया जा सकता है। https://msdn.microsoft.com/en-us/library/aa262338%28v=vs.60%29.aspx – Clon

2

बेहतर समाधान TryGet फ़ंक्शन लिखना होगा। आप जिस समय जांचने जा रहे हैं, और फिर आइटम प्राप्त करना है। एक ही समय में इसे करके समय बचाएं।

public Function TryGet(key as string, col as collection) as Variant 
    on error goto errhandler 
    Set TryGet= col(key) 
    exit function 
errhandler: 
    Set TryGet = nothing 
end function 
2

http://www.visualbasic.happycodings.com/Other/code10.html देखने के कार्यान्वयन यहाँ भी वैकल्पिक पाया तत्व लौटने का लाभ दिया है, और (टिप्पणियों के अनुसार) वस्तु/देशी प्रकार के साथ काम करता है।

यहाँ reproduced के बाद से लिंक अब उपलब्ध नहीं है:

अगर एक आइटम एक संग्रह

में मौजूद निम्न कोड दिखाता है कि निर्धारित करने के लिए एक आइटम एक संग्रह के भीतर मौजूद है निर्धारित करें।

Option Explicit 

'Purpose  : Determines if an item already exists in a collection 
'Inputs  : oCollection   The collection to test for the existance of the item 
'    vIndex    The index of the item. 
'    [vItem]    See Outputs 
'Outputs  : Returns True if the item already exists in the collection. 
'    [vItem] The value of the item, if it exists, else returns "empty". 
'Notes  : 
'Example  : 

Function CollectionItemExists(vIndex As Variant, oCollection As Collection, Optional vItem As Variant) As Boolean 
    On Error GoTo ErrNotExist 

    'Clear output result 
    If IsObject(vItem) Then 
     Set vItem = Nothing 
    Else 
     vItem = Empty 
    End If 

    If VarType(vIndex) = vbString Then 
     'Test if item exists 
     If VarType(oCollection.Item(CStr(vIndex))) = vbObject Then 
      'Return an object 
      Set vItem = oCollection.Item(CStr(vIndex)) 
     Else 
      'Return an standard variable 
      vItem = oCollection.Item(CStr(vIndex)) 
     End If 
    Else 
     'Test if item exists 
     If VarType(oCollection.Item(Int(vIndex))) = vbObject Then 
      'Return an object 
      Set vItem = oCollection.Item(Int(vIndex)) 
     Else 
      'Return an standard variable 
      vItem = oCollection.Item(Int(vIndex)) 
     End If 
    End If 
    'Return success 
    CollectionItemExists = True 
    Exit Function 
ErrNotExist: 
    CollectionItemExists = False 
    On Error GoTo 0 
End Function 

'Demonstration routine 
Sub Test() 
    Dim oColl As New Collection, oValue As Variant 

    oColl.Add "red1", "KEYA" 
    oColl.Add "red2", "KEYB" 
    'Return the two items in the collection 
    Debug.Print CollectionItemExists("KEYA", oColl, oValue) 
    Debug.Print "Returned: " & oValue 
    Debug.Print "-----------" 
    Debug.Print CollectionItemExists(2, oColl, oValue) 
    Debug.Print "Returned: " & oValue 
    'Should fail 
    Debug.Print CollectionItemExists("KEYC", oColl, oValue) 
    Debug.Print "Returned: " & oValue 
    Set oColl = Nothing 
End Sub 
24

मेरे मानक समारोह बहुत सरल है। यह तत्व प्रकार के बावजूद काम करेगा, क्योंकि यह किसी भी असाइनमेंट को परेशान नहीं करता है, यह केवल संग्रह संपत्ति को निष्पादित करता है।

Public Function Exists(ByVal oCol As Collection, ByVal vKey As Variant) As Boolean 

    On Error Resume Next 
    oCol.Item vKey 
    Exists = (Err.Number = 0) 
    Err.Clear 

End Function 
+1

संक्षिप्त, तेज़ और प्रभावी। +1 बिंदु – Clon

+0

स्वच्छ, संक्षिप्त और चालाक! धन्यवाद –

+0

सुरुचिपूर्ण। यह अच्छा तर्क है। +1। – Alex

3

कथन "एरर हैंडलर पहले से सक्रिय होने पर त्रुटि प्रबंधन विफल हो जाएगा" केवल आंशिक रूप से सही है।

आपके पास अपने दिनचर्या में कई त्रुटि हैंडलर हो सकते हैं।
तो, कोई एक ही कार्यक्षमता को केवल एक समारोह में समायोजित कर सकता है।
बस इस तरह अपने कोड को फिर से लिखने:

Public Function Exists(col, index) As Boolean 
Dim v As Variant 

TryObject: 
    On Error GoTo ExistsTryObject 
     Set v = col(index) 
     Exists = True 
     Exit Function 

TryNonObject: 
    On Error GoTo ExistsTryNonObject 

     v = col(index) 
     Exists = True 
     Exit Function 

ExistsTryObject: 
    ' This will reset your Err Handler 
    Resume TryNonObject 

ExistsTryNonObject: 
     Exists = False 
End Function 

हालांकि, अगर आप केवल दिनचर्या के TryNonObject अनुभाग में कोड शामिल करने के लिए थे, यह वही जानकारी प्राप्त करेगी।
यह ऑब्जेक्ट्स और गैर-ऑब्जेक्ट्स दोनों के लिए सफल होगा। यह गैर-ऑब्जेक्ट्स के लिए आपके कोड को तेज़ी से बढ़ाएगा, क्योंकि आपको केवल एक ही कथन करना होगा ताकि यह सुनिश्चित किया जा सके कि आइटम संग्रह में मौजूद है।

0

इस तरह के एक समारोह की तलाश करते हुए मैंने इसे निम्नलिखित के रूप में डिजाइन किया। यह नए चर निर्दिष्ट किए बिना ऑब्जेक्ट्स और गैर-ऑब्जेक्ट्स के साथ काम करना चाहिए।

Public Function Exists(ByRef Col As Collection, ByVal Key) As Boolean 
    On Error GoTo KeyError 
    If Not Col(Key) Is Nothing Then 
     Exists = True 
    Else 
     Exists = False 
    End If 

    Exit Function 
KeyError: 
    Err.Clear 
    Exists = False 
End Function 
संबंधित मुद्दे