Einfache Umrechnungsfamilie erstellen und Maßeinheiten hinzufügen

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Maßeinheiten umrechnen


Sie können beispielsweise eine neue Umrechnungsfamilie definieren und Typen für neue Maßeinheiten hinzufügen, wenn Zeitangaben über lange Zeiträume umzurechnen sind (z.B. Monate in Jahrhunderte) und die Angabe durch die Umwandlung an Genauigkeit verlieren kann.

Dies soll anhand eines Beispiels näher erläutert werden. Die Familie cbTime verwendet als Grundeinheit Tage. Die Grundeinheit ist diejenige Einheit, die allen Umrechnungen innerhalb dieser Familie zugrunde gelegt wird. Folglich müssen alle Umrechnungen in Tagen erfolgen. Ungenauigkeiten können auftreten, wenn die Umrechnung mit der Einheit Monate oder einer größeren Einheit (Monate, Jahre, Jahrzehnte, Jahrhunderte, Jahrtausende) erfolgt, da zwischen Tagen und Monaten, Tagen und Jahren etc. keine genaue Umrechnung möglich ist. Monate haben eine unterschiedliche Länge. Bei Jahren müssen Schaltjahre berücksichtigt werden usw.

Werden in den Zeitangaben nur Maßeinheiten verwendet, die größer oder gleich Monate sind, dann kann eine genauere Umrechnungsfamilie mit der Grundeinheit Jahre erstellt werden. Im folgenden Beispiel wird eine neue Umrechnungsfamilie namens cbLongTime definiert.

Variablen deklarieren

Zuerst müssen Variablen für die Bezeichner deklariert werden. Die Bezeichner werden in der neuen Umrechnungsfamilie LongTime und den Maßeinheiten dieser Familie verwendet:

Delphi:

 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;

Umrechnungsfamilie registrieren

Als Nächstes muss die Umrechnungsfamilie registriert werden:

Delphi:

cbLongTime := RegisterConversionFamily ('Long Times');

C++:

cbLongTime := RegisterConversionFamily ("Long Times");

Obwohl die Prozedur UnregisterConversionFamily zur Verfügung steht, brauchen Sie die Registrierung von Umrechnungsfamilien nur dann aufzuheben, wenn die definierende Unit zur Laufzeit entfernt wird. Die Registrierung wird beim Beenden der Anwendung automatisch bereinigt.

Maßeinheiten registrieren

Anschließend müssen die Maßeinheiten der soeben erstellten Umrechnungsfamilie registriert werden. Hierzu wird die Funktion RegisterConversionType verwendet, die zur Registrierung von Maßeinheiten der angegebenen Familie dient. Sie müssen die Grundeinheit (in unserem Beispiel Jahre) definieren. Die übrigen Maßeinheiten werden mithilfe eines Umrechnungsfaktors festgelegt, der deren Verhältnis zur Grundeinheit bezeichnet. Beispielsweise wird für ltMonths der Faktor 1/12 angegeben, da die Familie LongTime die Grundeinheit Jahre hat. Sie können auch eine Beschreibung für die Einheiten angeben, in die umgerechnet wird.

Der Quelltext zur Registrierung der Maßeinheiten lautet wie folgt:

Delphi:

ltMonths := RegisterConversionType(cbLongTime,'Months',1/12);
ltYears := RegisterConversionType(cbLongTime,'Years',1);
ltDecades := RegisterConversionType(cbLongTime,'Decades',10);
ltCenturies := RegisterConversionType(cbLongTime,'Centuries',100);
ltMillennia := RegisterConversionType(cbLongTime,'Millennia',1000);

C++:

ltMonths = RegisterConversionType(cbLongTime, " Months ", 1 / 12);
ltYears = RegisterConversionType(cbLongTime, " Years ", 1);
ltDecades = RegisterConversionType(cbLongTime, " Decades ", 10);
ltCenturies = RegisterConversionType(cbLongTime, " Centuries ", 100);
ltMillennia = RegisterConversionType(cbLongTime, " Millennia ", 1000);

Neue Maßeinheiten verwenden

Die registrierten Maßeinheiten können jetzt in Umrechnungen verwendet werden. Die globale Funktion Convert kann Zeitangaben beliebig zwischen den in der Umrechnungsfamilie cbLongTime registrierten Einheiten umrechnen.

Anstelle des folgenden Aufrufs von Convert,

Delphi:

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

C++:

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

kann nun der folgende Aufruf für genauere Umrechnungen eingesetzt werden:

Delphi:

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

C++:

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

Siehe auch