首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TForm上的Rtti GetFields和GetAttributes

TForm上的Rtti GetFields和GetAttributes
EN

Stack Overflow用户
提问于 2013-01-12 03:05:11
回答 1查看 1.6K关注 0票数 2

我有一个这样的TForm:

代码语言:javascript
复制
TMyForm = class (TForm)
  [MyAttr('Data')] 
  edit1: TEdit;
private
 FData: String;
end

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

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

为示例编辑

代码语言:javascript
复制
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的结果:

代码语言:javascript
复制
FData
    TCustomAttribute
Button1
Memo1
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-12 03:10:56

在你的项目中可能有一个$RTTI指令导致扩展RTTI不能工作。

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

代码语言:javascript
复制
{$RTTI EXPLICIT
  METHODS(DefaultMethodRttiVisibility)
  FIELDS(DefaultFieldRttiVisibility)
  PROPERTIES(DefaultPropertyRttiVisibility)}

这将为它之后声明的所有内容重置RTTI生成,并且您应该在该点之后获得正确的RTTI。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14284963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档