delphi - TForm 上的 RTTI GetFields 和 GetAttributes

标签 delphi rtti tform

我有一个像这样的TForm:

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

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

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

编辑示例:

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

最佳答案

您的项目中的某处可能存在 $RTTI 指令,导致扩展 RTTI 无法工作。

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

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

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

关于delphi - TForm 上的 RTTI GetFields 和 GetAttributes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14284963/

相关文章:

delphi - Delphi XE 中的类型转换问题

Delphi:框架属性在我期望的时候没有更新(它们被卡住了)

delphi - 在 delphi TForm 类中仅出现 'public' 错误

c++ - 从编译器设置中关闭 RTTI 有什么好处?

delphi - 为什么 TForm.SetBounds 仅在设计时将 TForm.Position 设置为 poDefault 时才能正常工作

Delphi 2010-IDE 不断停止在 CPU 调试窗口

delphi - 如何让 "show/hide desktop icons"设置生效?

delphi - 创建不能在表单上多次添加的简单组件

delphi - 如何检查接口(interface)属性的可见性?

delphi - 为什么我应该关心 Delphi 中的 RTTI?