Copie et effacement des variants personnalisés

De RAD Studio
Aller à : navigation, rechercher

Remonter à Définition de variants personnalisés - Index


En plus du transtypage et de l'implémentation des opérateurs, vous devez indiquer comment copier et effacer les variants de votre type Variant personnalisé.

Pour indiquer comment copier la valeur du variant, implémentez la méthode System.Variants.TCustomVariantType.Copy. En général, c'est une opération simple, même si vous ne devez pas oublier de libérer la mémoire de toute classe ou structure utilisée pour contenir la valeur du variant.

Delphi :

 procedure TComplexVariantType.Copy(var Dest: TVarData; const Source: TVarData; const Indirect: Boolean);
 begin
   if Indirect and VarDataIsByRef(Source) then
     VarDataCopyNoInd(Dest, Source)
   else
     with TComplexVarData(Dest) do
     begin
       VType := VarType;
       VComplex := TComplexData.Create(TComplexVarData(Source).VComplex);
     end;
 end;
Remarque :  Le paramètre Indirect de la méthode Copy signale que la copie doit prendre en compte le cas où le variant contient une référence indirecte à ses données.
Conseil :  Si votre type variant personnalisé n'alloue pas de mémoire pour contenir ses données (les données tiennent entièrement dans l'enregistrement TVarData), votre implémentation de la méthode Copy peut simplement appeler la méthode SimplisticCopy.

Pour indiquer comment effacer la valeur du variant, implémentez la méthode Clear. Comme avec la méthode Copy, la seule chose compliquée à faire est de libérer d'éventuelles ressources allouées pour stocker les données du variant.

Delphi:

 procedure TComplexVariantType.Clear(var V: TVarData);
 begin
   V.VType := varEmpty;
   FreeAndNil(TComplexVarData(V).VComplex);
 end;

Vous aurez également besoin d'implémenter la méthode IsClear. De cette façon, vous pourrez détecter d'éventuelles valeurs incorrectes ou des valeurs spéciales qui représentent des données vides.

Delphi :

 function TComplexVariantType.IsClear(const V: TVarData): Boolean;
 begin
   Result := (TComplexVarData(V).VComplex = nil) or
   TComplexVarData(V).VComplex.IsZero;
 end;

Voir aussi