2008-12-03 5 views
5

Có khả năng nào GetPropInfo trả về nil ngay cả khi lớp đã cho được khai báo với chỉ thị {$ METHODINFO} chính xác.

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; 

Trả lời

5

Gotcha! Có vẻ như vấn đề được ẩn giấu trong tờ khai về phía trước mà tôi đã bỏ qua. Không biết tính năng lén lút đó.

Dường như trình biên dịch chỉ xem xét việc kê khai đầu tiên của lớp để tạo RTTI hay không vì vậy nếu bạn có một lời tuyên bố về phía trước như thế này ...

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; 

... Bạn sẽ nhận được lỗi khẳng định. Vì vậy, để nhận được RTTI đúng, người ta cần để biến {$ MethodInfo} Chỉ thị về việc khai báo về phía trước, như đã thấy ở đây ....

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

tôi đã đi qua này "tính năng" đã có, quá. BTW, không cần phải bật {$ METHODINFO ON} đầy đủ, chỉ đủ dùng {$ TYPEINFO ON} hoặc {$ M +}. –

+1

Cần lưu ý rằng trong Delphi 2009, trình biên dịch thêm {M +} vào bất kỳ lớp nào có phần "được xuất bản" tự động, vì vậy vấn đề này không còn tồn tại nữa. –

1

Tôi vui vì bạn đã tìm thấy một giải pháp. Đó là điều tương tự với chỉ thị $TypeInfo. Trợ giúp Delphi 7 nói:

Lưu ý rằng nếu một lớp được khai báo trước, khai báo đầu tiên của lớp phải được khai báo bằng công tắc $M.

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