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

De Appmethod Topics
Aller à : navigation, rechercher

Remonter à Utilisation de la RTL - Index

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.

Pour mieux comprendre, 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 :

Object Pascal :

 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 :

Object Pascal :

 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 :

Object Pascal :

 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,

Object Pascal :

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

C++ :

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

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

Object Pascal :

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

C++ :

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

Voir aussi