Activation du transtypage
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'enregistrementrenvoyé. 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 depuisTVarData
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).