Browse Source

* redivided identifiers over units in a more delphi compat way. Still needs internal rework of convutils to classes. See 7481)

git-svn-id: trunk@5734 -
marco 18 years ago
parent
commit
e459f8a26f
2 changed files with 535 additions and 474 deletions
  1. 37 474
      rtl/objpas/convutil.inc
  2. 498 0
      rtl/objpas/stdconvs.pp

+ 37 - 474
rtl/objpas/convutil.inc

@@ -31,169 +31,6 @@ Type TConvType        = type Integer;
      TConvTypeArray   = array of TConvType;
      TConversionProc  = function(const AValue: Double): Double;
 
-var
-
-{cbArea family}
-
-  auSquareMillimeters,
-  auSquareCentimeters,
-  auSquareDecimeters,
-  auSquareMeters,
-  auSquareDecameters,
-  auSquareHectometers,
-  auSquareKilometers,
-  auSquareInches,
-  auSquareFeet  ,
-  auSquareYards ,
-  auSquareMiles,
-  auAcres       ,
-  auCentares    ,
-  auAres        ,
-  auHectares    ,
-  auSquareRods  ,
-
-{cbDistance family}
-
-  duMicromicrons,
-  duAngstroms   ,
-  duMillimicrons,
-  duMicrons,
-  duMillimeters,
-  duCentimeters,
-  duDecimeters,
-  duMeters,
-  duDecameters,
-  duHectometers,
-  duKilometers,
-  duMegameters,
-  duGigameters,
-  duInches,
-  duFeet,
-  duYards,
-  duMiles       ,
-  duNauticalMiles,
-  duAstronomicalUnits,
-  duLightYears,
-  duParsecs,
-  duCubits,
-  duFathoms,
-  duFurlongs,
-  duHands,
-  duPaces,
-  duRods,
-  duChains,
-  duLinks,
-  duPicas,
-  duPoints,
-
-{cbMass family}
-
-  muNanograms,
-  muMicrograms,
-  muMilligrams,
-  muCentigrams,
-  muDecigrams,
-  muGrams,
-  muDecagrams,
-  muHectograms,
-  muKilograms,
-  muMetricTons,
-  muDrams,
-  muGrains,
-  muLongTons,
-  muTons,
-  muOunces,
-  muPounds,
-  muStones,
-
-{cbTemperature family}
-
-  tuCelsius,
-  tuKelvin,
-  tuFahrenheit,
-  tuRankine,
-  tuReamur,
-
-{
-cbTime family
-}
-
-  tuMilliSeconds,
-  tuSeconds,
-  tuMinutes,
-  tuHours,
-  tuDays,
-  tuWeeks,
-  tuFortnights,
-  tuMonths,
-  tuYears,
-  tuDecades,
-  tuCenturies,
-  tuMillennia,
-  tuDateTime,
-  tuJulianDate,
-  tuModifiedJulianDate,
-
-{
-cbVolume family
-}
-
-  vuCubicMillimeters,
-  vuCubicCentimeters,
-  vuCubicDecimeters,
-  vuCubicMeters,
-  vuCubicDecameters,
-  vuCubicHectometers,
-  vuCubicKilometers,
-  vuCubicInches,
-  vuCubicFeet,
-  vuCubicYards,
-  vuCubicMiles,
-  vuMilliLiters,
-  vuCentiLiters,
-  vuDeciLiters,
-  vuLiters,
-  vuDecaLiters,
-  vuHectoLiters,
-  vuKiloLiters,
-  vuAcreFeet,
-  vuAcreInches,
-  vuCords,
-  vuCordFeet,
-  vuDecisteres,
-  vuSteres,
-  vuDecasteres,
-  vuFluidGallons,
-  vuFluidQuarts,
-  vuFluidPints,
-  vuFluidCups,
-  vuFluidGills,
-  vuFluidOunces,
-  vuFluidTablespoons,
-  vuFluidTeaspoons,
-  vuDryGallons,
-  vuDryQuarts,
-  vuDryPints,
-  vuDryPecks,
-  vuDryBuckets,
-  vuDryBushels,
-  vuUKGallons,
-  vuUKPottles,
-  vuUKQuarts,
-  vuUKPints,
-  vuUKGills,
-  vuUKOunces,
-  vuUKPecks,
-  vuUKBuckets,
-  vuUKBushels     : TConvType;
-
-var
-    cbArea        : TConvFamily;
-    cbDistance    : TConvFamily;
-    cbMass        : TConvFamily;
-    cbTemperature : TConvFamily;
-    cbTime        : TConvFamily;
-    cbVolume      : TConvFamily;
 
 Type  TConvUtilFloat = double;
 
@@ -223,144 +60,30 @@ Type
      property Description: String      read FDescription;
   end;
 
+  TConvTypeFactor = class(TConvTypeInfo)
+  private
+    FFactor: Double;
+  protected
+    property Factor: Double read FFactor;
+  public
+    constructor Create(const AConvFamily: TConvFamily; const ADescription: string;
+      const AFactor: Double);
+    function ToCommon(const AValue: Double): Double; override;
+    function FromCommon(const AValue: Double): Double; override;
+  end;
 
-Implementation
+  TConvTypeProcs = class(TConvTypeInfo)
+  private
+    FToProc: TConversionProc;
+    FFromProc: TConversionProc;
+  public
+    constructor Create(const AConvFamily: TConvFamily; const ADescription: string;
+      const AToProc, AFromProc: TConversionProc);
+    function ToCommon(const AValue: Double): Double; override;
+    function FromCommon(const AValue: Double): Double; override;
+  end;
 
