Ecriture d'utilitaires fonctionnant avec un type variant personnalisé

De Appmethod Topics
Aller à : navigation, rechercher

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


Une fois que vous avez créé un descendant de TCustomVariantType pour implémenter votre type variant personnalisé, il est possible d'utiliser ce dernier dans des applications. Mais, sans un petit nombre d'utilitaires, ce n'est pas si simple.

C'est une bonne idée de concevoir une méthode qui crée une instance de votre type variant personnalisé à partir d'une valeur ou d'un ensemble de valeurs approprié. Cette fonction ou ensemble de fonctions remplit la structure que vous avez définie pour stocker les données de votre variant personnalisé. Par exemple, la fonction suivante pourrait être utilisée pour créer un variant à valeur complexe :

Object Pascal :

 function VarComplexCreate(const AReal, AImaginary: Double): Variant;
 begin
   VarClear(Result);
 TComplexVarData(Result).VType := ComplexVariantType.VarType;
 TComplexVarData(ADest).VComplex := TComplexData.Create(ARead, AImaginary);
 end;

Cette fonction n'existe pas en réalité dans l'unité VarCmplx, mais c'est une synthèse de méthodes existantes, utilisée pour simplifier l'exemple. Remarquez que le variant renvoyé est transtypé dans l'enregistrement qui a été défini pour correspondre à la structure TVarData (TComplexVarData), puis rempli.

Un autre utilitaire à créer est celui qui renvoie le code de type de votre nouveau type Variant. Ce code de type n'est pas une constante. Il est généré automatiquement quand vous instanciez votre descendant de TCustomVariantType. Il est donc utile pour fournir un moyen de déterminer facilement le code de type de votre variant personnalisé. La fonction suivante de l'unité VarCmplx illustre la façon de l'écrire, en renvoyant simplement la propriété VarType du descendant de TCustomVariantType :

Object Pascal :

 function VarComplex: TVarType;
 begin
 Result := ComplexVariantType.VarType;
 end;

Deux autres utilitaires standard fournis pour la plupart des variants personnalisés vérifient si un variant donné est du type personnalisé et transtypent un variant arbitraire dans le nouveau type personnalisé. Voici l'implémentation de ces utilitaires à partir de l'unité VarCmplx :

Object Pascal :

 function VarIsComplex(const AValue: Variant): Boolean;
 begin
 Result := (TVarData(AValue).VType and varTypeMask) = VarComplex;
 end;
 function VarAsComplex(const AValue: Variant): Variant;
 begin
 if not VarIsComplex(AValue) then
 VarCast(Result, AValue, VarComplex)
 else
 Result := AValue;
 end;

Remarquez qu'ils utilisent des fonctionnalités standard communes à tous les variants : le membre VType de l'enregistrement TVarData et la fonction VarCast, qui fonctionne à cause des méthodes implémentées dans le descendant de TCustomVariantType pour le transtypage des données.

En plus des utilitaires standard mentionnés plus haut, vous pouvez écrire un nombre quelconque d'utilitaires spécifiques à votre nouveau type variant personnalisé. Par exemple, l'unité VarCmplx définit un grand nombre de fonctions qui implémentent des opérations de calcul sur les variants à valeur complexe.

Voir aussi