Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 使用RTTI以整数形式读写枚举属性_Delphi_Delphi Xe8_Delphi 10 Seattle - Fatal编程技术网

Delphi 使用RTTI以整数形式读写枚举属性

Delphi 使用RTTI以整数形式读写枚举属性,delphi,delphi-xe8,delphi-10-seattle,Delphi,Delphi Xe8,Delphi 10 Seattle,我知道如何将枚举属性作为字符串写入: var Form: TForm; LContext: TRttiContext; LType: TRttiType; LProperty: TRttiProperty; PropTypeInfo: PTypeInfo; Value: TValue; begin Form := TForm.Create(NIL); LContext := TRttiCon

我知道如何将枚举属性作为字符串写入:

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 变量 形式:TForm; LContext:trttitcontext; l型:trtti型; LProperty:trtti属性; PropTypeInfo:PTypeInfo; 价值:TValue; 开始 Form:=TForm.Create(NIL); LContext:=TRttiContext.Create; LType:=LContext.GetType(Form.ClassType); 对于LType.GetProperties中的LProperty,请执行以下操作: 如果LProperty.Name='FormStyle',则 开始 PropTypeInfo:=lpProperty.PropertyType.Handle; Make(GetEnumValue(PropTypeInfo,'fsStayOnTop'),PropTypeInfo,Value); LProperty.SetValue(形式、值); 结束; writeln(整数(Form.FormStyle));//=3. 但是,如果我没有字符串而是整数(例如,fsStayOnTop为3),如何设置该值,以及如何从该属性读取而不返回字符串(这将与value.AsString一起使用)

值:=LProperty.GetValue(Obj); writeln(Value.AsString);//返回fsStayOnTop,但我不想要字符串,我想要整数 writeln(Value.AsInteger);//失败
从序号创建
t值
,如下所示:

Value := TValue.FromOrdinal(PropTypeInfo, OrdinalValue);
在另一个方向上,要读取序号,请执行以下操作:

OrdinalValue := Value.AsOrdinal;

从序号创建
t值
,如下所示:

Value := TValue.FromOrdinal(PropTypeInfo, OrdinalValue);
在另一个方向上,要读取序号,请执行以下操作:

OrdinalValue := Value.AsOrdinal;

试着这样做:

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;
var
形式:TForm;
LContext:trttitcontext;
l型:trtti型;
LProperty:trtti属性;
价值:TValue;
开始
Form:=TForm.Create(NIL);
LContext:=TRttiContext.Create;
LType:=LContext.GetType(Form.ClassType);
LProperty:=LType.GetProperty('FormStyle');
Value:=TValue.From({fsStayOnTop}TFormStyle(3));
LProperty.SetValue(形式、值);
WriteLn(整数(Form.FormStyle));
值:=LProperty.GetValue(表单);
WriteLn(整数(Value.AsType());
...
结束;

尝试以下方法:

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;
var
形式:TForm;
LContext:trttitcontext;
l型:trtti型;
LProperty:trtti属性;
价值:TValue;
开始
Form:=TForm.Create(NIL);
LContext:=TRttiContext.Create;
LType:=LContext.GetType(Form.ClassType);
LProperty:=LType.GetProperty('FormStyle');
Value:=TValue.From({fsStayOnTop}TFormStyle(3));
LProperty.SetValue(形式、值);
WriteLn(整数(Form.FormStyle));
值:=LProperty.GetValue(表单);
WriteLn(整数(Value.AsType());
...
结束;

为什么强制转换为整数而不是使用ord()?我尝试了类似的方法,但失败了。工作也很好,谢谢为什么强制转换为整数而不是使用ord()?我尝试了类似的方法,但失败了。也很好,谢谢