-ResourceString  // Note, designations for FFU's are guesses.
-
-  txtauSquareMillimeters   = 'Square millimeters (mm^2)';
-  txtauSquareCentimeters   = 'Square centimeters (cm^2)';
-  txtauSquareDecimeters    = 'Square decimeters (dm^2)';
-  txtauSquareMeters        = 'Square meters (m^2)';
-  txtauSquareDecameters    = 'Square decameters (dam^2)';
-  txtauSquareHectometers   = 'Square hectometers (hm^2)';
-  txtauSquareKilometers    = 'Square kilometers (km^2)';
-  txtauSquareInches        = 'Square inch (in^2)';
-  txtauSquareFeet          = 'Square feet (ft^2)';
-  txtauSquareYards         = 'Square yards (yd^2)';
-  txtauSquareMiles         = 'Square miles  (mi^2)';
-  txtauAcres               = 'Square acres (acre^2)';
-  txtauCentares            = 'Centares (care^2)';
-  txtauAres                = 'Ares (are=dam^2)';
-  txtauHectares            = 'Hectares (ha=hm^2)';
-  txtauSquareRods          = 'Square Rods (sqr)';
-  txtduMicromicrons        = 'micro microms (mumum)';
-  txtduAngstroms           = 'Aengstroem (ang)';
-  txtduMillimicrons        = 'millimicroms (mmum)';
-  txtduMicrons             = 'microns (um)';
-  txtduMillimeters         = 'millimeters (mm)';
-  txtduCentimeters         = 'centimeters (cm)';
-  txtduDecimeters          = 'decimeters (dm)';
-  txtduMeters              = 'meters (m)';
-  txtduDecameters          = 'decameters (dam)';
-  txtduHectometers         = 'hectometers (hm)';
-  txtduKilometers          = 'kilometers (km)';
-  txtduMegameters          = 'megameters (Mm)';
-  txtduGigameters          = 'gigameters (Gm)';
-  txtduInches              = 'inches (in)';
-  txtduFeet                = 'feet (ft)';
-  txtduYards               = 'yards (yd)';
-  txtduMiles               = 'miles (mi)';
-  txtduNauticalMiles       = 'nautical miles (nmi)';
-  txtduAstronomicalUnits   = 'astronomical units (au)';
-  txtduLightYears          = 'light years (ly)';
-  txtduParsecs             = 'Parsec (Ps)';
-  txtduCubits              = 'Cubits (cb)';
-  txtduFathoms             = 'Fathom (Fth)';
-  txtduFurlongs            = 'Furlongs (furl)';
-  txtduHands               = 'Hands (hnd)';
-  txtduPaces               = 'Paces (pc)';
-  txtduRods                = 'Rods (rd)';
-  txtduChains              = 'Chains (ch)';
-  txtduLinks               = 'Links (lnk)';
-  txtduPicas               = 'Pica''s (pc)';
-  txtduPoints              = 'Points (pnts)';           // carat/Karaat 2E-6 gram ?
-  txtmuNanograms           = 'nanograms (ng)';
-  txtmuMicrograms          = 'micrograms (um)';
-  txtmuMilligrams          = 'milligrams (mg)';
-  txtmuCentigrams          = 'centigrams (cg)';
-  txtmuDecigrams           = 'decigrams (dg)';
-  txtmuGrams               = 'grams (g)';
-  txtmuDecagrams           = 'decagrams (dag)';
-  txtmuHectograms          = 'hectograms (hg)';
-  txtmuKilograms           = 'kilograms (kg)';
-  txtmuMetricTons          = 'metric ton (t)';
-  txtmuDrams               = 'dramgs (??)';
-  txtmuGrains              = 'grains (??)';
-  txtmuLongTons            = 'longton (??)';
-  txtmuTons                = 'imperial ton (??)'; // calling metric ton "ton" is normal in metric countries
-  txtmuOunces              = 'ounce (??)';
-  txtmuPounds              = 'pounds (??)';     // what kind? Metric pound =0.5
-  txtmuStones              = 'stones (??)';
-  txttuCelsius             = 'degrees Celsius (degC)';
-  txttuKelvin              = 'degrees Kelvin (K)';
-  txttuFahrenheit          = 'degrees Fahrenheit (degF)';
-  txttuRankine             = 'degrees Rankine (degR)';
-  txttuReamur              = 'degrees Reamur (degReam)';
-  txttuMilliSeconds        = 'milli seconds (ms)';
-  txttuSeconds             = 'seconds (s)';
-  txttuMinutes             = 'minutes (min)';
-  txttuHours               = 'hours (hr)';
-  txttuDays                = 'days (days)';
-  txttuWeeks               = 'weeks (weeks)';
-  txttuFortnights          = 'Fortnights (??)';
-  txttuMonths              = 'Months (months)';
-  txttuYears               = 'Years (years)';
-  txttuDecades             = 'Decades (decades)';
-  txttuCenturies           = 'Centuries (centuries)';
-  txttuMillennia           = 'Millennia (millenia)';
-  txttuDateTime            = 'DateTime (??)';
-  txttuJulianDate          = 'JulianDate (??)';
-  txttuModifiedJulianDate  = 'Modified JulianData (??)';
-
-  txtvuCubicMillimeters    = 'cubic millimeters (mm^3)';
-  txtvuCubicCentimeters    = 'cubic centimeters (cm^3)';
-  txtvuCubicDecimeters     = 'cubic decimeters (dm^3)';
-  txtvuCubicMeters         = 'cubic meters (m^3)';
-  txtvuCubicDecameters     = 'cubic decameters (dam^3)';
-  txtvuCubicHectometers    = 'cubic hectometers (hm^3)';
-  txtvuCubicKilometers     = 'cubic kilometers (km^3)';
-  txtvuCubicInches         = 'cubic inches (in^3)';
-  txtvuCubicFeet           = 'cubic feet (ft^3)';
-  txtvuCubicYards          = 'cubic yards (yd^3)';
-  txtvuCubicMiles          = 'cubic miles (mi^3)';
-  txtvuMilliLiters         = 'milliliters (ml)';
-  txtvuCentiLiters         = 'centiliters (cl)';
-  txtvuDeciLiters          = 'deciliters (dl)';
-  txtvuLiters              = 'liters (l)';
-  txtvuDecaLiters          = 'decaliters (dal)';
-  txtvuHectoLiters         = 'hectoliters (hl)';
-  txtvuKiloLiters          = 'kiloliters (kl)';
-  txtvuAcreFeet            = 'acrefeet (acre ft)';
-  txtvuAcreInches          = 'acreinches (acre in)';
-  txtvuCords               = 'cords (??)';
-  txtvuCordFeet            = 'cordfeet (??)';
-  txtvuDecisteres          = 'decisteres (??)';
-  txtvuSteres              = 'steres (??)';
-  txtvuDecasteres          = 'decasteres (??)';
-  txtvuFluidGallons        = 'US fluid gallons (fl gal)';
-  txtvuFluidQuarts         = 'US fluid Quarts (fl Quart)';
-  txtvuFluidPints          = 'US fluid Pints (fl pints)';
-  txtvuFluidCups           = 'US fluid Cups (fl Cups)';
-  txtvuFluidGills          = 'US fluid Gills (fl Quart)';
-  txtvuFluidOunces         = 'US fluid Ounces (fl Ounces)';
-  txtvuFluidTablespoons    = 'US fluid Tablespoons (fl Tablespoons)';
-  txtvuFluidTeaspoons      = 'US fluid teaspoons (fl teaspoon)';
-  txtvuDryGallons          = 'US dry gallons (dr gal)';
-  txtvuDryQuarts           = 'US dry Quarts (dr Quart)';
-  txtvuDryPints            = 'US dry Pints (dr pints)';
-  txtvuDryPecks            = 'US dry pecks (dr pecks)';
-  txtvuDryBuckets          = 'US dry buckets (dr buckets)';
-  txtvuDryBushels          = 'US dry bushels (dr bushels)';
-  txtvuUKGallons           = 'UK gallons (fl gal)';
-  txtvuUKPottles           = 'UK Pottles (fl pttle)';
-  txtvuUKQuarts            = 'UK Quarts (fl Quart)';
-  txtvuUKPints             = 'UK Pints (fl pints)';
-  txtvuUKGills             = 'UK Gills (fl Quart)';
-  txtvuUKOunces            = 'UK Ounces (fl Ounces)';
-  txtvuUKPecks             = 'UK pecks (dr pecks)';
-  txtvuUKBuckets           = 'UK buckets (dr buckets)';
-  txtvuUKBushels           = 'UK bushels (dr bushels)';
+Implementation
 
 Type ResourceData = record
                       Description : String;
@@ -518,200 +241,40 @@ begin
   FConvFamily :=AConvFamily;
 end;
 
