VB.NET: एरर को नियंत्रित करने के लिए क्या हुआ

VB.NET से नियंत्रण सरणियों का चूक सरणियों के बारे में पढ़ाने वालों के लिए एक चुनौती है।

  • अब किसी नियंत्रण को कॉपी करना संभव नहीं है, जैसे कि टेक्स्टबॉक्स, और फिर कंट्रोल एरे बनाने के लिए इसे (एक बार या कई बार) पेस्ट करें।
  • एक नियंत्रण सरणी के समान एक संरचना बनाने के लिए VB.NET कोड, VB.NET पर सभी पुस्तकों में, जो मैंने खरीदा है और ऑनलाइन, बहुत लंबे और बहुत अधिक जटिल हैं। यह एक नियंत्रण सरणी कोडिंग की सादगी का अभाव है जो VB6 में पाया जाता है।

यदि आप VB6 संगतता पुस्तकालय का संदर्भ देते हैं, तो इसमें ऑब्जेक्ट हैं जो नियंत्रण सरणियों की तरह बहुत काम करते हैं। यह देखने के लिए कि मेरा क्या मतलब है, बस एक प्रोग्राम के साथ VB.NET अपग्रेड विज़ार्ड का उपयोग करें जिसमें एक नियंत्रण सरणी है। कोड फिर से बदसूरत है, लेकिन यह काम करता है। बुरी खबर यह है कि Microsoft गारंटी नहीं देगा कि संगतता घटकों का समर्थन जारी रहेगा, और आप उनका उपयोग करने वाले नहीं हैं।

"कंट्रोल एरे" बनाने और उपयोग करने के लिए VB.NET कोड बहुत अधिक लंबा और बहुत अधिक जटिल है।

Microsoft के अनुसार, VB 6 में आप जो कर सकते हैं, उसके करीब भी कुछ करने के लिए निर्माण की आवश्यकता है "सरल घटक जो नियंत्रण कार्यक्षमता को डुप्लिकेट करता है।"

instagram viewer

इसे दर्शाने के लिए आपको एक नया वर्ग और होस्टिंग फॉर्म दोनों चाहिए। वर्ग वास्तव में नए लेबल बनाता और नष्ट करता है। पूरा क्लास कोड इस प्रकार है:

पब्लिक क्लास लेबलअरे
इन्हेरिट्स सिस्टम। संग्रह। CollectionBase
निजी ReadOnly HostForm _ के रूप में
प्रणाली। खिड़कियाँ। फार्म। प्रपत्र
सार्वजनिक समारोह AddNewLabel () _
सिस्टम के रूप में। खिड़कियाँ। फार्म। लेबल
'लेबल वर्ग का एक नया उदाहरण बनाएँ।
नई प्रणाली के रूप में डिम एलाबेल। खिड़कियाँ। फार्म। लेबल
'लेबल को संग्रह में जोड़ें
'आंतरिक सूची।
मेरे। सूची। जोड़ें (एलाबेल)
'लेबल को नियंत्रण संग्रह में जोड़ें
HostForm फ़ील्ड द्वारा संदर्भित प्रपत्र का '।
HostForm। नियंत्रण। जोड़ें (एलाबेल)
'लेबल ऑब्जेक्ट के लिए इंटलियल गुण सेट करें।
एक लेबल। शीर्ष = गिनती * २५
एक लेबल। चौड़ाई = ५०
एक लेबल। वाम = १४०
एक लेबल। टैग = मुझे। गिनती
एक लेबल। पाठ = "लेबल" और मैं। गणना। तार
एलाब्ले लौटें
अंत समारोह
सार्वजनिक उप नया (_
सिस्टम के रूप में ByVal होस्ट। खिड़कियाँ। फार्म। प्रपत्र)
परिचारक = यजमान
मेरे। AddNewLabel ()
अंत उप
डिफ़ॉल्ट सार्वजनिक पढ़ें संपत्ति _
आइटम (पूर्णांक के रूप में बायल इंडेक्स)
प्रणाली। खिड़कियाँ। फार्म। लेबल
प्राप्त
वापसी CType (मुझे सूची।)। आइटम (सूचकांक), _
प्रणाली। खिड़कियाँ। फार्म। लेबल)
अंत मिलता है
अंतिम संपत्ति
सार्वजनिक उप निकालें ()
'यह सुनिश्चित करने के लिए जांचें कि हटाने के लिए कोई लेबल है।
यदि मैं। गिनती> 0 फिर
'सरणी में जोड़े गए अंतिम लेबल को हटा दें
'होस्ट फ़ॉर्म नियंत्रण संग्रह से।
'डिफ़ॉल्ट संपत्ति के उपयोग पर ध्यान दें
'सरणी तक पहुँचना।
HostForm। नियंत्रण। निकालें (मुझे (गणना। - 1))
मेरे। सूची। RemoveAt (मी। गणना - 1)
अगर अंत
अंत उप
एंड क्लास

