質問

TRTTIProperty.SetValue()はTValueインスタンスを受け取りますが、提供されたTValueインスタンスがプロパティとは異なるタイプに基づいている場合、事態は爆発します。

E.g。

TMyObject = class
published
  property StringValue: string read FStringValue write FStringValue;
end;

procedure SetProperty(obj: TMyObject);
var
  context: TRTTIContext;
  rtti: TRTTIType;
  prop: TRTTIProperty;
  value: TValue;
begin
  context := TRTTIContext.Create;
  rtti := context.GetType(TMyObject);
  prop := rtti.GetProperty('StringValue');
  value := 1000;
  prop.SetValue(obj, value);
end;

値を文字列にキャストしようとしても機能しません。

prop.SetValue(obj, value.AsString);
prop.SetValue(obj, value.Cast(prop.PropertyType.Handle));

これをどのように解決するかについてのアイデアはありますか?

更新:

一部の人は、なぜ文字列に整数を割り当てたいのか疑問に思っています。説明しようと思います。 (実際には、文字列を整数に割り当てたいと思う可能性が高いですが、それはあまり関係ありません...)

私が成し遂げようとしているのは、GUIとモデルの間に一般的な「中間者」を作ることです。私は何らかの形でtexteditフィールドをプロパティにフックしたいと思います。私が持っている各モデルに対してこのような中間者を作る代わりに、新しいRTTI / TValueが私にとって何らかの魔法を働かせることを望みました。

私はジェネリック医薬品も初めてなので、ジェネリック医薬品がどのように役立つかはわかりません。動的に決定された型で実行時にジェネリックをインスタンス化することは可能ですか、それともコンパイルを知る必要がありますか?

E.g。

TMyGeneric<T> = class
end;

procedure DoSomething( );
begin
  prop := rtti.getProperty('StringValue');
  mygen := TMyGeneric<prop.PropertyType>.Create;
  //or
  mygen := TMyGeneric<someModel.Class>.Create;
end;

おそらく魔法の時代はまだ来ていません...いくつかの大きなケース構造で管理できると思います...

役に立ちましたか?

解決

TValueはVariantではありません。 「あなた」というデータ型のみを読み取ることができます。入れてください。

TValue.Castは、暗黙の型キャストと同じセマンティックを持っているため機能しません。文字列に整数を割り当てたり、その逆を行うことはできません。ただし、整数をfloatに割り当てることも、int64に整数を割り当てることもできます。

他のヒント

今すぐ試すことはできませんが、私は次のように書きます:

  value := '1000'; 
  prop.SetValue(obj, value);

試用

prop.SetValue(obj、value.ToString)

しかし、私にとっては、Fran&#231; oisと同じ質問です。間違ったデータ型の値でプロパティを設定する理由は何ですか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top