-  // initial FFU factors from a HP48g calculator and BSD units program. However after
-  //    a while, the bushels/forthnight got boring, so please check.
-  // undefined/uncertain factors get -1, and convert() functions
-  // should check that and bomb on it.
-
-procedure RegisterArea;
 
+constructor TConvTypeFactor.Create(const AConvFamily: TConvFamily; const ADescription: string;const AFactor: Double);
 begin
-  auSquareMillimeters := RegisterConversionType(cbArea,txtauSquareMillimeters,1E-6);
-  auSquareCentimeters := RegisterConversionType(cbArea,txtauSquareCentimeters,1E-4);
-  auSquareDecimeters  := RegisterConversionType(cbArea,txtauSquareDecimeters,1E-2);
-  auSquareMeters      := RegisterConversionType(cbArea,txtauSquareMeters,1);
-  auSquareDecameters  := RegisterConversionType(cbArea,txtauSquareDecameters,1E2);
-  auSquareHectometers := RegisterConversionType(cbArea,txtauSquareHectometers,1E4);
-  auSquareKilometers  := RegisterConversionType(cbArea,txtauSquareKilometers,1E6);
-  auSquareInches      := RegisterConversionType(cbArea,txtauSquareInches,0.00064516);
-  auSquareFeet        := RegisterConversionType(cbArea,txtauSquareFeet,0.092903040);
-  auSquareYards       := RegisterConversionType(cbArea,txtauSquareYards,0.83612736);
-  auSquareMiles       := RegisterConversionType(cbArea,txtauSquareMiles,2589988.11034);
-  auAcres             := RegisterConversionType(cbArea,txtauAcres,4046.87260987);
-  auCentares          := RegisterConversionType(cbArea,txtauCentares,-1);
-  auAres              := RegisterConversionType(cbArea,txtauAres,100);
-  auHectares          := RegisterConversionType(cbArea,txtauHectares,10000);
-  auSquareRods        := RegisterConversionType(cbArea,txtauSquareRods,25.2929538117);
+  inherited create(AConvFamily,ADescription);
+  FFactor:=AFactor;
 end;
 
-procedure RegisterLengths;
-
-begin
-  duMicromicrons      := RegisterConversionType(cbDistance,txtduMicromicrons,1E-12);
-  duAngstroms         := RegisterConversionType(cbDistance,txtduAngstroms,1E-10);
-  duMillimicrons      := RegisterConversionType(cbDistance,txtduMillimicrons,1E-9);
-  duMicrons           := RegisterConversionType(cbDistance,txtduMicrons,1E-6);
-  duMillimeters       := RegisterConversionType(cbDistance,txtduMillimeters,1E-3);
-  duCentimeters       := RegisterConversionType(cbDistance,txtduCentimeters,1E-2);
-  duDecimeters        := RegisterConversionType(cbDistance,txtduDecimeters,1E-1);
-  duMeters            := RegisterConversionType(cbDistance,txtduMeters,1);
-  duDecameters        := RegisterConversionType(cbDistance,txtduDecameters,10);
-  duHectometers       := RegisterConversionType(cbDistance,txtduHectometers,100);
-  duKilometers        := RegisterConversionType(cbDistance,txtduKilometers,1000);
-  duMegameters        := RegisterConversionType(cbDistance,txtduMegameters,1E6);
-  duGigameters        := RegisterConversionType(cbDistance,txtduGigameters,1E9);
-  duInches            := RegisterConversionType(cbDistance,txtduInches,0.0254);
-  duFeet              := RegisterConversionType(cbDistance,txtduFeet,0.3048);
-  duYards             := RegisterConversionType(cbDistance,txtduYards,0.9144);
-  duMiles             := RegisterConversionType(cbDistance,txtduMiles,1609.344);
-  duNauticalMiles     := RegisterConversionType(cbDistance,txtduNauticalMiles,1852);
-  duAstronomicalUnits := RegisterConversionType(cbDistance,txtduAstronomicalUnits,149597900000.0);
-  duLightYears        := RegisterConversionType(cbDistance,txtduLightYears,9.46052840488E15);
-  duParsecs           := RegisterConversionType(cbDistance,txtduParsecs, 3.08567818585E16);
-  duCubits            := RegisterConversionType(cbDistance,txtduCubits,0.4572);
-  duFathoms           := RegisterConversionType(cbDistance,txtduFathoms,1.8288);
-  duFurlongs          := RegisterConversionType(cbDistance,txtduFurlongs,201.168);
-  duHands             := RegisterConversionType(cbDistance,txtduHands,0.1016);
-  duPaces             := RegisterConversionType(cbDistance,txtduPaces,0.9144);
-  duRods              := RegisterConversionType(cbDistance,txtduRods,5.0292);
-  duChains            := RegisterConversionType(cbDistance,txtduChains,20.1168);
-  duLinks             := RegisterConversionType(cbDistance,txtduLinks,0.201168);
-  duPicas             := RegisterConversionType(cbDistance,txtduPicas,0.0042333333);
-  duPoints            := RegisterConversionType(cbDistance,txtduPoints,0.00035277778);
-end;
-
-procedure Registermass;  // weight? :)
-
+function TConvTypeFactor.ToCommon(const AValue: Double): Double; 
 begin
-  muNanograms         := RegisterConversionType(cbMass,txtmuNanograms,1E-12);
-  muMicrograms        := RegisterConversionType(cbMass,txtmuMicrograms,1E-9);
-  muMilligrams        := RegisterConversionType(cbMass,txtmuMilligrams,1E-6);
-  muCentigrams        := RegisterConversionType(cbMass,txtmuCentigrams,1E-5);
-  muDecigrams         := RegisterConversionType(cbMass,txtmuDecigrams,1E-4);
-  muGrams             := RegisterConversionType(cbMass,txtmuGrams,1E-3);
-  muDecagrams         := RegisterConversionType(cbMass,txtmuDecagrams,1E-2);
-  muHectograms        := RegisterConversionType(cbMass,txtmuHectograms,1E-1);
-  muKilograms         := RegisterConversionType(cbMass,txtmuKilograms,1);
-  muMetricTons        := RegisterConversionType(cbMass,txtmuMetricTons,1000);
-  muDrams             := RegisterConversionType(cbMass,txtmuDrams,0.0017718452);
-  muGrains            := RegisterConversionType(cbMass,txtmuGrains,6.479891E-5);
-  muLongTons          := RegisterConversionType(cbMass,txtmuLongTons,1016.0469);
-  muTons              := RegisterConversionType(cbMass,txtmuTons,907.18474);
-  muOunces            := RegisterConversionType(cbMass,txtmuOunces,0.028349523);
-  muPounds            := RegisterConversionType(cbMass,txtmuPounds,0.45359237);
-  muStones            := RegisterConversionType(cbMass,txtmuStones,6.3502932);
+  result:=AValue * FFactor;
 end;
 
-procedure RegisterTemperature;
+function TConvTypeFactor.FromCommon(const AValue: Double): Double; 
 begin
- tuCelsius    := RegisterConversionType(cbTemperature,txttuCelsius,1);
- tuKelvin     := RegisterConversionType(cbTemperature,txttuKelvin,1);
- tuFahrenheit := RegisterConversionType(cbTemperature,txttuFahrenheit,5/9);
- tuRankine    := RegisterConversionType(cbTemperature,txttuRankine,0.5555556);
- tuReamur     := RegisterConversionType(cbTemperature,txttuReamur,10/8);   // Reaumur?
+  result:=AValue / FFactor;
 end;
 