यह बताने के लिए कि इस वर्ग कोड का उपयोग कैसे किया जाएगा, आप इसे बनाने वाले फ़ॉर्म को बना सकते हैं। आपको फॉर्म में नीचे दिखाए गए कोड का उपयोग करना होगा:

पब्लिक क्लास फॉर्म 1। इन्हेरिट्स सिस्टम। खिड़कियाँ। फार्म। प्रपत्र। # रीजन "विंडोज फॉर्म डिजाइनर उत्पन्न कोड" 'इसके अलावा आपको कथन जोड़ना होगा:' MyControlArray = नया लेबलअरे (मेरे) 'InitializeComponent () कॉल के बाद। 'छिपा हुआ क्षेत्र कोड। 'एक नया ButtonArray ऑब्जेक्ट घोषित करें। लेबल के रूप में मंद MyControlArray। निजी उप btnLabelAdd_Click (_ सिस्टम के रूप में ByVal प्रेषक। वस्तु, _। ByVal e As System। EventArgs) _। हैंडल btnLabelAdd। पर क्लिक करें। 'AddNewLabel पद्धति को कॉल करें। 'MyControlArray की। MyControlArray। AddNewLabel () 'BackColor संपत्ति बदलें। बटन के ०। MyControlArray (0) .BackColor = _। प्रणाली। चित्रकारी। रंग। लाल। अंत उप। निजी उप btnLabelRemove_Click (_ सिस्टम के रूप में ByVal प्रेषक। वस्तु, _। ByVal e As System। EventArgs) _। हैंडल btnLabelRemove। पर क्लिक करें। 'MyControlArray की निकालें विधि को कॉल करें। MyControlArray। हटाना() अंत उप। एंड क्लास

सबसे पहले, यह डिजाइन समय पर भी काम नहीं करता है जैसे हम VB 6 में करते थे! और दूसरा, वे एक सरणी में नहीं हैं, वे एक VB.NET संग्रह में हैं - एक सरणी से बहुत अलग चीज।

VB.NET VB 6 "नियंत्रण सरणी" का समर्थन नहीं करता है, इसका कारण यह है कि "नियंत्रण" "सरणी" (उद्धरण चिह्नों के परिवर्तन पर ध्यान दें) जैसी कोई चीज नहीं है। VB 6 दृश्यों के पीछे एक संग्रह बनाता है और इसे डेवलपर के लिए एक सरणी के रूप में प्रदर्शित करता है। लेकिन यह एक सरणी नहीं है और आईडीई के माध्यम से प्रदान किए गए कार्यों से परे आपका इस पर बहुत कम नियंत्रण है।

दूसरी ओर, VB.NET, इसे कहते हैं कि यह क्या है: वस्तुओं का एक संग्रह। और वे डेवलपर को डेवलपर को खुले में पूरी चीज़ बनाकर सौंप देते हैं।

एक प्रकार के फायदे के रूप में यह डेवलपर देता है, VB 6 में नियंत्रण एक ही प्रकार का होना था, और उन्हें एक ही नाम रखना था। चूंकि ये VB.NET में सिर्फ ऑब्जेक्ट हैं, आप उन्हें विभिन्न प्रकार के बना सकते हैं और उन्हें अलग-अलग नाम दे सकते हैं और अभी भी वस्तुओं के समान संग्रह में उन्हें प्रबंधित कर सकते हैं।

