Typumwandlung implementieren

Aus RAD Studio
Wechseln zu: Navigation, Suche

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ückgegebenen TVarData-Record ein Wert zugewiesen. Dieses Element enthält den Variant-Typcode. Dem Element wurde der Wert der Eigenschaft VarType des TComplexVariantType-Objekts zugewiesen, der den Variant-Typcode darstellt, der dem selbstdefinierten Variant zugeordnet ist.
  • Die Daten des selbstdefinierten Variantentyps (Dest) werden von TVarData 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.

Siehe auch