Hallo zusammen,
ich habe mal einen record für Werte mit SI-Einheit umgesetzt.
Code:
TSIValue = record
Value : double;
UnitExpr : TSIUnitExpression;
...
TSIUnitExpression = record
private
FUnitArray :TSIUnitArray;
...
TSIUnitArray = TArray<TSIUnit>;
TSIUnit = record
Praefix :TSIPraefix;
UnitTyp :TSIUnitTyp;
Power :shortint;
...
{$SCOPEDENUMS ON}
TSIPraefix = (
Yotta,
Zetta,
Exa,
Peta,
Tera,
Giga,
Mega,
Kilo,
Hekto,
Deka,
None,
Dezi,
Zenti,
Milli,
Mikro,
Nano,
Piko,
Femto,
Atto,
Zepto,
Yokto);
TSIUnitTyp = (
None,
//SI Basiseinheiten
Metre,
Gramm,
Second,
Ampere,
Kelvin,
Mole,
Candela,
//nicht SI Basiseinheiten
Euro,
//Abgeleitete SI-Einheiten
Newton,
Joule,
Watt,
Coulomb,
Volt,
Ohm,
Farad,
&Pascal,
Bar
);
{$SCOPEDENUMS OFF}
die Einheit TSIUnit setzt sich dabei aus einem Einheitentyp (m, sec, g, ...), einem Faktor (TSIPraefix G, M, k, ...) und einer Potenz zusammen. Die Potenz ist wichtig für zB. m² oder für Einheiten im Nenner.
TSIUnitExpression definiert eine Liste von TSIUnit die miteinander Multipliziert die eigentliche Einheit darstellt.
Hier kann dann z.B N = kg*m/sec² realisiert werden.
Möchte man zwei TSIValue miteinander verrechnen müssen auch die TSIUnitExpression mathematisch korrekt verrechnet werden.
Beispiel:
Code:
var
Masse:TSIValue;
Laenge:TSIValue;
Zeit:TSIValue;
Kraft:TSIValue;
Text:string;
begin
Masse := '5 kg'
Laenge:= '123 cm';
Zeit := '10 s';
Kraft := Masse * Laenge / (Zeit * Zeit);
Text := Kraft; // Text='0.06 m*kg/s²'
Bei Interesse könnte ich den Code
auch zur Verfügung stellen.
Allerdings benötige ich dann etwas
Hilfe bei Lizenzierungsfragen.