-Const Yearsec=365.24219879*24*3600.0;   // year in seconds;
-
-procedure RegisterTimes;
-
+constructor TConvTypeProcs.Create(const AConvFamily: TConvFamily; const ADescription: string; const AToProc, AFromProc: TConversionProc);
 begin
-  tuMilliSeconds           := RegisterConversionType(cbTime,txttuMilliSeconds,1E-3);
-  tuSeconds                := RegisterConversionType(cbTime,txttuSeconds,1);
-  tuMinutes                := RegisterConversionType(cbTime,txttuMinutes,60.0);
-  tuHours                  := RegisterConversionType(cbTime,txttuHours,3600.0);
-  tuDays                   := RegisterConversionType(cbTime,txttuDays,24*3600.0);
-  tuWeeks                  := RegisterConversionType(cbTime,txttuWeeks,7*24*3600.0);
-  tuFortnights             := RegisterConversionType(cbTime,txttuFortnights,14*24*3600.0);
-  tuMonths                 := RegisterConversionType(cbTime,txttuMonths,1/12*YearSec);
-  tuYears                  := RegisterConversionType(cbTime,txttuYears,YearSec);
-  tuDecades                := RegisterConversionType(cbTime,txttuDecades,10*YearSec);
-  tuCenturies              := RegisterConversionType(cbTime,txttuCenturies,100*yearsec);
-  tuMillennia              := RegisterConversionType(cbTime,txttuMillennia,1000*yearsec);
-  tuDateTime               := RegisterConversionType(cbTime,txttuDateTime,-1);
-  tuJulianDate             := RegisterConversionType(cbTime,txttuJulianDate,-1);
-  tuModifiedJulianDate     := RegisterConversionType(cbTime,txttuModifiedJulianDate,-1);
+  inherited create(AConvFamily,ADescription);
+  ftoproc:=AToProc;
+  ffromproc:=AFromProc;
 end;
 
-const flgal=0.0037854118;
-
-
-procedure RegisterVolumes;
+function TConvTypeProcs.ToCommon(const AValue: Double): Double; 
 begin
-  vuCubicMillimeters      := RegisterConversionType(cbVolume,txtvuCubicMillimeters,1E-9);
-  vuCubicCentimeters      := RegisterConversionType(cbVolume,txtvuCubicCentimeters,1E-6);
-  vuCubicDecimeters       := RegisterConversionType(cbVolume,txtvuCubicDecimeters,1E-3);
-  vuCubicMeters           := RegisterConversionType(cbVolume,txtvuCubicMeters,1);
-  vuCubicDecameters       := RegisterConversionType(cbVolume,txtvuCubicDecameters,1E3);
-  vuCubicHectometers      := RegisterConversionType(cbVolume,txtvuCubicHectometers,1E6);
-  vuCubicKilometers       := RegisterConversionType(cbVolume,txtvuCubicKilometers,1E9);
-  vuCubicInches           := RegisterConversionType(cbVolume,txtvuCubicInches,1.6387064E-5);
-  vuCubicFeet             := RegisterConversionType(cbVolume,txtvuCubicFeet,0.028316847);
-  vuCubicYards            := RegisterConversionType(cbVolume,txtvuCubicYards,0.76455486);
-  vuCubicMiles            := RegisterConversionType(cbVolume,txtvuCubicMiles,4.1681818E9);
-  vuMilliLiters           := RegisterConversionType(cbVolume,txtvuMilliLiters,1E-6);
-  vuCentiLiters           := RegisterConversionType(cbVolume,txtvuCentiLiters,1E-5);
-  vuDeciLiters            := RegisterConversionType(cbVolume,txtvuDeciLiters,1E-4);
-  vuLiters                := RegisterConversionType(cbVolume,txtvuLiters,1E-3);
-  vuDecaLiters            := RegisterConversionType(cbVolume,txtvuDecaLiters,1E-2);
-  vuHectoLiters           := RegisterConversionType(cbVolume,txtvuHectoLiters,1E-1);
-  vuKiloLiters            := RegisterConversionType(cbVolume,txtvuKiloLiters,1);
-  vuAcreFeet              := RegisterConversionType(cbVolume,txtvuAcreFeet,          -1);
-  vuAcreInches            := RegisterConversionType(cbVolume,txtvuAcreInches,        -1);
-  vuCords                 := RegisterConversionType(cbVolume,txtvuCords,128*0.028316847);
-  vuCordFeet              := RegisterConversionType(cbVolume,txtvuCordFeet,128*0.028316847);
-  vuDecisteres            := RegisterConversionType(cbVolume,txtvuDecisteres,0.1);
-  vuSteres                := RegisterConversionType(cbVolume,txtvuSteres,1);
-  vuDecasteres            := RegisterConversionType(cbVolume,txtvuDecasteres,10);
-  vuFluidGallons          := RegisterConversionType(cbVolume,txtvuFluidGallons,flgal);
-  vuFluidQuarts           := RegisterConversionType(cbVolume,txtvuFluidQuarts,0.25*flgal);
-  vuFluidPints            := RegisterConversionType(cbVolume,txtvuFluidPints,0.5*0.25*flgal);
-  vuFluidCups             := RegisterConversionType(cbVolume,txtvuFluidCups, -1);
-  vuFluidGills            := RegisterConversionType(cbVolume,txtvuFluidGills,-1);
-  vuFluidOunces           := RegisterConversionType(cbVolume,txtvuFluidOunces,1/16*0.5*0.25*flgal);
-  vuFluidTablespoons      := RegisterConversionType(cbVolume,txtvuFluidTablespoons,-1);
-  vuFluidTeaspoons        := RegisterConversionType(cbVolume,txtvuFluidTeaspoons,-1);
-  vuDryGallons            := RegisterConversionType(cbVolume,txtvuDryGallons,-1);
-  vuDryQuarts             := RegisterConversionType(cbVolume,txtvuDryQuarts,-1);
-  vuDryPints              := RegisterConversionType(cbVolume,txtvuDryPints,-1);
-  vuDryPecks              := RegisterConversionType(cbVolume,txtvuDryPecks, 0.0088097675);
-  vuDryBuckets            := RegisterConversionType(cbVolume,txtvuDryBuckets,-1);
-  vuDryBushels            := RegisterConversionType(cbVolume,txtvuDryBushels,0.03523907);
-  vuUKGallons             := RegisterConversionType(cbVolume,txtvuUKGallons,0.0045460993);
-  vuUKPottles             := RegisterConversionType(cbVolume,txtvuUKPottles,-1);
-  vuUKQuarts              := RegisterConversionType(cbVolume,txtvuUKQuarts,0.0011365248);
-  vuUKPints               := RegisterConversionType(cbVolume,txtvuUKPints,-1);
-  vuUKGills               := RegisterConversionType(cbVolume,txtvuUKGills,-1);
-  vuUKOunces              := RegisterConversionType(cbVolume,txtvuUKOunces,2.8413121E-5);
-  vuUKPecks               := RegisterConversionType(cbVolume,txtvuUKPecks,0.0090921986);
-  vuUKBuckets             := RegisterConversionType(cbVolume,txtvuUKBuckets,-1);
-  vuUKBushels             := RegisterConversionType(cbVolume,txtvuUKBushels,0.036368794);
+  result:=FTOProc(Avalue);
 end;
 
