2012-10-22 9 views
5

मेरे पास this जैसा है, लेकिन डेल्फी में एक प्रश्न है।दो अंतर-जुड़े वर्गों की घोषणा कैसे करें?

type 
    TThreadPopulator = class(TThread) 
    private 
    _owner:TASyncPopulator; //Undeclared identifier 
    end; 

type 
    TAsyncPopulator = class 
    private 
    _updater: TThreadPopulator; 
    end; 

उल्लेख प्रश्न का समाधान करने के लिए डेल्फी

+10

उचित प्रलेखन यहाँ है: http://docwiki.embarcadero.com/RADStudio/XE2/en/Classes_and_Objects# Forward_Declarations_and_Mutually_Dependent_Classes –

उत्तर

12

मदद की Forward Declarations and Mutually Dependent Classes दस्तावेज़ देखें।

type (* start type section - one unified section "to rule them all" *) 
    TAsyncPopulator = class; (* forward declaration *) 

    TThreadPopulator = class(TThread) 
    private 
    _owner:TASyncPopulator; 
    end; 

    TAsyncPopulator = class (* final declaration - WITHIN that very section where forward declaration was made *) 
    private 
    _updater: TThreadPopulator; 
    end; 

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

+0

पर आपके सटीक डेल्फी संस्करण के लिए टैग डालने के लिए उचित विचार है, यह त्रुटि देता है [डीसीसी त्रुटि] Populator.pas (12): E2086 टाइप 'TAsyncPopulator' अभी तक पूरी तरह परिभाषित नहीं है। मैं डेल्फी XE2 –

+0

का उपयोग कर रहा हूं क्या आप सचमुच इस कोड का उपयोग अपने आप से बचे हुए बिना करते हैं? यही वह पैटर्न है जिसका उपयोग आप लगभग हर वीसीएल इकाई जैसे कंट्रोल, फॉर्म इत्यादि में कर सकते हैं –

+2

यह कोड XE2 अपडेट 4 हॉटफिक्स 1 में संकलित करता है। आप कोड किसी भी तरह से भिन्न हैं - इसे ध्यान से जांचें। अधिकांशतः आप एक प्रकार के अनुभाग को बंद करते हैं और एक और प्रकार के अनुभाग-मार्ग को बहुत जल्दी शुरू करते हैं। अग्रेषित घोषणाएं और अंतिम लोग अलग-अलग वर्गों में नहीं जा सकते हैं। मुझे लगता है कि आपने मेरा पुराना कोड सिर्फ एक के साथ मिश्रित किया है। –

3

किसी भी वर्ग परिभाषा से पहले इस प्रयोग लागू नहीं है। फॉरवर्ड क्लास डेल्फी 2010 में काम करता है। मुझे आपके पास डेल्फी का चुड़ैल संस्करण नहीं पता है, लेकिन यह एकमात्र समाधान है जिसे मैं सोच सकता हूं।

type 
TAsyncPopulator = Class; 

आशा मैं

+0

मैंने कोशिश की। लेकिन यह त्रुटि देता है [डीसीसी त्रुटि] Populator.pas (10): E2086 प्रकार 'TASyncPopulator' अभी तक पूरी तरह परिभाषित नहीं है। मैं डेल्फी XE2 –

+0

@NiyokoYuliawan का उपयोग कर रहा हूं, इसे आपके डेल्फी संस्करण पर काम करना चाहिए, इसलिए सिंटैक्स की जांच करें कि आप कुछ और गलत कर रहे हैं। – opc0de

+0

@ नियोको - क्योंकि आपने TYPE अनुभाग को बहुत जल्दी समाप्त कर दिया था। अग्रेषित घोषणाएं एकल खंड अवधि में काम करती हैं। प्रकार घोषणा के बारे में डेल्फी मैनुअल पढ़ें। पुनश्च। इसके अलावा - ऊपर "retag" लिंक है। आमतौर पर जेनेरिक 'डेल्फी' टैग –

0

एक आगे घोषणा का उपयोग कर के अलावा, आप भी इस का समाधान करने के लिए एक उपवर्ग बना सकते हैं:

TThreadPopulator = class(TThread) 
    type 
    TAsyncPopulator = class 
     _updater: TThreadPopulator; 
    end; 

    var 
    owner: TAsyncPopulator; 
end; 
संबंधित मुद्दे