2012-04-15 26 views
6

मेरा प्रश्न बहुत आसान है। मैं एक TList (queue कहा जाता है) वर्ग CNotif की वस्तुओं से युक्त है और उन वस्तुओं पर विधि is_alive उपयोग करना चाहते हैं।किसी TList में संग्रहीत ऑब्जेक्ट की विधि का उपयोग कैसे करें?

समस्या यह है कि, जब मैं queue.Items[0].is_alive() का उपयोग करता हूं, तो मुझे Error: Illegal qualifier कहने में एक त्रुटि संदेश मिलता है।

मैं भी तरह से मैं इस TList में वस्तुओं का दृष्टांत कर सकते हैं (और कैसे रास्ता संकलक "जानता" है कि वस्तुओं संग्रहीत इसी प्रकार के हैं ...)

क्या अब मैं क्या है के साथ भ्रमित कर रहा हूँ : queue.Add(CNotif.create(timer, title, text, badge)) लेकिन मुझे नहीं लगता कि यह इस तरह से किया जाना चाहिए।

अग्रिम धन्यवाद!

+4

बस एक sidenote। वहाँ, जैसे '' TLama' Lama' के प्रकार है, एक अलिखित सम्मेलन पहले चार 'T' साथ प्रकार नाम के लिए है, इसलिए आपके मामले के लिए यह' होगा TCNotif' ;-) – TLama

+0

नहीं यह वर्ग सी है और "मूल" प्रकारों के लिए टी (जैसे सरणी या रिकॉर्ड)? – halflings

+0

नहीं, यह कक्षाओं, अभिलेखों, गणनाओं आदि सहित सभी 'टी 'प्रकारों के लिए है। आइए आपके कोड के' प्रकार 'अनुभाग में मौजूद सभी चीज़ों के लिए कहें। – TLama

उत्तर

10

The problem is, when I use queue.Items[0].is_alive(), I get an error message saying Error: Illegal qualifier.

है ऐसा इसलिए है क्योंकि संकलक पता नहीं क्या queue.items[0] एक सामान्य सूचक के अलावा अन्य है (नीचे देखें)।

What I do now is: queue.Add(CNotif.create(timer, title, text, badge)) but I don't think it's supposed to be done that way.

यह वही तरीका है जिसकी आपको आवश्यकता है। CNotif.Create एक नई वस्तु बनाता है, और वह वस्तु TObject से निकलती है। यह ठीक संकलित क्योंकि आपके queue.Add कॉल एक सूचक की उम्मीद कर रहा है, और एक डेल्फी/FreePascal चर एक वस्तु उदाहरण युक्त वास्तव में एक सूचक है। (दोनों भाषाओं हमारे लिए MyObj^ का उपयोग कर भिन्नता की जरूरत को छिपाने।)

queue.Items में कुछ का उपयोग करने के लिए आपको से संकलक क्या है यह बताने के लिए कि वहां दूसरे की जरूरत है एक सामान्य pointer (बेशक एक is_alive विधि नहीं है जो) । आपको बस इतना है कि typecasting द्वारा:

CNotif(queue.Items[0]).is_alive 

नोट: वहाँ TList.Items उपयोग करने के लिए एक छोटा रास्ता नहीं है; ItemsTList के लिए डिफ़ॉल्ट संपत्ति के रूप में घोषित किया जाता है, ताकि आप इसे छोड़ सकते हैं:

queue[0] 

रूप

queue.Items[0] 

एक ही है और भी बहुत कुछ टाइप करने के लिए आसान है।

+0

महान जवाब! :) बहुत धन्यवाद। 'TList' की – halflings

+3

सदस्य' TObject' लेकिन सूचक नहीं हैं। – NGLN

+0

अच्छा बिंदु। :) मेरी गलती; बहुत जल्दी लिखा और 'TObjectList' सोच रहा होगा। मैं इसे सही कर दूंगा। धन्यवाद। :) –

6

जब तक आप एक पुराने डेल्फी संस्करण के साथ फंस रहे हैं, आप जेनरिक ध्यान देना चाहिए।

generics.collection इकाई में एक TList<T> वर्ग है कि आप यहाँ इस्तेमाल कर सकते हैं नहीं है।

Queue:TList<CNotify>; 

... 
Begin 
    Queue := TList<CNotify>.Create; // remember to clean it up 
    Queue.Add(CNotify.Create(...)); 
    Queue.Add(CNotify.Create(...)); 

    If Queue[0].isAlive then 
    Beep; 
End; 

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

+2

+1, लेकिन क्योंकि वहाँ विशेष रूप से 'TList' साथ D2009 में कई समस्याएं थीं यह D2010 + से उल्लेख करने के लिए अच्छा हो सकता है। लेकिन आप यह भी डेल्फी मोड जो डेल्फी वाक्य रचना (कम से कम 2.6 के बाद से) है उपयोग कर सकते हैं - – TLama

+4

पांचवें वेतन आयोग ObjFPC मोड में, वाक्य रचना 'प्रकार TQueue = विशेषज्ञ TFPGList ' है। – lukstafi