Autor Beitrag
opfer.der.genauigkeit
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754
Erhaltene Danke: 1



BeitragVerfasst: Mo 18.10.10 12:19 
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:
ausblenden 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.

_________________
Stellen Sie sich bitte Zirkusmusik vor.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: 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.