Delphi XE TValue.From(True)不生成TValue布尔值
我想使用Delphi XE TValue.From(True)不生成TValue布尔值,delphi,delphi-xe,rtti,setvalue,Delphi,Delphi Xe,Rtti,Setvalue,我想使用MyField.SetValue(Self,MyValue)设置一个布尔字段。不管我怎么做,我总是会遇到打字错误 问题是MyValue始终包含序号,并且不被识别为包含布尔值。我知道boolean是一个枚举,它是一个序数,但仍然可以使用TValue设置布尔字段和属性 我尝试了以下方法来启动MyValue,但每次MyValue.IsOrdinal=True而MyValue.IsBoolean=False: MyValue:=TValue.From(True) MyValue:=TValue.
MyField.SetValue(Self,MyValue)
设置一个布尔字段。不管我怎么做,我总是会遇到打字错误
问题是MyValue始终包含序号,并且不被识别为包含布尔值。我知道boolean是一个枚举,它是一个序数,但仍然可以使用TValue设置布尔字段和属性
我尝试了以下方法来启动MyValue,但每次MyValue.IsOrdinal=True
而MyValue.IsBoolean=False
:
MyValue:=TValue.From(True)代码>
MyValue:=TValue.From(True)代码>
MyBool:=True;MyValue:=MyValue.From(MyBool)代码>
MyBool:=True;MyValue:=MyValue.From(MyBool)代码>
MyValue:=True代码>
MyBool:=True;MyValue:=MyBool代码>
MyBool:=True;Make(@MyBool,TypeInfo(Boolean),MyValue)代码>
MyField.SetValue(Self,MyValue)
就会成功
提前感谢,
Decolaman可以很好地处理布尔值
检查此示例代码
{$APPTYPE CONSOLE}
uses
Rtti,
SysUtils;
Type
TAnyClass=class
AField : Boolean;
end;
Var
Ctx : TRttiContext;
MyValue : TValue;
A : TAnyClass;
MyField : TRttiField;
begin
try
Ctx:=TRttiContext.Create;
A:=TAnyClass.Create;
try
MyField:=Ctx.GetType(TAnyClass).GetField('AField');
MyValue:= MyValue.From(False);
MyField.SetValue(A, MyValue);
Writeln('The Value of AField Is '+BoolToStr(A.AField, True));
MyValue:= MyValue.From(True);
MyField.SetValue(A, MyValue);
Writeln('The Value of AField Is '+BoolToStr(A.AField, True));
finally
A.Free;
Ctx.Free;
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
该函数适用于布尔值
检查此示例代码
{$APPTYPE CONSOLE}
uses
Rtti,
SysUtils;
Type
TAnyClass=class
AField : Boolean;
end;
Var
Ctx : TRttiContext;
MyValue : TValue;
A : TAnyClass;
MyField : TRttiField;
begin
try
Ctx:=TRttiContext.Create;
A:=TAnyClass.Create;
try
MyField:=Ctx.GetType(TAnyClass).GetField('AField');
MyValue:= MyValue.From(False);
MyField.SetValue(A, MyValue);
Writeln('The Value of AField Is '+BoolToStr(A.AField, True));
MyValue:= MyValue.From(True);
MyField.SetValue(A, MyValue);
Writeln('The Value of AField Is '+BoolToStr(A.AField, True));
finally
A.Free;
Ctx.Free;
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
的确如此。我还为属性编写了一个小测试,它在那里工作。但在我的应用程序中,它不是。当我发现问题时,我会将其发布到这里。显然,在下一次尝试使用Rtti设置值时,RttiField和要将其设置为不匹配的对象会导致类型转换错误。确实如此。我还为属性编写了一个小测试,它在那里工作。但在我的应用程序中,它不是。当我发现问题时,我会将其发布到这里。显然,在下一次尝试使用Rtti设置值时,RttiField和要将其设置为不匹配的对象会导致类型转换错误。