डेल्फी की लिस्टबॉक्स में एक स्ट्रिंग के साथ एक स्ट्रिंग स्टोर करें

डेल्फी के TListBox और TComboBox आइटम की एक सूची प्रदर्शित करते हैं - एक "चयन" सूची में तार। TListBox एक स्क्रॉल करने योग्य सूची प्रदर्शित करता है, TComboBox एक ड्रॉप-डाउन सूची प्रदर्शित करता है।

उपरोक्त सभी नियंत्रणों के लिए एक सामान्य संपत्ति है आइटम संपत्ति। आइटम स्ट्रिंग की एक सूची को परिभाषित करते हैं जो उपयोगकर्ता को नियंत्रण में दिखाई देगा। डिज़ाइन-टाइम पर, जब आप आइटम गुण को डबल-क्लिक करते हैं, तो "स्ट्रिंग सूची संपादक" आपको स्ट्रिंग आइटम निर्दिष्ट करने देता है। आइटम गुण वास्तव में एक TStrings प्रकार के वंशज हैं।

एक सूची बॉक्स में प्रति आइटम दो स्ट्रिंग्स?

ऐसी स्थितियाँ हैं जब आप प्रदर्शित करना चाहते हैं तार की सूची उपयोगकर्ता के लिए, सूची बॉक्स नियंत्रण में उदाहरण के लिए, लेकिन यह भी एक रास्ता है उपयोगकर्ता को प्रदर्शित एक के साथ एक और अतिरिक्त स्ट्रिंग स्टोर करें.

क्या अधिक है, आप स्ट्रिंग को केवल "सादे" स्ट्रिंग से अधिक स्टोर / संलग्न कर सकते हैं, जिसे आप करना चाहते हैं वस्तु (स्ट्रिंग) के लिए एक वस्तु संलग्न करें.

सूची बाक्स। आइटम - TStrings "जानता है" ऑब्जेक्ट!

TStrings ऑब्जेक्ट को हेल्प सिस्टम में एक और लुक दें। वहाँ है

instagram viewer
वस्तुओं संपत्ति जो वस्तुओं के एक समूह का प्रतिनिधित्व करती है जो प्रत्येक के साथ जुड़ी होती है तार स्ट्रिंग्स संपत्ति में - जहां स्ट्रिंग्स संपत्ति सूची में वास्तविक तारों का संदर्भ देती है।

यदि आप सूची बॉक्स में प्रत्येक स्ट्रिंग के लिए एक दूसरी स्ट्रिंग (या ऑब्जेक्ट) असाइन करना चाहते हैं, तो आपको रन-टाइम पर आइटम प्रॉपर्टी को पॉप्युलेट करना होगा।

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

सूची बाक्स। आइटम। AddObject विधि दो मापदंडों को स्वीकार करती है। पहला पैरामीटर, "आइटम" आइटम का पाठ है। दूसरा पैरामीटर, "AObject" वस्तु से जुड़ी वस्तु है।

ध्यान दें कि सूची बॉक्स को उजागर करता है सामान जोडें विधि जो आइटम के रूप में ही करता है। AddObject।

एक स्ट्रिंग के लिए दो स्ट्रिंग्स

चूंकि दोनों आइटम। AddObject और AddItem अपने दूसरे पैरामीटर के लिए टाइप टूबिज के एक वैरिएबल को स्वीकार करते हैं, जैसे एक लाइन:

// संकलन त्रुटि!
ListBox1.Items। AddObject ('ज़ारको', 'गजिक'); 

संकलित त्रुटि होगी: E2010 असंगत प्रकार: 'टोब्जेक्ट' और 'स्ट्रिंग'.

आप केवल ऑब्जेक्ट के लिए स्ट्रिंग की आपूर्ति नहीं कर सकते क्योंकि डेल्फी में Win32 स्ट्रिंग मान ऑब्जेक्ट नहीं हैं।

सूची बॉक्स आइटम के लिए एक दूसरे स्ट्रिंग को असाइन करने के लिए, आपको एक स्ट्रिंग चर को ऑब्जेक्ट में "बदलने" की आवश्यकता है - आपको कस्टम TString ऑब्जेक्ट की आवश्यकता है।

स्ट्रिंग के लिए एक पूर्णांक

यदि आपको स्ट्रिंग आइटम के साथ स्टोर करने के लिए आवश्यक दूसरा मान एक पूर्णांक मान है, तो आपको वास्तव में एक कस्टम इनइंटर वर्ग की आवश्यकता नहीं है।

 ListBox1.AddItem ('जार्को गजिक', टोबजेक्ट (1973)); 

ऊपर दी गई रेखा पूर्णांक संख्या "1973" को "जार्को गजिक" स्ट्रिंग के साथ संग्रहीत करती है।