-Procedure RegisterFamilies;
-Begin
-    cbArea        := RegisterConversionFamily('Area');
-    cbDistance    := RegisterConversionFamily('Distance');
-    cbMass        := RegisterConversionFamily('Mass');
-    cbTemperature := RegisterConversionFamily('Temperature');
-    cbTime        := RegisterConversionFamily('Time');
-    cbVolume      := RegisterConversionFamily('Volume');
-End;
-
-
-Procedure RegisterAll;
+function TConvTypeProcs.FromCommon(const AValue: Double): Double; 
 begin
-   RegisterFamilies;
-   RegisterVolumes;
-   RegisterTimes;
-   RegisterTemperature;
-   Registermass;
-   RegisterLengths;
-   RegisterArea;
+  result:=FFromProc(Avalue);
 end;
 
-initialization
- registerall;
 finalization
   setlength(theunits,0);
   setlength(thefamilies,0);

+ 498 - 0
rtl/objpas/stdconvs.pp

@@ -22,6 +22,173 @@ interface
 {$mode objfpc}
 {$H+}
 
+Uses convutils;
+
+
+var
+{cbArea family}
+
+  auSquareMillimeters,
+  auSquareCentimeters,
+  auSquareDecimeters,
+  auSquareMeters,
+  auSquareDecameters,
+  auSquareHectometers,
+  auSquareKilometers,
+  auSquareInches,
+  auSquareFeet  ,
+  auSquareYards ,
+  auSquareMiles,
+  auAcres       ,
+  auCentares    ,
+  auAres        ,
+  auHectares    ,
+  auSquareRods  ,
+
+{cbDistance family}
+
+  duMicromicrons,
+  duAngstroms   ,
+  duMillimicrons,
+  duMicrons,
+  duMillimeters,
+  duCentimeters,
+  duDecimeters,
+  duMeters,
+  duDecameters,
+  duHectometers,
+  duKilometers,
+  duMegameters,
+  duGigameters,
+  duInches,
+  duFeet,
+  duYards,
+  duMiles       ,
+  duNauticalMiles,
+  duAstronomicalUnits,
+  duLightYears,
+  duParsecs,
+  duCubits,
+  duFathoms,
+  duFurlongs,
+  duHands,
+  duPaces,
+  duRods,
+  duChains,
+  duLinks,
+  duPicas,
+  duPoints,
+
+{cbMass family}
+
+  muNanograms,
+  muMicrograms,
+  muMilligrams,
+  muCentigrams,
+  muDecigrams,
+  muGrams,
+  muDecagrams,
+  muHectograms,
+  muKilograms,
+  muMetricTons,
+  muDrams,
+  muGrains,
+  muLongTons,
+  muTons,
+  muOunces,
+  muPounds,
+  muStones,
+
+{cbTemperature family}
+
+  tuCelsius,
+  tuKelvin,
+  tuFahrenheit,
+  tuRankine,
+  tuReamur,
+
+{
+cbTime family
+}
+
+  tuMilliSeconds,
+  tuSeconds,
+  tuMinutes,
+  tuHours,
+  tuDays,
+  tuWeeks,
+  tuFortnights,
+  tuMonths,
+  tuYears,
+  tuDecades,
+  tuCenturies,
+  tuMillennia,
+  tuDateTime,
+  tuJulianDate,
+  tuModifiedJulianDate,
+
+{
+cbVolume family
+}
+
+  vuCubicMillimeters,
+  vuCubicCentimeters,
+  vuCubicDecimeters,
+  vuCubicMeters,
+  vuCubicDecameters,
+  vuCubicHectometers,
+  vuCubicKilometers,
+  vuCubicInches,
+  vuCubicFeet,
+  vuCubicYards,
+  vuCubicMiles,
+  vuMilliLiters,
+  vuCentiLiters,
+  vuDeciLiters,
+  vuLiters,
+  vuDecaLiters,
+  vuHectoLiters,
+  vuKiloLiters,
+  vuAcreFeet,
+  vuAcreInches,
+  vuCords,
+  vuCordFeet,
+  vuDecisteres,
+  vuSteres,
+  vuDecasteres,
+  vuFluidGallons,
+  vuFluidQuarts,
+  vuFluidPints,
+  vuFluidCups,
+  vuFluidGills,
+  vuFluidOunces,
+  vuFluidTablespoons,
+  vuFluidTeaspoons,
+  vuDryGallons,
+  vuDryQuarts,
+  vuDryPints,
+  vuDryPecks,
+  vuDryBuckets,
+  vuDryBushels,
+  vuUKGallons,
+  vuUKPottles,
+  vuUKQuarts,
+  vuUKPints,
+  vuUKGills,
+  vuUKOunces,
+  vuUKPecks,
+  vuUKBuckets,
+  vuUKBushels     : TConvType;
+
+var
+    cbArea        : TConvFamily;
+    cbDistance    : TConvFamily;
+    cbMass        : TConvFamily;
+    cbTemperature : TConvFamily;
+    cbTime        : TConvFamily;
+    cbVolume      : TConvFamily;
+
+
 function CelsiusToFahrenheit(const AValue: Double): Double;
 function FahrenheitToCelsius(const AValue: Double): Double;
 function CelsiusToKelvin    (const AValue: Double): Double;
@@ -49,4 +216,335 @@ begin
   result:=AValue-273.15;
 end;
 
