2

私は次のようなTFormを持っています:

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

RTTIを介してこのフォームのフィールドを取得しようとすると、FDATAではなくedit1フィールドのみが取得され、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
4

1 に答える 1

5

$RTTIプロジェクトのどこかに、拡張RTTIが機能しない原因となるディレクティブがある可能性があります。

TMyFormの宣言の直前に以下を追加してみてください。

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

これにより、その後に宣言されたすべてのRTTI生成がリセットされ、その時点以降に適切なRTTIを取得する必要があります。

于 2013-01-11T19:10:56.180 に答える