2008-12-03 73 views
5

即使使用正確的{$ METHODINFO}指令聲明瞭給定的類,GetPropInfo是否還有可能返回nil。

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}並不難,只要使用{$ TYPEINFO ON}或{$ M +}就足夠了。 – 2008-12-04 10:46:36

1

我很高興你已經找到了解決方案。 $TypeInfo指令與此相同。德爾福7幫助說:

請注意,如果一個類是正向聲明,該類的第一個聲明必須使用$M開關聲明。

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