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)
  • 有没有办法让TValue接受它包含一个布尔i.s.o.序数,这样
    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和要将其设置为不匹配的对象会导致类型转换错误。