关于TForm的Rtti GetFields和GetAttributes

时间:2013-01-11 19:05:11

标签: delphi rtti

我有一个TForm:

TMyForm = class (TForm)
  [MyAttr('Data')] 
  edit1: TEdit;
private
 FData: String;
end

当我尝试通过RTTI获取此表单的字段时,我只获取edit1字段,而不是FDATA,当我查询edit1字段属性时,获取一个空数组。

对于不继承TForm的anoteher类,一切正常。 ¿为什么?

编辑样本

type


{$RTTI EXPLICIT FIELDS([vcPrivate,vcProtected, vcPublic])}
  TForm3 = class(TForm)
    [TCustomAttribute]
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    [TCustomAttribute]
    FData: String;
  public
    { Public declarations }
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);
var
  LCtx: TRttiContext;
  LField: TRttiField;
  LAttr: TCustomAttribute;
begin
  for LField in LCtx.GetType(Self.ClassInfo).GetDeclaredFields do
  begin
      Memo1.Lines.Add(lField.Name);
      for LAttr in LField.GetAttributes do
        Memo1.Lines.Add(#9+LAttr.ClassName);

  end;
end;

end.

单击button1的结果:

FData
    TCustomAttribute
Button1
Memo1

1 个答案:

答案 0 :(得分:4)

项目中某处可能有$RTTI指令导致扩展的RTTI不起作用。

尝试在声明TMyForm之前添加以下内容:

{$RTTI EXPLICIT
  METHODS(DefaultMethodRttiVisibility)
  FIELDS(DefaultFieldRttiVisibility)
  PROPERTIES(DefaultPropertyRttiVisibility)}

这会为之后声明的所有内容重置RTTI生成,在此之后你应该得到正确的RTTI。