इस उदाहरण में, एक ही क्लिक ईवेंट दो बटन और एक चेकबॉक्स को संभालता है और प्रदर्शित करता है कि किस पर क्लिक किया गया था। VB 6 के साथ कोड की एक पंक्ति में ऐसा करें!

निजी उप मिश्रितकंट्रोल_क्लिक (_
सिस्टम के रूप में ByVal प्रेषक। वस्तु, _
ByVal e As System। EventArgs) _
बटन 1 बटन। क्लिक करें, _
Button2.Click, _
CheckBox1.Click
'नीचे दिए गए बयान में एक लंबा कथन होना चाहिए!
'इसे संकरा रखने के लिए यहां चार लाइनें हैं
'एक वेब पेज पर फिट होने के लिए पर्याप्त है
लेबल 2। पाठ =
माइक्रोसॉफ्ट। मूल दृश्य। राइट (प्रेषक)। GetType। तार,
लेन (प्रेषक)। GetType। तार) -
(InStr (प्रेषक) GetType। ToString, "फ़ॉर्म") + 5))
अंत उप

सबस्ट्रिंग गणना जटिल है, लेकिन यह वास्तव में वैसा नहीं है जैसा हम यहां बता रहे हैं। क्लिक इवेंट में आप कुछ भी कर सकते हैं। उदाहरण के लिए, यदि आप नियंत्रण के प्रकार का उपयोग करते हैं, तो अलग-अलग नियंत्रणों के लिए अलग-अलग चीजें करने के लिए एक कथन में।

फ्रैंक का कम्प्यूटिंग अध्ययन समूह एरेस पर प्रतिक्रिया

फ्रैंक के अध्ययन समूह ने एक उदाहरण प्रदान किया जिसमें 4 लेबल और 2 बटन हैं। बटन 1 लेबल साफ़ करता है और बटन 2 उन्हें भरता है। फ्रैंक के मूल प्रश्न को फिर से पढ़ना और यह ध्यान देना अच्छा है कि उन्होंने जिस उदाहरण का उपयोग किया था वह एक लूप था जिसका उपयोग लेबल घटकों की एक सरणी के कैप्शन गुण को साफ़ करने के लिए किया जाता है। यहाँ VB.NET उस VB 6 कोड के बराबर है। यह कोड वही करता है जो फ्रैंक ने मूल रूप से मांगा था!

पब्लिक क्लास फॉर्म 1। इन्हेरिट्स सिस्टम। खिड़कियाँ। फार्म। प्रपत्र। # रीजन "विंडोज फॉर्म डिजाइनर उत्पन्न कोड" मंद लेबलअरे (4) लेबल के रूप में। 'लेबल की एक सरणी घोषित करें। निजी उप प्रपत्र 1 सिस्टम के रूप में ByVal प्रेषक। वस्तु, _। ByVal e As System। EventArgs) _। MyBase को हैंडल करता है। भार। SetControlArray () अंत उप। उप SetControlArray () लेबलअरे (1) = लेबल 1। लेबलअरे (2) = लेबल 2। लेबलअरे (3) = लेबल 3। लेबलअरे (4) = लेबल 4। अंत उप। निजी उप बटन1_क्लिक करें (_ सिस्टम के रूप में ByVal प्रेषक। वस्तु, _। ByVal e As System। EventArgs) _। बटन 1 बटन। क्लिक करें। 'बटन 1 स्पष्ट सरणी। डिम ए अस इंटीजर। एक = 1 से 4 के लिए। लेबलअरे (a) .Text = " आगे। अंत उप। निजी उप बटन 2_क्लिक करें (_ सिस्टम के रूप में ByVal प्रेषक। वस्तु, _। ByVal e As System। EventArgs) _। बटन 2 पर क्लिक करें। क्लिक करें। 'बटन 2 एरियर भरें। डिम ए अस इंटीजर। एक = 1 से 4 के लिए। लेबलअरे (a) .Text = _। "नियंत्रण सरणी" और CStr (ए) आगे। अंत उप। एंड क्लास

