2012-01-28 14 views
7

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

सवाल यह है कि बस इस:

  • क्या यह संभव है डेल्फी में एक कक्षा संदर्भ संपत्ति के लिए?
  • यदि हां, तो कैसे?

यहाँ मैं क्या कोशिश की है है ...

type 

    TMyObject = class 
    // ... 
    end; 

    TMyObjectClass = class of TMyObject 

    TMyObjectA = class(TMyObject) 
    // specifics here 
    end; 

    TMyObjectB =class(TMyObject) 
    // specifics here 
    end; 

    TMyComponent = class(TComponent) 
    private 
    FObjectType: TMyObjectClass; 
    published 
    property ObjectType: TMyObjectClass read FObjectType write FObjectType; 
    end; 

उपरोक्त कोड ठीक संकलित, तथापि वस्तु इंस्पेक्टर ObjectType संपत्ति बिल्कुल भी दिखाई नहीं देता है।

मेरा उद्देश्य यहां (यदि आपने पहले से अनुमान नहीं लगाया है) इसे बनाना है ताकि मैं एक विशिष्ट आधार वर्ग से कक्षा वंश का चयन कर सकूं, ताकि एक ही घटक अलग तरीके से व्यवहार कर सके।

मैं इसे इस तरह से करना चाहता हूं ताकि घटक को उप-वर्गों के बारे में जानने की आवश्यकता न हो (इसे पूरी तरह से मॉड्यूलर) होना चाहिए। मैं एक Enum उपयोग नहीं कर सकते उप-वर्ग प्रकार के बीच चयन करने के लिए के रूप में घटक सीधे उप-वर्ग प्रकार से लिंक नहीं कर सकते हैं (यह बस इस विशेष मामले में संभव नहीं है:

मुझे सिर्फ इस बिट स्पष्ट करते हैं)

वैसे भी ... अग्रिम धन्यवाद!

+0

ऑब्जेक्ट इंस्पेक्टर संपत्ति नहीं दिखाता है क्योंकि इसके लिए कोई पंजीकृत प्रॉपर्टी एडिटर नहीं है। – kludg

उत्तर

5

आप किसी विशेष बेस क्लास से उतरने वाले सभी वर्गों को पा सकते हैं: Delphi: At runtime find classes that descend from a given base class? और इसे TPropertyEditor का उपयोग करके मूल्यों की सूची के साथ एक विशेष संपत्ति बनाएं।

+0

अपने उत्तर को सही के रूप में चिह्नित करें जैसा कि आप पहले जवाब देने वाले थे (और यह सही जवाब है)। मैं इस विधि का उपयोग नहीं करूँगा क्योंकि मैं इस प्रणाली में किसी भी आरटीटीआई का उपयोग नहीं करना चाहता हूं। "क्रॉस-लिंक्ड घटकों" विचार (जहां 'TMyObjectA' या' TMyObjectB' का एक घटक किसी संपत्ति के माध्यम से 'TMyComponent' उदाहरण के लिंक के साथ जाने का निर्णय लिया गया है। इस तरह से आसान! – LaKraven

+0

साइमन, इस तरह के एक संपत्ति संपादक वास्तव में एक डिजाइन समय पैकेज के संदर्भ में वर्ग प्रकारों को पकड़ने पर विचार करेंगे। –

+0

डेविड, हाँ ... इस तरह की चीज़ों को संभालने के लिए एक संपत्ति संपादक जोड़ने के लिए यह अपेक्षाकृत आसान (आरटीटीआई का उपयोग करना) होगा ... लेकिन जैसा कि मैंने अपनी पिछली टिप्पणी में कहा था, मैं आरटीटीआई का उपयोग नहीं करना चाहता संकलित निष्पादन योग्य (जिसे मुझे कक्षा को अपने योग्य नाम से डीएफएम में संग्रहीत करने के लिए करना होगा) – LaKraven

3

यदि आप ऐसा करने जा रहे थे तो आपको property editor प्रदान करना होगा। आईडीई वर्ग प्रकार गुणों के लिए संपत्ति संपादकों के साथ नहीं आता है। आपको .dfm दृढ़ता को संभालने की भी आवश्यकता होगी। आप कक्षा प्रकार को .dfm फ़ाइल में एक स्ट्रिंग के रूप में लिखेंगे और जब .dfm फ़ाइल पढ़ी जाए, तो आपको संदर्भ को ठीक करने की आवश्यकता होगी। नई शैली आरटीटीआई ऐसा कर सकती है।

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

मुझे लगता है कि इसका मतलब यह है कि आपको इसके बजाय एक साधारण स्ट्रिंग प्रॉपर्टी का उपयोग करना चाहिए और केवल रनटाइम पर कक्षा प्रकार संदर्भों को ठीक करना चाहिए।

संबंधित मुद्दे