Utilisation d'une fonction de conversion

De Appmethod Topics
Aller à : navigation, rechercher

Remonter à Utilisation de la RTL - Index

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.

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 :


var
cbTemperature: TConvFamily;
tuCelsius: TConvType;
tuKelvin: TConvType;
tuFahrenheit: TConvType;
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 :


cbTemperature := RegisterConversionFamily ('Temperature');
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 :


tuCelsius:=RegisterConversionType(cbTemperature,'Celsius',1);
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 :


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;
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 :


tuKelvin := RegisterConversionType(cbTemperature, 'Kelvin', KelvinToCelsius, CelsiusToKelvin);
tuFahrenheit := RegisterConversionType(cbTemperature, 'Fahrenheit', FahrenheitToCelsius, CelsiusToFahrenheit);
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.


Convert(StrToFloat(Edit1.Text), tuFahrenheit, tuKelvin);
Convert(StrToFloat(Edit1->Text), tuFahrenheit, tuKelvin);


Voir aussi