यदि आप इस कोड के साथ प्रयोग करते हैं, तो आपको पता चलेगा कि लेबल के गुणों को स्थापित करने के अलावा, आप विधियों को भी कॉल कर सकते हैं। तो मैं (और Microsoft) लेख के भाग I में "बदसूरत" कोड बनाने के लिए सभी परेशानी में क्यों गया?

मुझे असहमत होना होगा कि यह वास्तव में क्लासिक वीबी अर्थ में "कंट्रोल एरे" है। VB 6 कंट्रोल ऐरे VB 6 सिंटैक्स का एक समर्थित हिस्सा है, न कि केवल एक तकनीक। वास्तव में, शायद इस उदाहरण का वर्णन करने का तरीका यह है कि यह नियंत्रण सरणी है, न कि नियंत्रण सरणी।

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

क्लासिक VB 6 नियंत्रण सरणी उदाहरण वही है जो VB .NET कोड में लागू किया गया है। यहाँ VB 6 कोड में (यह मेज़िक और हिलियर से लिया गया है, विजुअल बेसिक 6 प्रमाणन परीक्षा गाइड, पी 206 - थोड़ा संशोधित, किताब में उदाहरण के बाद से नियंत्रण में परिणाम है कि नहीं देखा जा सकता है):

मंद MyTextBox VB.TextBox के रूप में। इंटेगर के रूप में स्टेटिक इंटनंबर। intNumber = intNumber + 1। MyTextBox = _ सेट करें। मेरे। नियंत्रण। जोड़ें ("VB.TextBox", _ "पाठ" और intNumber) MyTextBox। पाठ = MyTextBox। नाम। MyTextBox। दृश्यमान = सत्य। MyTextBox। वाम = _। (intNumber - 1) * 1200

लेकिन जैसा कि Microsoft (और I) सहमत हैं, VB.NET में VB 6 नियंत्रण सरणियाँ संभव नहीं हैं। तो आप जो सबसे अच्छा कर सकते हैं वह कार्यक्षमता की नकल है। मेरे लेख ने मेजिक और हिलियर उदाहरण में पाई गई कार्यक्षमता को दोहराया। स्टडी ग्रुप कोड गुणों और कॉल विधियों को सेट करने में सक्षम होने की कार्यक्षमता को दोहराता है।

तो लब्बोलुआब यह है कि यह वास्तव में आप क्या करना चाहते हैं पर निर्भर करता है। VB.NET के पास भाषा के भाग के रूप में लिपटी हुई पूरी चीज़ नहीं है - फिर भी - लेकिन अंततः यह कहीं अधिक लचीली है।

जॉन फ़ैनन की टेक ऑन अर्रेज़

जॉन ने लिखा: मुझे नियंत्रण सरणियों की आवश्यकता थी क्योंकि मैं रन समय में एक फॉर्म पर संख्याओं की एक सरल तालिका रखना चाहता था। मैं उन सभी को व्यक्तिगत रूप से रखने की मतली नहीं चाहता था और मैं VB.NET का उपयोग करना चाहता था। Microsoft एक साधारण समस्या के लिए एक बहुत विस्तृत समाधान प्रदान करता है, लेकिन यह एक बहुत ही छोटा अखरोट को तोड़ने के लिए एक बहुत बड़ा स्लेजहैमर है। कुछ प्रयोग के बाद, मैं अंततः एक समाधान पर मारा। यहाँ है कि मैं यह कैसे किया।

ऊपर दिए गए Visual Basic उदाहरण के बारे में दिखाता है कि आप एक उदाहरण बनाकर किसी फॉर्म पर एक टेक्स्टबॉक्स कैसे बना सकते हैं ऑब्जेक्ट का गुण सेट करना, और उसे नियंत्रण संग्रह में जोड़ना जो फॉर्म का हिस्सा है वस्तु।

