Utilisation d'une classe pour gérer les conversions (C++)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Conversion de mesures (C++)

Vous pouvez toujours utiliser les fonctions de conversion pour recenser une unité de conversion. Il existe cependant des cas où il est nécessaire de créer un nombre inutilement grand de fonctions qui font toutes essentiellement la même chose.

Si vous pouvez écrire un ensemble de fonctions de conversion qui diffèrent seulement par la valeur d'un paramètre ou d'une variable, vous pouvez créer une classe pour gérer ces conversions. Par exemple, il existe un ensemble de techniques standard pour les conversions entre les diverses monnaies européennes depuis l'introduction de l'euro. Bien que les facteurs de conversion restent constants (contrairement au facteur de conversion entre les dollars et les euros, par exemple), vous ne pouvez pas utiliser un facteur de conversion simple pour convertir correctement les monnaies européennes, pour deux raisons :

  • La conversion doit arrondir à un nombre de décimales spécifique à la monnaie.
  • L'approche facteur de conversion utilise un facteur inverse à celui spécifié par les conversions standard en euro.

Tout peut cependant être géré par les fonctions de conversion de la façon suivante :

 double __fastcall FromEuro(const double AValue, const double Factor,
     TRoundToRange FRound) {
     return(RoundTo(AValue * Factor, FRound));
 }
 
 double __fastcall ToEuro(const double AValue, const double Factor) {
     return (AValue / Factor);
 }

Le problème est que cette approche nécessite des paramètres supplémentaires sur la fonction de conversion, ce qui signifie que vous ne pouvez pas recenser simplement la même fonction avec chaque monnaie européenne. Afin d'éviter d'écrire deux nouvelles fonctions de conversion pour chacune des monnaies européennes, vous pouvez utiliser le même couple de fonctions en les rendant membres d'une classe.

Création de la classe de conversion

La classe doit être un descendant de TConvTypeFactor. TConvTypeFactor définit deux méthodes, ToCommon et FromCommon, pour convertir vers et depuis les unités de base d'une famille de conversion (dans ce cas, vers et depuis les euros). Comme les fonctions que vous utilisez directement pour le recensement d'une unité de conversion, ces méthodes n'ont pas de paramètres supplémentaires, et vous devez fournir le nombre de chiffres de l'arrondi et le facteur de conversion en tant que membres privés de votre classe de conversion. Ce point est illustré dans l'exemple EuroConv du répertoire demos\ConvertIt (voir euroconv.pas) :

 class PASCALIMPLEMENTATION TConvTypeEuroFactor
 		: public Convutils::TConvTypeFactor {
 private:
 	TRoundToRange FRound;
 
 public:
 	__fastcall TConvTypeEuroFactor(const TConvFamily AConvFamily,
 			const AnsiString ADescription, const double AFactor,
 			const TRoundToRange ARound);
 	TConvTypeFactor(AConvFamily, ADescription, AFactor);
 	virtual double ToCommon(const double AValue);
 	virtual double FromCommon(const double AValue);
 }

Le constructeur assigne des valeurs à ces membres privés :

 __fastcall TConvTypeEuroFactor::TConvTypeEuroFactor
     (const TConvFamily AConvFamily, const AnsiString ADescription,
     const double AFactor, const TRoundToRange ARound)
     : TConvTypeFactor(AConvFamily, ADescription, AFactor); {
     FRound = ARound;
 }

Les deux fonctions de conversion utilisent simplement ces membres privés :

 virtual double TConvTypeEuroFactor::ToCommon(const double AValue) {
     return (RoundTo(AValue * Factor, FRound));
 }
 
 virtual double TConvTypeEuroFactor::ToCommon(const double AValue) {
     return (AValue / Factor);
 }

Déclarer les variables

