2008-12-03 9 views
5

Hay alguna posibilidad de que GetPropInfo devuelva nil incluso si la clase dada se declara con las directivas {$ METHODINFO} correctas.

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; 

Respuesta

5

Gotcha! Parece que el problema está oculto en la declaración avanzada que pasé por alto. No sabía esa característica furtiva.

Parece que el compilador considera sólo la primera declaración de la clase para generar RTTI o no por lo que si usted tiene una declaración hacia adelante como esto ...

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; 

... Usted recibirá el error de aserción. Por lo tanto, para obtener el derecho de RTTI, hay que girar el {} $ MethodInfo directiva sobre la declaración hacia adelante, como se ve aquí ....

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

me he encontrado con esta "característica" ya, también. Por cierto, no es necesario encender el {$ METHODINFO ON} completo, basta con usar {$ TYPEINFO ON} o {$ M +}. –

+1

Cabe señalar que en Delphi 2009, el compilador agrega {M +} a cualquier clase con una sección "publicada" automáticamente, por lo que este problema ya no existe. –

1

me alegro de que haya encontrado una solución. Es lo mismo con la directiva $TypeInfo. Delphi 7 ayuda dice:

Tenga en cuenta que si una clase es declarado hacia delante, la primera declaración de la clase debe ser declarada con el interruptor $M.

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

Cuestiones relacionadas