0

を使用して設定したいブールフィールドがありMyField.SetValue(Self, MyValue)ます。何を試しても、型キャストエラーが発生し続けます。

問題は、MyValue が常に序数を含み、ブール値を含むと認識されないことです。boolean は序数である列挙型であることは知っていますが、TValue を使用して boolean フィールドとプロパティを設定することは可能です。

MyValue.IsOrdinal = TrueMyValue を開始するために次のことを試みましたが、毎回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);

MyField.SetValue(Self, MyValue)成功するように、ブール値の iso 序数が含まれていることを TValue に受け入れる方法はありますか?

前もって感謝します、

デコラマン

4

1 に答える 1

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.
于 2012-05-08T16:02:03.627 に答える