Maintenant que vous disposez d'une classe de conversion, commencez comme avec toute autre famille de conversion, en déclarant les identificateurs :

 TConvFamily cbEuro;
 TConvType euEUR; // EU euro
 TConvType euBEF; // Belgian francs
 TConvType euDEM; // German marks
 TConvType euGRD; // Greek drachmas
 TConvType euESP; // Spanish pesetas
 TConvType euFFR; // French francs
 TConvType euIEP; // Irish pounds
 TConvType euITL; // Italian lire
 TConvType euLUF; // Luxembourg francs
 TConvType euNLG; // Dutch guilders
 TConvType euATS; // Austrian schillings
 TConvType euPTE; // Protuguese escudos
 TConvType euFIM; // Finnish marks

Recenser la famille de conversion et les autres unités

Vous êtes maintenant prêt à recenser la famille de conversion et les unités monétaires européennes, en utilisant votre nouvelle classe de conversion. Recensez la famille de conversion de la même manière que vous avez recensé les autres familles de conversion :

 cbEuro = RegisterConversionFamily("European currency");

Pour recenser chaque type de conversion, créez une instance de la classe de conversion qui reflète les propriétés de facteur et d'arrondi de cette monnaie, et appelez la méthode RegisterConversionType :

 TConvTypeInfo *pInfo = new TConvTypeEuroFactor(cbEuro, " EUEuro ", 1.0, -2);
 if (!RegisterConversionType(pInfo, euEUR))
 	delete pInfo;
 pInfo = new TConvTypeEuroFactor(cbEuro, " BelgianFrancs ", 40.3399, 0);
 if (!RegisterConversionType(pInfo, euBEF))
 	delete pInfo;
 pInfo = new TConvTypeEuroFactor(cbEuro, " GermanMarks ", 1.95583, -2);
 if (!RegisterConversionType(pInfo, euDEM))
 	delete pInfo;
 pInfo = new TConvTypeEuroFactor(cbEuro, " GreekDrachmas ", 340.75, 0);
 if (!RegisterConversionType(pInfo, euGRD) delete pInfo;
 pInfo = new TConvTypeEuroFactor(cbEuro, " SpanishPesetas ", 166.386, 0);
 if (!RegisterConversionType(pInfo, euESP) delete pInfo;
 pInfo = new TConvTypeEuroFactor(cbEuro, " FrenchFrancs ", 6.55957, -2);
 if (!RegisterConversionType(pInfo, euFFR) delete pInfo;
 pInfo = new TConvTypeEuroFactor(cbEuro, " IrishPounds ", 0.787564, -2);
 if (!RegisterConversionType(pInfo, euIEP) delete pInfo;
 pInfo = new TConvTypeEuroFactor(cbEuro, " ItalianLire ", 1936.27, 0);
 if (!RegisterConversionType(pInfo, euITL) delete pInfo;
 pInfo = new TConvTypeEuroFactor(cbEuro, " LuxembourgFrancs ", 40.3399, -2);
 if (!RegisterConversionType(pInfo, euLUF) delete pInfo;
 pInfo = new TConvTypeEuroFactor(cbEuro, " DutchGuilders ", 2.20371, -2);
 if (!RegisterConversionType(pInfo, euNLG) delete pInfo;
 pInfo = new TConvTypeEuroFactor(cbEuro, " AutstrianSchillings ", 13.7603, -2);
 if (!RegisterConversionType(pInfo, euATS) delete pInfo;
 pInfo = new TConvTypeEuroFactor(cbEuro, " PortugueseEscudos ", 200.482, -2);
 if (!RegisterConversionType(pInfo, euPTE) delete pInfo;
 pInfo = new TConvTypeEuroFactor(cbEuro, " FinnishMarks ", 5.94573, 0);
 if (!RegisterConversionType(pInfo, euFIM) delete pInfo;

Utiliser les nouvelles unités

Vous pouvez maintenant utiliser les unités que vous venez de recenser pour effectuer des conversions dans vos applications. La fonction Convert globale peut convertir toutes les monnaies européennes que vous avez recensées avec la nouvelle famille cbEuro. Par exemple, le code suivant convertit en marks allemands une valeur exprimée en lires italiennes :

 Edit2->Text = FloatToStr(Convert(StrToFloat(Edit1->Text), euITL, euDEM));

Voir aussi