Création d'une famille de conversion simple et ajout d'unités

De RAD Studio
Aller à : navigation, rechercher

Remonter à Conversion de mesures


Vous pouvez, par exemple, créer une nouvelle famille de conversion et ajouter de nouveaux types de mesure lorsque vous effectuez des conversions entre de longues périodes de temps (mois ou siècles), qui risquent d'être inexactes.

La famille cbTime utilise le jour comme unité de base. L'unité de base est celle qui est utilisée pour effectuer toutes les conversions à l'intérieur de cette famille. Donc, toutes les conversions doivent être faites en jours. Une perte de précision peut se produire lors de conversions utilisant comme unités le mois ou plus (année, décennie, siècle, millénaire), car la conversion entre jours et mois, jours et années, etc. n'est pas exacte. Les mois ont différentes longueurs, les années ont des facteurs de correction pour les années bissextiles, les secondes supplémentaires, etc.

Si vous utilisez uniquement des unités de mesure égales ou supérieures au mois, vous pouvez créer une famille de conversion plus précise en prenant l'année comme unité de base. Cet exemple crée une nouvelle famille de conversion nommée cbLongTime.

Déclaration des variables

D'abord, vous devez déclarer des variables pour les identificateurs. Les identificateurs sont utilisés dans la famille de conversion LongTime et les unités de mesure qui sont ses membres :

Delphi :

 var
 cbLongTime: TConvFamily;
 ltMonths: TConvType;
 ltYears: TConvType;
 ltDecades: TConvType;
 ltCenturies: TConvType;
 ltMillennia: TConvType;

C++ :

 tConvFamily cbLongTime;
 TConvType ltMonths;
 TConvType ltYears;
 TConvType ltDecades;
 TConvType ltCenturies;
 TConvType ltMillennia;

Recensement de la famille de conversion

Ensuite, recensez la famille de conversion :

Delphi :

 cbLongTime := RegisterConversionFamily ('Longues durées');

C++ :

 cbLongTime := RegisterConversionFamily ("Longues durées");

Bien que la procédure UnregisterConversionFamily soit fournie, il n'est pas nécessaire de dé-recenser les familles de conversion si l'unité qui les définit n'est pas supprimée à l'exécution. Elles sont automatiquement nettoyées quand l'application s'arrête.

Recensement des unités de mesure

Ensuite, vous devez recenser les unités de mesure dans la famille de conversion que vous venez de créer. Utilisez la fonction RegisterConversionType, qui recense les unités de mesure dans une famille spécifiée. Vous devez définir l'unité de base, ici l'année, et les autres unités en utilisant un facteur indiquant leur rapport avec l'unité de base. Le facteur de ltMonths est ainsi 1/12 puisque l'unité de base de la famille LongTime est l'année. Vous fournissez également la description des unités dans lesquelles vous effectuez la conversion.

Le code de recensement des unités de mesure est le suivant :

Delphi :

 ltMonths:=RegisterConversionType(cbLongTime,'Mois',1/12);
 ltYears:=RegisterConversionType(cbLongTime,'Années',1);
 ltDecades:=RegisterConversionType(cbLongTime,'Décennies',10);
 ltCenturies:=RegisterConversionType(cbLongTime,'Siècles',100);
 ltMillennia:=RegisterConversionType(cbLongTime,'Millénaires',1000);

C++ :

 ltMonths = RegisterConversionType(cbLongTime,"Mois",1/12);
 ltYears = RegisterConversionType(cbLongTime,"Années",1);
 ltDecades = RegisterConversionType(cbLongTime,"Décennies",10);
 ltCenturies = RegisterConversionType(cbLongTime,"Siècles",100);
 ltMillennia = RegisterConversionType(cbLongTime,"Millénaires",1000);

Utilisation des nouvelles unités

Vous pouvez maintenant utiliser les unités que vous venez de recenser afin d'effectuer des conversions. La fonction Convert globale peut effectuer la conversion entre tous les types recensés dans la famille de conversion cbLongTime.

Ainsi, au lieu d'utiliser l'appel Convert suivant,

Delphi :

 Convert(StrToFloat(Edit1.Text),tuMonths,tuMillennia);

C++ :

 Convert(StrToFloat(Edit1->Text),tuMonths,tuMillennia);

vous pouvez utiliser celui-ci pour obtenir une meilleure précision :

Delphi :

 Convert(StrToFloat(Edit1.Text),ltMonths,ltMillennia);

C++ :

 Convert(StrToFloat(Edit1->Text),ltMonths,ltMillennia);

Voir aussi