我有一个像这样的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/