2008-12-03 11 views
5

क्या कोई संभावना है कि GetPropInfo शून्य लौटाता है भले ही दिए गए वर्ग को सही {$ METHODINFO} निर्देशों के साथ घोषित किया गया हो।

type 
    ... 
    ... 
    {$METHODINFO ON} 
    TMyClass = class 
    private 
     fField: integer; 
    published 
     property Field: integer read fField write fField; 
    end; 
    {$METHODINFO OFF} 
    ... 
    ... 
    procedure TestRTTI; 
    begin 
    assert(assigned(GetPropInfo(TMyClass, 'Field')), 'WTF! No RTTI found!'); 
    end; 

उत्तर

5

गोटो! ऐसा लगता है कि आगे की घोषणा में समस्या छिपी हुई है जिसे मैंने अनदेखा किया था। उस स्नीकी फीचर को नहीं पता था।

ऐसा लगता है संकलक वर्ग के केवल पहले घोषणा समझता है RTTI या नहीं उत्पन्न करने के लिए, इसलिए यदि आप इस तरह एक आगे घोषणा है ...

type 
    TMyClass = class; 
    ...  
    ... 
    {$METHODINFO ON} 
    TMyClass = class 
    private 
     fField: integer; 
    published 
     property Field: integer read fField write fField; 
    end; 
    {$METHODINFO OFF} 
    ... 
    ... 
    procedure TestRTTI; 
    begin 
     assert(assigned(GetPropInfo(TMyClass, 'Field')), 'WTF! No RTTI found!'); 
    end; 

... आप जोर त्रुटि मिल जाएगा। तो, RTTI सही प्राप्त करने के लिए, एक के रूप में यहाँ देखा है, आगे घोषणा के लिए पर {$ MethodInfo} निर्देश चालू करने के लिए ....

type 
    {$METHODINFO ON} 
    TMyClass = class; 
    {$METHODINFO OFF} 
    ...  
    ... 
    TMyClass = class 
    private 
     fField: integer; 
    published 
     property Field: integer read fField write fField; 
    end; 
    ... 
+1

मैं इस "सुविधा" पहले से ही भर भी आए हैं,। बीटीडब्लू, पूर्ण {$ METHODINFO ON} चालू करने के लिए यह necesarry नहीं है, यह केवल {$ TYPEINFO ON}, या {$ M +} का उपयोग करने के लिए पर्याप्त है। –

+1

यह ध्यान दिया जाना चाहिए कि डेल्फी 200 9 में, कंपाइलर स्वचालित रूप से "प्रकाशित" अनुभाग वाले किसी भी वर्ग में {M +} जोड़ता है, इसलिए यह समस्या अब मौजूद नहीं है। –

1

मुझे खुशी है कि आप एक समाधान पाया है कर रहा हूँ की जरूरत है। $TypeInfo निर्देश के साथ यह वही बात है। डेल्फी 7 मदद का कहना है:

ध्यान दें कि यदि एक वर्ग आगे घोषित किया जाता है, कक्षा के पहले घोषणा $M स्विच के साथ घोषित किया जाना चाहिए।

पी.एस .: $M+/- = $TypeInfo On/Off

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