नए टेक्स्टबॉक्स के रूप में डिम txtDataShow
txtDataShow। ऊँचाई = १ ९
txtDataShow। चौड़ाई = 80
txtDataShow। स्थान = नया बिंदु (X, Y)
मेरे। नियंत्रण। जोड़ें (txtDataShow)
हालाँकि Microsoft समाधान एक वर्ग बनाता है, मैंने तर्क दिया कि इसके बजाय यह सब सबरूटीन में लपेटना संभव होगा। हर बार जब आप इस सबरूटिन को कॉल करते हैं तो आप प्रपत्र पर टेक्स्टबॉक्स का एक नया उदाहरण बनाते हैं। यहाँ पूरा कोड है:

पब्लिक क्लास फॉर्म 1
इन्हेरिट्स सिस्टम। खिड़कियाँ। फार्म। प्रपत्र

# रीजन "विंडोज फॉर्म डिजाइनर उत्पन्न कोड"

निजी उप BtnStart_Click (_
सिस्टम के रूप में ByVal प्रेषक। वस्तु, _
ByVal e As System। EventArgs) _
बीटीएनस्टार्ट संभालती है। क्लिक करें

डिम आई अस इंटेगर
स्ट्रिंग के रूप में डिम sData
I = 1 से 5 के लिए
sData = CStr (I)
AddDataShow (sData, I) को कॉल करें
आगे
अंत उप
उप AddDataShow (_
स्ट्रिंग के रूप में ByVal sText, _
ByVal I As Integer)

नए टेक्स्टबॉक्स के रूप में डिम txtDataShow
डिम यूजरलैफ्ट, यूजरटॉग अस इंटेगर
डिम एक्स, वाई अस इंटेगर
UserLft = 20
UserTop = 20
txtDataShow। ऊँचाई = १ ९
txtDataShow। चौड़ाई = 25
txtDataShow। TextAlign = _
क्षैतिज संरेखण। केंद्र
txtDataShow। सीमा = _
झालर की शैली। FixedSingle
txtDataShow। पाठ = sText
एक्स = यूजरलैट
Y = UserTop + (I - 1) * txtDataShow। ऊंचाई
txtDataShow। स्थान = नया बिंदु (X, Y)
मेरे। नियंत्रण। जोड़ें (txtDataShow)
अंत उप
एंड क्लास
बहुत अच्छी बात है, जॉन। यह निश्चित रूप से Microsoft कोड की तुलना में बहुत अधिक सरल है... इसलिए मुझे आश्चर्य है कि उन्होंने ऐसा करने के लिए जोर क्यों दिया?

हमारी जांच शुरू करने के लिए, आइए कोड में एक संपत्ति असाइनमेंट को बदलने का प्रयास करें। चलो बदलो

txtDataShow। ऊँचाई = १ ९
सेवा

txtDataShow। ऊँचाई = १००
बस यह सुनिश्चित करने के लिए कि ध्यान देने योग्य अंतर है।

जब हम फिर से कोड चलाते हैं, तो हमें मिलता है... Whaaaat??? ... वही चीज़। कोई बदलाव नहीं। वास्तव में, आप मान को MsgBox (txtDataShow) की तरह प्रदर्शित कर सकते हैं। ऊँचाई) और आपको अभी भी संपत्ति के मूल्य के रूप में 20 प्राप्त होते हैं, चाहे आप इसे क्या भी सौंपें। ऐसा क्यों होता है?

इसका उत्तर यह है कि हम वस्तुओं को बनाने के लिए अपने स्वयं के वर्ग को प्राप्त नहीं कर रहे हैं, हम सिर्फ दूसरी कक्षा में चीजों को जोड़ रहे हैं ताकि हमें अन्य वर्ग के नियमों का पालन करना पड़े। और उन नियमों में कहा गया है कि आप ऊँचाई की संपत्ति को नहीं बदल सकते। (Wellllll... आप ऐसा कर सकते हैं। अगर आप मल्टीलाइन प्रॉपर्टी को ट्रू में बदलते हैं, तो आप हाइट बदल सकते हैं।)

