1

enum プロパティに文字列として書き込む方法は知っています。

    変数
      フォーム: Tフォーム;
      LContext: TRttiContext;
      LType: TRttiType;
      LProperty: TRttiProperty;
      PropTypeInfo: PTypeInfo;
      値: TValue;

    始める
      フォーム := TForm.Create(NIL);
      LContext:= TRttiContext.Create;

      LType := LContext.GetType(Form.ClassType);
      LType.GetProperties の LProperty の場合
        LProperty.Name = 'FormStyle' の場合
        始める
          PropTypeInfo := LProperty.PropertyType.Handle;
          TValue.Make(GetEnumValue(PropTypeInfo, 'fsStayOnTop'), PropTypeInfo, Value);
          LProperty.SetValue(フォーム、値);
        終わり;

      writeln(Integer(Form.FormStyle)); // = 3

しかし、文字列ではなく整数 (fsStayOnTop の場合は 3 など) を持っている場合に値を設定する方法と、そのプロパティから読み取るが文字列を返さない方法 (Value.AsString で動作する) は?

     値:= LProperty.GetValue(Obj);
     writeln(Value.AsString); // fsStayOnTop を返しますが、文字列ではなく整数が必要です
     writeln(Value.AsInteger); // 失敗

4

2 に答える 2

6

TValue次のように序数から を作成します。

Value := TValue.FromOrdinal(PropTypeInfo, OrdinalValue);

逆に、序数を読み取るには、次のようにします。

OrdinalValue := Value.AsOrdinal;
于 2015-09-15T18:27:30.917 に答える
3

次のようなことを試してください:

var
  Form: TForm;
  LContext: TRttiContext;
  LType: TRttiType;
  LProperty: TRttiProperty;
  Value: TValue;
begin
  Form := TForm.Create(NIL);

  LContext := TRttiContext.Create;
  LType := LContext.GetType(Form.ClassType);
  LProperty := LType.GetProperty('FormStyle');

  Value := TValue.From<TFormStyle>({fsStayOnTop}TFormStyle(3));
  LProperty.SetValue(Form, Value);

  WriteLn(Integer(Form.FormStyle));

  Value := LProperty.GetValue(Form);
  WriteLn(Integer(Value.AsType<TFormStyle>()));

  ...
end;
于 2015-09-15T19:11:45.777 に答える