Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - TValue (string) auf TValue (Integer) konvertieren [RTTI]


opfer.der.genauigkeit - Mo 18.10.10 12:19
Titel: TValue (string) auf TValue (Integer) konvertieren [RTTI]
Hallo,

ich habe ein kleines Problem.
Undzwar versuche ich einen Wert A in einen Wert B zu konvertieren.
Da ich über die RTTI arbeite, wollte ich diesen Vorgang eigentlich automatisieren.
D.h. die Typkonvertierung abhängig vom Zieltypen durchführen.
Allerdings scheitere ich daran, dass ich einen String nicht in einen Integer umwandelt kann.

Folgender Code führt nicht zum gewünschten Ergebnis:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var 
 LString: TValue;
 LInteger: TValue;
begin
  LString := TValue.From<string>('10');
  LInteger := LString.AsInteger;
end;


Nachdem ich mich schlau gemacht habe sehe ich das Problem in den Internas von TValue.
Der Aufruf .AsInteger führt letztendlich zum Aufruf von Conversions[SourceKind, DestKind]()
d.h. es wird die Funktion Zum konvertieren über den Conversions-Array aufgerufen.

TConvertFunc = function(const ASource: TValue; ATarget: PTypeInfo; out AResult: TValue): Boolean;
Conversions: array[TTypeKind,TTypeKind] of TConvertFunc = (..);

Doof ist nur, dass genau die Typumwandlung von String auf Integer immer die Konvertierungsroutine ConvFail aufruft,
also auch immer fehlschlägt. Gibt es eine Möglichkeit dieses Verhalten zu umgehen oder einen anderen Weg?

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt

//Edit: Hat sich erledigt. Ich arbeite direkt mit Variant.


delfiphan - Do 28.10.10 19:38

AsInteger macht einen Cast von string nach Integer, was zu einer EInvalidCast Exception führt. Die Konvertierung musst du schon noch selbst mit StrToInt machen.