Thema: Delphi Maßeinheiten als Typen

Einzelnen Beitrag anzeigen

Raible

Registriert seit: 12. Mär 2012
30 Beiträge
 
#69

AW: Maßeinheiten als Typen

  Alt 16. Okt 2018, 13:55
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.
  Mit Zitat antworten Zitat