Activation du transtypage

De RAD Studio
Aller à : navigation, rechercher

Remonter à Création d'une classe pour le type variant personnalisé


Le transtypage est une des fonctionnalités du type variant personnalisé les plus importantes à implémenter. La flexibilité des variants vient en partie de leur transtypage implicite.

Il y a deux méthodes à implémenter pour que le type Variant personnalisé effectue des transtypages : Cast, qui convertit un autre type Variant en votre variant personnalisé, et CastTo, qui convertit votre variant personnalisé en un autre type Variant.

Quand vous implémentez l'une de ces méthodes, il est relativement facile de faire les conversions logiques à partir des types variant intégrés. Cependant, vous devez envisager la possibilité que le variant vers ou depuis lequel vous transtypez peut être un autre type Variant personnalisé. Pour résoudre cette situation, vous pouvez essayer, dans un premier temps, une conversion en un des types Variant intégrés.

Par exemple, la méthode Cast suivante, de la classe TComplexVariantType, utilise le type Double comme type intermédiaire :

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;

En plus de l'utilisation d'un Double comme type Variant intermédiaire, il faut remarquer deux ou trois choses dans cette implémentation :

  • La dernière étape de cette méthode définit le membre VType de l'enregistrement renvoyé. Ce membre donne le code du type Variant. Il est définit par la propriété VarType de TComplexVariantType, qui est le code du type Variant affecté au variant personnalisé.
  • Les données du variant personnalisé (Dest) sont transtypées depuis TVarData dans le type enregistrement utilisé pour stocker ses données (TComplexVarData). Cela facilite le travail sur ces données.
  • La méthode fait une copie locale du variant source au lieu de travailler directement avec ses données. Cela évite les effets secondaires qui pourraient affecter les données source.

Lors du transtypage depuis un variant complexe vers un autre type, la méthode CastTo utilise également le type intermédiaire Double (pour tout type de destination autre que chaîne).

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;

Remarquez que la méthode CastTo prévoit le cas où les données variant source n'ont pas un code de type qui corresponde à la propriété VarType. Ce cas se produit uniquement pour les variants source vides (non affectés).

Voir aussi