Delphi 2010: Nuovo RTTI, impostando il valore della proprietà su un valore arbitrario
-
05-07-2019 - |
Domanda
TRTTIProperty.SetValue () accetta un'istanza TValue, ma se l'istanza TValue fornita si basa su un tipo diverso, la proprietà esplode.
per es.
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;
Anche il tentativo di trasmettere il valore a una stringa non funzionerà.
prop.SetValue(obj, value.AsString);
prop.SetValue(obj, value.Cast(prop.PropertyType.Handle));
Qualche idea su come risolverlo?
UPDATE:
Alcuni di voi si chiedono perché voglio assegnare un numero intero a una stringa e cercherò di spiegare. (In realtà, è più probabile che io voglia assegnare una stringa a un numero intero, ma non è così rilevante ...)
Quello che sto cercando di realizzare è creare un "intermediario" generale tra gui e modello. Voglio in qualche modo agganciare un campo textedit a una proprietà. Invece di creare un uomo così centrale per ogni modello che ho, speravo che la nuova cosa RTTI / TValue avrebbe funzionato un po 'di magia per me.
Sono anche nuovo ai generici, quindi non sono sicuro di come i generici avrebbero potuto aiutare. È possibile creare un'istanza di un generico in fase di esecuzione con un tipo deciso in modo dinamico oppure è necessario che la compilazione lo sappia?
per es.
TMyGeneric<T> = class
end;
procedure DoSomething( );
begin
prop := rtti.getProperty('StringValue');
mygen := TMyGeneric<prop.PropertyType>.Create;
//or
mygen := TMyGeneric<someModel.Class>.Create;
end;
Forse l'era della magia deve ancora venire ... Immagino di riuscire a gestire un paio di grandi case ...
Soluzione
TValue non è una variante. Puoi solo leggere il tipo di dati che " tu " messo in esso.
TValue.Cast non funziona perché ha la stessa semantica dei cast di tipi impliciti. Non è possibile assegnare un numero intero a una stringa o viceversa. Ma puoi assegnare un numero intero a un float oppure puoi assegnare un numero intero a un int64.
Altri suggerimenti
Non posso provarlo adesso, ma avrei scritto:
value := '1000';
prop.SetValue(obj, value);
try
prop.SetValue (obj, value.ToString)
Ma per me è la stessa domanda di Fran & # 231; ois. Perché vuoi impostare la proprietà con un valore del tipo di dati errato?