我知道如何以字符串形式写入枚举属性:
var Form: TForm; LContext: TRttiContext; LType: TRttiType; LProperty: TRttiProperty; PropTypeInfo: PTypeInfo; Value: TValue; begin Form := TForm.Create(NIL); LContext := TRttiContext.Create; LType := LContext.GetType(Form.ClassType); for LProperty in LType.GetProperties do if LProperty.Name = 'FormStyle' then begin PropTypeInfo := LProperty.PropertyType.Handle; TValue.Make(GetEnumValue(PropTypeInfo, 'fsStayOnTop'), PropTypeInfo, Value); LProperty.SetValue(Form, Value); end; writeln(Integer(Form.FormStyle)); // = 3
但如果我没有字符串但是有一个整数(例如fsStayOnTop为3)以及如何从该属性读取但不返回字符串(可以使用Value.AsString),如何设置值?
Value := LProperty.GetValue(Obj); writeln(Value.AsString); // returns fsStayOnTop but I want not a string, I want an integer writeln(Value.AsInteger); // fails
答案 0 :(得分:5)
从序数中创建TValue
,如下所示:
Value := TValue.FromOrdinal(PropTypeInfo, OrdinalValue);
在另一个方向,要读取序数,请执行以下操作:
OrdinalValue := Value.AsOrdinal;
答案 1 :(得分: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;