क्यों VB.NET आगे बढ़ता है और कोड को बिना फुसफुसाए भी निष्पादित करता है कि जब कुछ गलत हो सकता है, तो वास्तव में, यह पूरी तरह से आपके बयान की अवहेलना करता है एक पूरी 'nother पकड़ती है। मैं संकलन में कम से कम एक चेतावनी का सुझाव दे सकता हूं। (संकेत! संकेत! संकेत! क्या Microsoft सुन रहा है?)

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

यह सरल उदाहरण दिखाता है कि, हालांकि हम वस्तुओं को दूसरे वर्ग में जोड़ सकते हैं (और कभी-कभी यह सही काम है), वस्तुओं पर प्रोग्रामिंग नियंत्रण आवश्यकता है कि हम उन्हें एक कक्षा और सबसे संगठित तरीके से प्राप्त करें (मैं कहता हूँ, ".NET तरीका" ??) नए व्युत्पन्न वर्ग में गुण और तरीके बनाने के लिए है बातें। जॉन पहली बार में निर्विरोध रहे। उन्होंने कहा कि उनका नया दृष्टिकोण उनके उद्देश्य के अनुरूप है, हालांकि "सीओओ" (सही ढंग से ऑब्जेक्ट ओरिएंटेड) नहीं होने की सीमाएं हैं। हाल ही में, हालांकि, जॉन ने लिखा,

"... रनटाइम में 5 टेक्स्टबॉक्स का एक सेट लिखने के बाद, मैं प्रोग्राम के बाद के हिस्से में डेटा को अपडेट करना चाहता था - लेकिन कुछ भी नहीं बदला - मूल डेटा अभी भी था।

मैंने पाया कि मैं पुराने बक्सों को उतारने के लिए कोड लिखकर और नए डेटा के साथ उन्हें फिर से डालकर समस्या को गोल कर सकता हूं। यह करने के लिए एक बेहतर तरीका मुझे का उपयोग करना होगा। ताज़ा करें। लेकिन इस समस्या ने टेक्स्टबॉक्स को घटाने के साथ-साथ उन्हें जोड़ने के लिए एक विधि की आपूर्ति करने की आवश्यकता पर मेरा ध्यान आकर्षित किया है। "

जॉन के कोड ने एक ग्लोबल वैरिएबल का इस्तेमाल किया, ताकि यह पता चले कि कितने तरीके के साथ कितने नियंत्रण जोड़े गए हैं ...

निजी उप Form1_Load (_
सिस्टम के रूप में ByVal प्रेषक। वस्तु, _
ByVal e As System। EventArgs) _
MyBase को हैंडल करता है। भार
CntlCnt0 = मुझे। नियंत्रण। गिनती
अंत उप

फिर "अंतिम" नियंत्रण हटाया जा सकता है ...

एन = मुझे। नियंत्रण। गिनती - १
मेरे। नियंत्रण। RemoveAt (N)
जॉन ने कहा कि, "शायद यह थोड़ा अनाड़ी है।"

यह जिस तरह से Microsoft ऊपर और उनके "बदसूरत" उदाहरण कोड में वस्तुओं का ट्रैक रखता है।

मैं अब रन टाइम में एक फॉर्म पर गतिशील रूप से नियंत्रण बनाने की समस्या पर लौट आया हूं और मैं 'व्हाट हैप्पेंड टू कंट्रोल एरर्स' लेखों को फिर से देख रहा हूं।

मैंने कक्षाएं बना ली हैं और अब फॉर्म पर नियंत्रण को उस तरीके से रख सकता हूं जिस तरह से मैं उन्हें चाहता हूं।

जॉन ने प्रदर्शित किया कि नई कक्षाओं का उपयोग करने वाले समूह बॉक्स में नियंत्रणों की नियुक्ति को कैसे नियंत्रित किया जाए। हो सकता है कि Microsoft ने अपने "बदसूरत" समाधान के बाद इसे ठीक कर दिया था!

instagram story viewer