2008-12-03 14 views
5

Gibt es eine Möglichkeit, dass GetPropInfo Nil zurückgibt, selbst wenn die angegebene Klasse mit korrekten Direktiven {$ METHODINFO} deklariert wird.

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; 

Antwort

5

Gotcha! Es scheint, dass das Problem bei der Vorwärtsdeklaration verborgen ist, die ich übersehen habe. Ich kannte dieses hinterhältige Feature nicht.

Es scheint, der Compiler nur die erste Deklaration der Klasse betrachtet RTTI oder nicht so zu erzeugen, wenn Sie eine Vorwärts-Deklaration wie dieses ...

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; 

... Sie werden die Behauptung Fehler. Also, für die RTTI richtig hinzubekommen, muss man die {$ METHOD} Richtlinie über die Vorwärts-Erklärung drehen, wie hier zu sehen ....

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

ich auf dieses "Feature" gekommen sind, schon auch. BTW, es ist nicht notwendig, das volle {$ METHODINFO ON} einzuschalten, es genügt, {$ TYPINFO ON} oder {$ M +} zu verwenden. –

+1

Es sollte beachtet werden, dass der Compiler in Delphi 2009 automatisch {M +} zu jeder Klasse mit einem "published" -Abschnitt hinzufügt, sodass dieses Problem nicht mehr besteht. –

1

Ich bin froh, dass Sie eine Lösung gefunden zu haben. Es ist das Gleiche mit $TypeInfo Richtlinie. Delphi 7 help sagt:

Beachten Sie, dass wenn eine Klasse nach vorne deklariert ist, muss die erste Deklaration der Klasse mit der $M Switch deklariert werden.

P. S .: $M+/- = $TypeInfo On/Off

Verwandte Themen