Typumwandlung implementieren
Nach oben zu Eine Klasse zur Aktivierung des selbstdefinierten Variant-Typs erzeugen
Die Typumwandlung ist eines der wichtigsten Merkmale des selbstdefinierten Variant-Typs, das von Ihnen zu implementieren ist. Die Flexibilität von Variant-Typen ergibt sich zum Teil aus den impliziten Typumwandlungen.
Sie müssen zwei Methoden implementieren, damit der selbstdefinierte Variant-Typ Typumwandlungen durchführen kann: die Methode Cast, die andere Variant-Typen in diesen selbstdefinierten Variant-Typ umwandelt, und die Methode CastTo, die den selbstdefinierten Variant-Typ in einen anderen Variant-Typ umwandelt.
Bei der Implementierung dieser beiden Methoden ist es relativ einfach, die logischen Umformungen bezüglich der integrierten Variant-Typen vorzunehmen. Es ist jedoch zu beachten, dass der andere Variant-Typ ein weiterer selbstdefinierter Typ sein kann. Zur Berücksichtigung dieser Möglichkeit können Sie die Umwandlung in einen der integrierten Variant-Typen als Zwischenschritt ausführen.
Die folgende Cast
-Methode aus der Klasse TComplexVariantType
benutzt z.B. den Typ Double als Zwischentyp:
Delphi:
procedure TComplexVariantType.Cast(var Dest: TVarData; const Source: TVarData);
var
LSource, LTemp: TVarData;
begin
VarDataInit(LSource);
try
VarDataCopyNoInd(LSource, Source);
if VarDataIsStr(LSource) then
TComplexVarData(Dest).VComplex := TComplexData.Create(VarDataToStr(LSource))
else
begin
VarDataInit(LTemp);
try
VarDataCastTo(LTemp, LSource, varDouble);
TComplexVarData(Dest).VComplex := TComplexData.Create(LTemp.VDouble, 0);
finally
VarDataClear(LTemp);
end;
end;
Dest.VType := VarType;
finally
VarDataClear(LSource);
end;
end;
Neben der Verwendung von Double als Zwischentyp sind in dieser Implementierung einige weitere Punkte interessant:
- Im letzten Schritt dieser Methode wird dem Element
VType
des zurückgegebenenTVarData
-Record ein Wert zugewiesen. Dieses Element enthält den Variant-Typcode. Dem Element wurde der Wert der Eigenschaft VarType desTComplexVariantType
-Objekts zugewiesen, der den Variant-Typcode darstellt, der dem selbstdefinierten Variant zugeordnet ist. - Die Daten des selbstdefinierten Variantentyps (
Dest
) werden vonTVarData
in den Record-Typ umgewandelt, der momentan zur Speicherung seiner Daten genutzt wird (TComplexVarData
). Das erleichtert die Arbeit mit den Daten. - Die Methode erstellt eine lokale Kopie des Quell-Variants, arbeitet also nicht direkt mit seinen Daten. Dadurch wird verhindert, dass Nebeneffekte u.U. die Quelldaten beeinträchtigen.
Bei der Umwandlung eines komplexen Variant-Typs in einen anderen Typ benutzt die Methode CastTo ebenfalls einen Zwischentyp Double (für jeden Zieltyp außer String):
Delphi:
procedure TComplexVariantType.CastTo(var Dest: TVarData; const Source: TVarData; const AVarType: TVarType);
var
LTemp: TVarData;
begin
if Source.VType = VarType then
case AVarType of
varOleStr:
VarDataFromOleStr(Dest, TComplexVarData(Source).VComplex.AsString);
varString:
VarDataFromStr(Dest, TComplexVarData(Source).VComplex.AsString);
else
VarDataInit(LTemp);
try
LTemp.VType := varDouble;
LTemp.VDouble := TComplexVarData(LTemp).VComplex.Real;
VarDataCastTo(Dest, LTemp, AVarType);
finally
VarDataClear(LTemp);
end;
end
else
RaiseCastError;
end;
Beachten Sie: Die Methode CastTo
berücksichtigt auch den Fall, dass der Quell-Variant keinen Typ besitzt, der mit der Eigenschaft VarType
übereinstimmt. Dieser Fall kann nur für leere (nicht zugewiesene) Quell-Variants eintreten.