Utilisation d'une fonction de conversion
Remonter à Conversion de mesures
Dans les cas où la conversion est plus complexe, vous pouvez utiliser une syntaxe différente et spécifier une fonction qui effectue la conversion au lieu d'utiliser un facteur de conversion. Par exemple, vous ne pouvez pas convertir des températures à l'aide d'un facteur de conversion, puisque les échelles de température ont des origines différentes.
Cet exemple, pris dans l'unité StdConvs, montre comment recenser un type de conversion en fournissant des fonctions de conversion depuis et vers les unités de base.
Sommaire
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 cbTemperature et les unités de mesure sont ses membres :
Delphi :
var
cbTemperature: TConvFamily;
tuCelsius: TConvType;
tuKelvin: TConvType;
tuFahrenheit: TConvType;
C++ :
TConvFamily cbTemperature;
TConvType tuCelsius;
TConvType tuKelvin;
TConvType tuFahrenheit;
Remarque : Les unités de mesure présentées ici forment un sous-ensemble des unités de température réellement recensées dans l'unité StdConvs.
Recensement de la famille de conversion
Ensuite, recensez la famille de conversion :
Delphi :
cbTemperature := RegisterConversionFamily ('Temperature');
C++ :
cbTemperature = RegisterConversionFamily("Temperature");
Recensement de l'unité de base
Ensuite, définissez et recensez l'unité de base de la famille de conversion, qui est dans cet exemple le degré Celsius. Remarquez que dans le cas de l'unité de base, nous pouvons utiliser un facteur de conversion simple, car il n'y a pas de conversion réelle à effectuer :
Delphi :
tuCelsius:=RegisterConversionType(cbTemperature,'Celsius',1);
C++ :
tuCelsius = RegisterConversionType(cbTemperature, "Celsius", 1);
Ecriture des méthodes de conversion vers et depuis l'unité de base
Vous devez écrire le code qui effectue la conversion pour chaque échelle de température à destination et à partir des degrés Celsius, car celles-ci ne peuvent pas se baser sur un facteur simple. Ces fonctions sont prises dans l'unité StdConvs :
Delphi :
function FahrenheitToCelsius(const AValue: Double): Double;
begin
Result := ((AValue - 32) * 5) / 9;
end;
function CelsiusToFahrenheit(const AValue: Double): Double;
begin
Result := ((AValue * 9) / 5) + 32;
end;
function KelvinToCelsius(const AValue: Double): Double;
begin
Result := AValue - 273.15;
end;
function CelsiusToKelvin(const AValue: Double): Double;
begin
Result := AValue + 273.15;
end;
C++ :
double __fastcall FahrenheitToCelsius(const double AValue) {
return (((AValue - 32) * 5) / 9);
}
double __fastcall CelsiusToFahrenheit(const double AValue) {
return (((AValue * 9) / 5) + 32);
}
double __fastcall KelvinToCelsius(const double AValue) {
return (AValue - 273.15);
}
double __fastcall CelsiusToKelvin(const double AValue) {
return (AValue + 273.15);
}
Recensement des autres unités
Maintenant que vous disposez des fonctions de conversion, vous pouvez recenser les autres unités de mesure dans la famille de conversion. Vous incluez également la description des unités.
Le code de recensement des autres unités de la famille est le suivant :
Delphi :
tuKelvin := RegisterConversionType(cbTemperature, 'Kelvin', KelvinToCelsius, CelsiusToKelvin);
tuFahrenheit := RegisterConversionType(cbTemperature, 'Fahrenheit', FahrenheitToCelsius, CelsiusToFahrenheit);
C++ :
tuKelvin = RegisterConversionType(cbTemperature, "Kelvin", KelvinToCelsius,
CelsiusToKelvin);
tuFahrenheit = RegisterConversionType(cbTemperature, "Fahrenheit",
FahrenheitToCelsius, CelsiusToFahrenheit);
Utilisation des 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 effectuer la conversion entre tous les types recensés dans la famille de conversion cbTemperature. Par exemple, le code suivant permet de convertir en degrés Kelvin une valeur exprimée en degrés Fahrenheit.
Delphi :
Convert(StrToFloat(Edit1.Text), tuFahrenheit, tuKelvin);
C++ :
Convert(StrToFloat(Edit1->Text), tuFahrenheit, tuKelvin);