2008-12-03 6 views
5

Est-il possible que GetPropInfo renvoie zéro même si la classe donnée est déclarée avec les directives {$ METHODINFO} correctes.

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; 

Répondre

5

Gotcha! Il semble que le problème est caché à la déclaration avant que j'ai oublié. Je ne savais pas cette fonctionnalité sournoise.

Il semble que le compilateur ne considère que la première déclaration de la classe pour générer RTTI ou pas si vous avez une déclaration avant comme ça ...

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; 

... Vous obtiendrez l'erreur d'assertion. Donc, pour obtenir le droit RTTI, il faut tourner la directive {$ METHODINFO} sur la déclaration en avant, comme on le voit ici ....

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

Je suis venu à travers cette "fonctionnalité" déjà, aussi. BTW, il n'est pas nécessaire d'allumer le plein {$ METHODINFO ON}, il suffit d'utiliser simplement {$ TYPEINFO ON} ou {$ M +}. –

+1

Il convient de noter que dans Delphi 2009, le compilateur ajoute {M +} à n'importe quelle classe avec une section "published" automatiquement, donc ce problème n'existe plus. –

1

Je suis heureux que vous avez trouvé une solution. C'est la même chose avec la directive $TypeInfo. L'aide de Delphi 7 indique:

Notez que si une classe est déclarée directe, la première déclaration de la classe doit être déclarée avec le commutateur $M.

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

Questions connexes