किसी पूर्णांक से किसी ऑब्जेक्ट पर सीधा टाइपकास्ट ऊपर किया गया है। "AObject" पैरामीटर वास्तव में जोड़े गए ऑब्जेक्ट का 4-बाइट पॉइंटर (पता) है। चूंकि Win32 में एक पूर्णांक 4 बाइट्स पर कब्जा कर लेता है - इस तरह की हार्ड कास्ट संभव है।

स्ट्रिंग से जुड़े पूर्णांक को वापस पाने के लिए, आपको "ऑब्जेक्ट" को पूर्णांक मान पर वापस लाने की आवश्यकता है:

// वर्ष == 1973
वर्ष: = पूर्णांक (ListBox1.Items)। [ListBox1.Items ऑब्जेक्ट्स। IndexOf ('जरको गजिक')]); 

एक स्ट्रिंग के लिए डेल्फी नियंत्रण

यहाँ क्यों रुके? सूची बॉक्स में स्ट्रिंग के लिए स्ट्रिंग और पूर्णांक निर्दिष्ट करना, जैसा कि आपने अभी अनुभव किया है, केक का एक टुकड़ा।

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

निम्न कोड लिस्टबॉक्स 1 (सूची बॉक्स) के लिए एक बटन पर एक फार्म के संदर्भ के साथ-साथ एक फॉर्म पर सभी प्रपत्र (इस पर जगह के रूप में ऑनक्रीट ईवेंट हैंडलर) को नियंत्रित करता है।

वर idx: पूर्णांक; शुरूके लिये idx: = 0 सेवा -1 + कंपोनेंटकाउंट करशुरूअगर अवयव [IDX] है TButton फिर ListBox1.AddObject (TButton (घटक [आईडीएक्स])। कैप्शन, घटक [आईडीएक्स]); समाप्त; समाप्त; 

प्रोग्रामिक रूप से "दूसरा" बटन पर "क्लिक" करने के लिए, आप अगले कथन का उपयोग कर सकते हैं:

 TButton (ListBox1.Items)। । वस्तुओं [1]) पर क्लिक करें; 

मैं अपने कस्टम ऑब्जेक्ट्स को स्ट्रिंग आइटम पर असाइन करना चाहता हूं

अधिक सामान्य स्थिति में आप अपने स्वयं के कस्टम वर्गों के उदाहरणों (वस्तुओं) को जोड़ेंगे:

प्रकार तपस्वी = कक्षानिजी fName: स्ट्रिंग; fyear: पूर्णांक; जनतासंपत्ति नाम: स्ट्रिंग पढ़ा fName; संपत्ति वर्ष: पूर्णांक पढ़ना fYear; निर्माता सृजन करना(स्थिरांक नाम: तार; स्थिरांक वर्ष: पूर्णांक); समाप्त;... निर्माता TStudent। सृजन करना(स्थिरांक नाम: तार; स्थिरांक वर्ष: पूर्णांक); शुरू fName: = नाम; वर्ष: = वर्ष; समाप्त; शुरू// दो स्ट्रिंग / ऑब्जेक्ट्स -> छात्रों को सूची में जोड़ें ListBox1.AddItem ('जॉन', सामयिक। बनाएँ ('जॉन', 1970)); ListBox1.AddItem ('जैक', सामयिक। बनाएँ ('जैक', 1982)); // पहले छात्र को पकड़ो - जॉन छात्र: = ListBox1.Items। वस्तुओं [0] जैसा TStudent; // जॉन का वर्ष प्रदर्शित करें ShowMessage (IntToStr (छात्र) साल)); समाप्त; 

क्या आप बनाएँ आप मुफ्त चाहिए

यहाँ है कि मदद के लिए TStrings के वंशजों में वस्तुओं के बारे में क्या कहना है: TStrings ऑब्जेक्ट आपके द्वारा इस तरह से जोड़ने वाली वस्तुओं का स्वामी नहीं है। TStrings ऑब्जेक्ट में जोड़े गए ऑब्जेक्ट अभी भी मौजूद हैं, भले ही TStrings आवृत्ति नष्ट हो गई हो। उनको करना चाहिए स्पष्ट रूप से नष्ट हो गया आवेदन के द्वारा।

जब आप ऑब्जेक्ट्स को स्ट्रिंग्स में जोड़ते हैं - आपके द्वारा बनाई गई ऑब्जेक्ट - आपको यह सुनिश्चित करना होगा कि आप कब्जा की गई मेमोरी को मुक्त कर दें, या आपके पास ए स्मृति रिसाव

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

 FreeObjects (ListBox1.Items); 

नोट: आप केवल इस प्रक्रिया को कहते हैं जब आपके द्वारा बनाए गए स्ट्रिंग आइटम्स को असाइन की गई ऑब्जेक्ट्स।

instagram story viewer