Delphi XE TValue.From(True)不会产生TValue布尔值

时间:2012-05-08 11:04:51

标签: delphi delphi-xe rtti setvalue

我有一个布尔字段,我想用MyField.SetValue(Self, MyValue)设置它。无论我尝试什么,我都会遇到类型错误。

问题是MyValue总是包含一个序数,并且不被识别为包含布尔值。我知道boolean是一个枚举,它是一个序数,但仍然可以使用TValue设置布尔字段和属性。

我尝试了以下操作来启动MyValue,但每次MyValue.IsOrdinal = True MyValue.IsBoolean = False时都会这样做:

  1. MyValue := TValue.From(True);
  2. MyValue := TValue.From<Boolean>(True);
  3. MyBool := True; MyValue := MyValue.From(MyBool);
  4. MyBool := True; MyValue := MyValue.From<Boolean>(MyBool);
  5. MyValue := True;
  6. MyBool := True; MyValue := MyBool;
  7. MyBool := True; TValue.Make(@MyBool, TypeInfo(Boolean), MyValue);
  8. 有没有办法让TValue接受它包含一个布尔i.s.o.一个序数,以便MyField.SetValue(Self, MyValue)成功?

    提前致谢,

    Decolaman

1 个答案:

答案 0 :(得分:3)

TValue可以正常使用布尔值。

检查此示例代码

{$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.