変換関数の使用
計量単位の変換 への移動
変換がもっと複雑な場合には、別の構文を使用して、変換係数を使用するのではなく変換を実行する関数を指定することができます。 たとえば、変換係数を使って温度の値を変換することはできません。温度スケールによって基点が異なるからです。
以下の例は StdConvs ユニット内の関数を参考にしたものですが、ここでは、基本単位との間で変換を行う関数をいくつか紹介することで、変換型を登録する方法を示します。
変数の宣言
まず、識別子の変数を宣言します。これらの識別子は cbTemperature 変換ファミリで使用され、そのメンバが測定単位になります。
Delphi:
var
cbTemperature: TConvFamily;
tuCelsius: TConvType;
tuKelvin: TConvType;
tuFahrenheit: TConvType;
C++:
TConvFamily cbTemperature;
TConvType tuCelsius;
TConvType tuKelvin;
TConvType tuFahrenheit;
メモ: 上記の測定単位は、StdConvs ユニットに実際に登録されている温度単位のサブセットです。
変換ファミリの登録
次に、以下のように、この変換ファミリを登録します。
Delphi:
cbTemperature := RegisterConversionFamily ('Temperature');
C++:
cbTemperature = RegisterConversionFamily("Temperature");
基本単位の登録
次に、変換ファミリの基本単位(この例ではセ氏温度)を定義し登録します。なお、基本単位については、実行すべき変換が実際には存在しないため、以下のように、単純な変換係数を使用できます。
Delphi:
tuCelsius:=RegisterConversionType(cbTemperature,'Celsius',1);
C++:
tuCelsius = RegisterConversionType(cbTemperature, "Celsius", 1);
基本単位との間で変換するためのメソッドの作成
各温度スケールとセ氏温度の間の変換を実行する場合は、単純な変換係数に頼れないため、そのためのコードを書く必要があります。以下の関数は 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);
}
他の単位の登録
これで変換関数ができたので、この変換ファミリ内の他の測定単位を登録できます。その際、単位の記述も指定できます。
変換ファミリ内の他の単位を登録するコードを以下に示します。
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);
新しい単位の使用
これで、新規登録した単位を使用して、アプリケーションで変換を実行できます。cbTemperature 変換ファミリに登録した単位どうしであれば、その間の変換はグローバル関数 Convert で実行できます。たとえば、以下のコードでは、値をカ氏温度から絶対温度に変換しています。
Delphi:
Convert(StrToFloat(Edit1.Text), tuFahrenheit, tuKelvin);
C++:
Convert(StrToFloat(Edit1->Text), tuFahrenheit, tuKelvin);