+ResourceString  // Note, designations for FFU's are guesses.
+
+  txtauSquareMillimeters   = 'Square millimeters (mm^2)';
+  txtauSquareCentimeters   = 'Square centimeters (cm^2)';
+  txtauSquareDecimeters    = 'Square decimeters (dm^2)';
+  txtauSquareMeters        = 'Square meters (m^2)';
+  txtauSquareDecameters    = 'Square decameters (dam^2)';
+  txtauSquareHectometers   = 'Square hectometers (hm^2)';
+  txtauSquareKilometers    = 'Square kilometers (km^2)';
+  txtauSquareInches        = 'Square inch (in^2)';
+  txtauSquareFeet          = 'Square feet (ft^2)';
+  txtauSquareYards         = 'Square yards (yd^2)';
+  txtauSquareMiles         = 'Square miles  (mi^2)';
+  txtauAcres               = 'Square acres (acre^2)';
+  txtauCentares            = 'Centares (care^2)';
+  txtauAres                = 'Ares (are=dam^2)';
+  txtauHectares            = 'Hectares (ha=hm^2)';
+  txtauSquareRods          = 'Square Rods (sqr)';
+  txtduMicromicrons        = 'micro microms (mumum)';
+  txtduAngstroms           = 'Aengstroem (ang)';
+  txtduMillimicrons        = 'millimicroms (mmum)';
+  txtduMicrons             = 'microns (um)';
+  txtduMillimeters         = 'millimeters (mm)';
+  txtduCentimeters         = 'centimeters (cm)';
+  txtduDecimeters          = 'decimeters (dm)';
+  txtduMeters              = 'meters (m)';
+  txtduDecameters          = 'decameters (dam)';
+  txtduHectometers         = 'hectometers (hm)';
+  txtduKilometers          = 'kilometers (km)';
+  txtduMegameters          = 'megameters (Mm)';
+  txtduGigameters          = 'gigameters (Gm)';
+  txtduInches              = 'inches (in)';
+  txtduFeet                = 'feet (ft)';
+  txtduYards               = 'yards (yd)';
+  txtduMiles               = 'miles (mi)';
+  txtduNauticalMiles       = 'nautical miles (nmi)';
+  txtduAstronomicalUnits   = 'astronomical units (au)';
+  txtduLightYears          = 'light years (ly)';
+  txtduParsecs             = 'Parsec (Ps)';
+  txtduCubits              = 'Cubits (cb)';
+  txtduFathoms             = 'Fathom (Fth)';
+  txtduFurlongs            = 'Furlongs (furl)';
+  txtduHands               = 'Hands (hnd)';
+  txtduPaces               = 'Paces (pc)';
+  txtduRods                = 'Rods (rd)';
+  txtduChains              = 'Chains (ch)';
+  txtduLinks               = 'Links (lnk)';
+  txtduPicas               = 'Pica''s (pc)';
+  txtduPoints              = 'Points (pnts)';           // carat/Karaat 2E-6 gram ?
+  txtmuNanograms           = 'nanograms (ng)';
+  txtmuMicrograms          = 'micrograms (um)';
+  txtmuMilligrams          = 'milligrams (mg)';
+  txtmuCentigrams          = 'centigrams (cg)';
+  txtmuDecigrams           = 'decigrams (dg)';
+  txtmuGrams               = 'grams (g)';
+  txtmuDecagrams           = 'decagrams (dag)';
+  txtmuHectograms          = 'hectograms (hg)';
+  txtmuKilograms           = 'kilograms (kg)';
+  txtmuMetricTons          = 'metric ton (t)';
+  txtmuDrams               = 'dramgs (??)';
+  txtmuGrains              = 'grains (??)';
+  txtmuLongTons            = 'longton (??)';
+  txtmuTons                = 'imperial ton (??)'; // calling metric ton "ton" is normal in metric countries
+  txtmuOunces              = 'ounce (??)';
+  txtmuPounds              = 'pounds (??)';     // what kind? Metric pound =0.5
+  txtmuStones              = 'stones (??)';
+  txttuCelsius             = 'degrees Celsius (degC)';
+  txttuKelvin              = 'degrees Kelvin (K)';
+  txttuFahrenheit          = 'degrees Fahrenheit (degF)';
+  txttuRankine             = 'degrees Rankine (degR)';
+  txttuReamur              = 'degrees Reamur (degReam)';
+  txttuMilliSeconds        = 'milli seconds (ms)';
+  txttuSeconds             = 'seconds (s)';
+  txttuMinutes             = 'minutes (min)';
+  txttuHours               = 'hours (hr)';
+  txttuDays                = 'days (days)';
+  txttuWeeks               = 'weeks (weeks)';
+  txttuFortnights          = 'Fortnights (??)';
+  txttuMonths              = 'Months (months)';
+  txttuYears               = 'Years (years)';
+  txttuDecades             = 'Decades (decades)';
+  txttuCenturies           = 'Centuries (centuries)';
+  txttuMillennia           = 'Millennia (millenia)';
+  txttuDateTime            = 'DateTime (??)';
+  txttuJulianDate          = 'JulianDate (??)';
+  txttuModifiedJulianDate  = 'Modified JulianData (??)';
+
+  txtvuCubicMillimeters    = 'cubic millimeters (mm^3)';
+  txtvuCubicCentimeters    = 'cubic centimeters (cm^3)';
+  txtvuCubicDecimeters     = 'cubic decimeters (dm^3)';
+  txtvuCubicMeters         = 'cubic meters (m^3)';
+  txtvuCubicDecameters     = 'cubic decameters (dam^3)';
+  txtvuCubicHectometers    = 'cubic hectometers (hm^3)';
+  txtvuCubicKilometers     = 'cubic kilometers (km^3)';
+  txtvuCubicInches         = 'cubic inches (in^3)';
+  txtvuCubicFeet           = 'cubic feet (ft^3)';
+  txtvuCubicYards          = 'cubic yards (yd^3)';
+  txtvuCubicMiles          = 'cubic miles (mi^3)';
+  txtvuMilliLiters         = 'milliliters (ml)';
+  txtvuCentiLiters         = 'centiliters (cl)';
+  txtvuDeciLiters          = 'deciliters (dl)';
+  txtvuLiters              = 'liters (l)';
+  txtvuDecaLiters          = 'decaliters (dal)';
+  txtvuHectoLiters         = 'hectoliters (hl)';
+  txtvuKiloLiters          = 'kiloliters (kl)';
+  txtvuAcreFeet            = 'acrefeet (acre ft)';
+  txtvuAcreInches          = 'acreinches (acre in)';
+  txtvuCords               = 'cords (??)';
+  txtvuCordFeet            = 'cordfeet (??)';
+  txtvuDecisteres          = 'decisteres (??)';
+  txtvuSteres              = 'steres (??)';
+  txtvuDecasteres          = 'decasteres (??)';
+  txtvuFluidGallons        = 'US fluid gallons (fl gal)';
+  txtvuFluidQuarts         = 'US fluid Quarts (fl Quart)';
+  txtvuFluidPints          = 'US fluid Pints (fl pints)';
+  txtvuFluidCups           = 'US fluid Cups (fl Cups)';
+  txtvuFluidGills          = 'US fluid Gills (fl Quart)';
+  txtvuFluidOunces         = 'US fluid Ounces (fl Ounces)';
+  txtvuFluidTablespoons    = 'US fluid Tablespoons (fl Tablespoons)';
+  txtvuFluidTeaspoons      = 'US fluid teaspoons (fl teaspoon)';
+  txtvuDryGallons          = 'US dry gallons (dr gal)';
+  txtvuDryQuarts           = 'US dry Quarts (dr Quart)';
+  txtvuDryPints            = 'US dry Pints (dr pints)';
+  txtvuDryPecks            = 'US dry pecks (dr pecks)';
+  txtvuDryBuckets          = 'US dry buckets (dr buckets)';
+  txtvuDryBushels          = 'US dry bushels (dr bushels)';
+  txtvuUKGallons           = 'UK gallons (fl gal)';
+  txtvuUKPottles           = 'UK Pottles (fl pttle)';
+  txtvuUKQuarts            = 'UK Quarts (fl Quart)';
+  txtvuUKPints             = 'UK Pints (fl pints)';
+  txtvuUKGills             = 'UK Gills (fl Quart)';
+  txtvuUKOunces            = 'UK Ounces (fl Ounces)';
+  txtvuUKPecks             = 'UK pecks (dr pecks)';
+  txtvuUKBuckets           = 'UK buckets (dr buckets)';
+  txtvuUKBushels           = 'UK bushels (dr bushels)';
+
+
+  // initial FFU factors from a HP48g calculator and BSD units program. However after
+  //    a while, the bushels/forthnight got boring, so please check.
+  // undefined/uncertain factors get -1, and convert() functions
+  // should check that and bomb on it.
+
+procedure RegisterArea;
+
+begin
+  auSquareMillimeters := RegisterConversionType(cbArea,txtauSquareMillimeters,1E-6);
+  auSquareCentimeters := RegisterConversionType(cbArea,txtauSquareCentimeters,1E-4);
+  auSquareDecimeters  := RegisterConversionType(cbArea,txtauSquareDecimeters,1E-2);
+  auSquareMeters      := RegisterConversionType(cbArea,txtauSquareMeters,1);
+  auSquareDecameters  := RegisterConversionType(cbArea,txtauSquareDecameters,1E2);
+  auSquareHectometers := RegisterConversionType(cbArea,txtauSquareHectometers,1E4);
+  auSquareKilometers  := RegisterConversionType(cbArea,txtauSquareKilometers,1E6);
+  auSquareInches      := RegisterConversionType(cbArea,txtauSquareInches,0.00064516);
+  auSquareFeet        := RegisterConversionType(cbArea,txtauSquareFeet,0.092903040);
+  auSquareYards       := RegisterConversionType(cbArea,txtauSquareYards,0.83612736);
+  auSquareMiles       := RegisterConversionType(cbArea,txtauSquareMiles,2589988.11034);
+  auAcres             := RegisterConversionType(cbArea,txtauAcres,4046.87260987);
+  auCentares          := RegisterConversionType(cbArea,txtauCentares,-1);
+  auAres              := RegisterConversionType(cbArea,txtauAres,100);
+  auHectares          := RegisterConversionType(cbArea,txtauHectares,10000);
+  auSquareRods        := RegisterConversionType(cbArea,txtauSquareRods,25.2929538117);
+end;
+
+procedure RegisterLengths;
+
+begin
+  duMicromicrons      := RegisterConversionType(cbDistance,txtduMicromicrons,1E-12);
+  duAngstroms         := RegisterConversionType(cbDistance,txtduAngstroms,1E-10);
+  duMillimicrons      := RegisterConversionType(cbDistance,txtduMillimicrons,1E-9);
+  duMicrons           := RegisterConversionType(cbDistance,txtduMicrons,1E-6);
+  duMillimeters       := RegisterConversionType(cbDistance,txtduMillimeters,1E-3);
+  duCentimeters       := RegisterConversionType(cbDistance,txtduCentimeters,1E-2);
+  duDecimeters        := RegisterConversionType(cbDistance,txtduDecimeters,1E-1);
+  duMeters            := RegisterConversionType(cbDistance,txtduMeters,1);
+  duDecameters        := RegisterConversionType(cbDistance,txtduDecameters,10);
+  duHectometers       := RegisterConversionType(cbDistance,txtduHectometers,100);
+  duKilometers        := RegisterConversionType(cbDistance,txtduKilometers,1000);
+  duMegameters        := RegisterConversionType(cbDistance,txtduMegameters,1E6);
+  duGigameters        := RegisterConversionType(cbDistance,txtduGigameters,1E9);
+  duInches            := RegisterConversionType(cbDistance,txtduInches,0.0254);
+  duFeet              := RegisterConversionType(cbDistance,txtduFeet,0.3048);
+  duYards             := RegisterConversionType(cbDistance,txtduYards,0.9144);
+  duMiles             := RegisterConversionType(cbDistance,txtduMiles,1609.344);
+  duNauticalMiles     := RegisterConversionType(cbDistance,txtduNauticalMiles,1852);
+  duAstronomicalUnits := RegisterConversionType(cbDistance,txtduAstronomicalUnits,149597900000.0);
+  duLightYears        := RegisterConversionType(cbDistance,txtduLightYears,9.46052840488E15);
+  duParsecs           := RegisterConversionType(cbDistance,txtduParsecs, 3.08567818585E16);
+  duCubits            := RegisterConversionType(cbDistance,txtduCubits,0.4572);
+  duFathoms           := RegisterConversionType(cbDistance,txtduFathoms,1.8288);
+  duFurlongs          := RegisterConversionType(cbDistance,txtduFurlongs,201.168);
+  duHands             := RegisterConversionType(cbDistance,txtduHands,0.1016);
+  duPaces             := RegisterConversionType(cbDistance,txtduPaces,0.9144);
+  duRods              := RegisterConversionType(cbDistance,txtduRods,5.0292);
+  duChains            := RegisterConversionType(cbDistance,txtduChains,20.1168);
+  duLinks             := RegisterConversionType(cbDistance,txtduLinks,0.201168);
+  duPicas             := RegisterConversionType(cbDistance,txtduPicas,0.0042333333);
+  duPoints            := RegisterConversionType(cbDistance,txtduPoints,0.00035277778);
+end;
+
+procedure Registermass;  // weight? :)
+
+begin
+  muNanograms         := RegisterConversionType(cbMass,txtmuNanograms,1E-12);
+  muMicrograms        := RegisterConversionType(cbMass,txtmuMicrograms,1E-9);
+  muMilligrams        := RegisterConversionType(cbMass,txtmuMilligrams,1E-6);
+  muCentigrams        := RegisterConversionType(cbMass,txtmuCentigrams,1E-5);
+  muDecigrams         := RegisterConversionType(cbMass,txtmuDecigrams,1E-4);
+  muGrams             := RegisterConversionType(cbMass,txtmuGrams,1E-3);
+  muDecagrams         := RegisterConversionType(cbMass,txtmuDecagrams,1E-2);
+  muHectograms        := RegisterConversionType(cbMass,txtmuHectograms,1E-1);
+  muKilograms         := RegisterConversionType(cbMass,txtmuKilograms,1);
+  muMetricTons        := RegisterConversionType(cbMass,txtmuMetricTons,1000);
+  muDrams             := RegisterConversionType(cbMass,txtmuDrams,0.0017718452);
+  muGrains            := RegisterConversionType(cbMass,txtmuGrains,6.479891E-5);
+  muLongTons          := RegisterConversionType(cbMass,txtmuLongTons,1016.0469);
+  muTons              := RegisterConversionType(cbMass,txtmuTons,907.18474);
+  muOunces            := RegisterConversionType(cbMass,txtmuOunces,0.028349523);
+  muPounds            := RegisterConversionType(cbMass,txtmuPounds,0.45359237);
+  muStones            := RegisterConversionType(cbMass,txtmuStones,6.3502932);
+end;
+
+procedure RegisterTemperature;
+begin
+ tuCelsius    := RegisterConversionType(cbTemperature,txttuCelsius,1);
+ tuKelvin     := RegisterConversionType(cbTemperature,txttuKelvin,1);
+ tuFahrenheit := RegisterConversionType(cbTemperature,txttuFahrenheit,5/9);
+ tuRankine    := RegisterConversionType(cbTemperature,txttuRankine,0.5555556);
+ tuReamur     := RegisterConversionType(cbTemperature,txttuReamur,10/8);   // Reaumur?
+end;
+
+Const Yearsec=365.24219879*24*3600.0;   // year in seconds;
+
+procedure RegisterTimes;
+
+begin
+  tuMilliSeconds           := RegisterConversionType(cbTime,txttuMilliSeconds,1E-3);
+  tuSeconds                := RegisterConversionType(cbTime,txttuSeconds,1);
+  tuMinutes                := RegisterConversionType(cbTime,txttuMinutes,60.0);
+  tuHours                  := RegisterConversionType(cbTime,txttuHours,3600.0);
+  tuDays                   := RegisterConversionType(cbTime,txttuDays,24*3600.0);
+  tuWeeks                  := RegisterConversionType(cbTime,txttuWeeks,7*24*3600.0);
+  tuFortnights             := RegisterConversionType(cbTime,txttuFortnights,14*24*3600.0);
+  tuMonths                 := RegisterConversionType(cbTime,txttuMonths,1/12*YearSec);
+  tuYears                  := RegisterConversionType(cbTime,txttuYears,YearSec);
+  tuDecades                := RegisterConversionType(cbTime,txttuDecades,10*YearSec);
+  tuCenturies              := RegisterConversionType(cbTime,txttuCenturies,100*yearsec);
+  tuMillennia              := RegisterConversionType(cbTime,txttuMillennia,1000*yearsec);
+  tuDateTime               := RegisterConversionType(cbTime,txttuDateTime,-1);
+  tuJulianDate             := RegisterConversionType(cbTime,txttuJulianDate,-1);
+  tuModifiedJulianDate     := RegisterConversionType(cbTime,txttuModifiedJulianDate,-1);
+end;
+
+const flgal=0.0037854118;
+
+
+procedure RegisterVolumes;
+begin
+  vuCubicMillimeters      := RegisterConversionType(cbVolume,txtvuCubicMillimeters,1E-9);
+  vuCubicCentimeters      := RegisterConversionType(cbVolume,txtvuCubicCentimeters,1E-6);
+  vuCubicDecimeters       := RegisterConversionType(cbVolume,txtvuCubicDecimeters,1E-3);
+  vuCubicMeters           := RegisterConversionType(cbVolume,txtvuCubicMeters,1);
+  vuCubicDecameters       := RegisterConversionType(cbVolume,txtvuCubicDecameters,1E3);
+  vuCubicHectometers      := RegisterConversionType(cbVolume,txtvuCubicHectometers,1E6);
+  vuCubicKilometers       := RegisterConversionType(cbVolume,txtvuCubicKilometers,1E9);
+  vuCubicInches           := RegisterConversionType(cbVolume,txtvuCubicInches,1.6387064E-5);
+  vuCubicFeet             := RegisterConversionType(cbVolume,txtvuCubicFeet,0.028316847);
+  vuCubicYards            := RegisterConversionType(cbVolume,txtvuCubicYards,0.76455486);
+  vuCubicMiles            := RegisterConversionType(cbVolume,txtvuCubicMiles,4.1681818E9);
+  vuMilliLiters           := RegisterConversionType(cbVolume,txtvuMilliLiters,1E-6);
+  vuCentiLiters           := RegisterConversionType(cbVolume,txtvuCentiLiters,1E-5);
+  vuDeciLiters            := RegisterConversionType(cbVolume,txtvuDeciLiters,1E-4);
+  vuLiters                := RegisterConversionType(cbVolume,txtvuLiters,1E-3);
+  vuDecaLiters            := RegisterConversionType(cbVolume,txtvuDecaLiters,1E-2);
+  vuHectoLiters           := RegisterConversionType(cbVolume,txtvuHectoLiters,1E-1);
+  vuKiloLiters            := RegisterConversionType(cbVolume,txtvuKiloLiters,1);
+  vuAcreFeet              := RegisterConversionType(cbVolume,txtvuAcreFeet,          -1);
+  vuAcreInches            := RegisterConversionType(cbVolume,txtvuAcreInches,        -1);
+  vuCords                 := RegisterConversionType(cbVolume,txtvuCords,128*0.028316847);
+  vuCordFeet              := RegisterConversionType(cbVolume,txtvuCordFeet,128*0.028316847);
+  vuDecisteres            := RegisterConversionType(cbVolume,txtvuDecisteres,0.1);
+  vuSteres                := RegisterConversionType(cbVolume,txtvuSteres,1);
+  vuDecasteres            := RegisterConversionType(cbVolume,txtvuDecasteres,10);
+  vuFluidGallons          := RegisterConversionType(cbVolume,txtvuFluidGallons,flgal);
+  vuFluidQuarts           := RegisterConversionType(cbVolume,txtvuFluidQuarts,0.25*flgal);
+  vuFluidPints            := RegisterConversionType(cbVolume,txtvuFluidPints,0.5*0.25*flgal);
+  vuFluidCups             := RegisterConversionType(cbVolume,txtvuFluidCups, -1);
+  vuFluidGills            := RegisterConversionType(cbVolume,txtvuFluidGills,-1);
+  vuFluidOunces           := RegisterConversionType(cbVolume,txtvuFluidOunces,1/16*0.5*0.25*flgal);
+  vuFluidTablespoons      := RegisterConversionType(cbVolume,txtvuFluidTablespoons,-1);
+  vuFluidTeaspoons        := RegisterConversionType(cbVolume,txtvuFluidTeaspoons,-1);
+  vuDryGallons            := RegisterConversionType(cbVolume,txtvuDryGallons,-1);
+  vuDryQuarts             := RegisterConversionType(cbVolume,txtvuDryQuarts,-1);
+  vuDryPints              := RegisterConversionType(cbVolume,txtvuDryPints,-1);
+  vuDryPecks              := RegisterConversionType(cbVolume,txtvuDryPecks, 0.0088097675);
+  vuDryBuckets            := RegisterConversionType(cbVolume,txtvuDryBuckets,-1);
+  vuDryBushels            := RegisterConversionType(cbVolume,txtvuDryBushels,0.03523907);
+  vuUKGallons             := RegisterConversionType(cbVolume,txtvuUKGallons,0.0045460993);
+  vuUKPottles             := RegisterConversionType(cbVolume,txtvuUKPottles,-1);
+  vuUKQuarts              := RegisterConversionType(cbVolume,txtvuUKQuarts,0.0011365248);
+  vuUKPints               := RegisterConversionType(cbVolume,txtvuUKPints,-1);
+  vuUKGills               := RegisterConversionType(cbVolume,txtvuUKGills,-1);
+  vuUKOunces              := RegisterConversionType(cbVolume,txtvuUKOunces,2.8413121E-5);
+  vuUKPecks               := RegisterConversionType(cbVolume,txtvuUKPecks,0.0090921986);
+  vuUKBuckets             := RegisterConversionType(cbVolume,txtvuUKBuckets,-1);
+  vuUKBushels             := RegisterConversionType(cbVolume,txtvuUKBushels,0.036368794);
+end;
+
+Procedure RegisterFamilies;
+Begin
+    cbArea        := RegisterConversionFamily('Area');
+    cbDistance    := RegisterConversionFamily('Distance');
+    cbMass        := RegisterConversionFamily('Mass');
+    cbTemperature := RegisterConversionFamily('Temperature');
+    cbTime        := RegisterConversionFamily('Time');
+    cbVolume      := RegisterConversionFamily('Volume');
+End;
+
+
+Procedure RegisterAll;
+begin
+   RegisterFamilies;
+   RegisterVolumes;
+   RegisterTimes;
+   RegisterTemperature;
+   Registermass;
+   RegisterLengths;
+   RegisterArea;
+end;
+
+initialization
+ registerall;
 end.