convutil.inc 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 2004 by Marco van de Voort
  4. member of the Free Pascal development team.
  5. An implementation for unit convutils, which converts between
  6. units and simple combinations of them.
  7. Based on a guessed interface derived from some programs on the web. (Like
  8. Marco Cantu's EuroConv example), so things can be a bit Delphi
  9. incompatible. Also part on Delphibasics.co.uk.
  10. Quantities are mostly taken from my HP48g/gx or the unix units program
  11. This program is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY;without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  14. **********************************************************************}
  15. unit convutils;
  16. interface
  17. {$mode objfpc}
  18. {$H+}
  19. Type TConvType = type Integer;
  20. TConvFamily = type Integer;
  21. TConvFamilyArray = array of TConvFamily;
  22. TConvTypeArray = array of TConvType;
  23. TConversionProc = function(const AValue: Double): Double;
  24. var
  25. {cbArea family}
  26. auSquareMillimeters,
  27. auSquareCentimeters,
  28. auSquareDecimeters,
  29. auSquareMeters,
  30. auSquareDecameters,
  31. auSquareHectometers,
  32. auSquareKilometers,
  33. auSquareInches,
  34. auSquareFeet ,
  35. auSquareYards ,
  36. auSquareMiles,
  37. auAcres ,
  38. auCentares ,
  39. auAres ,
  40. auHectares ,
  41. auSquareRods ,
  42. {cbDistance family}
  43. duMicromicrons,
  44. duAngstroms ,
  45. duMillimicrons,
  46. duMicrons,
  47. duMillimeters,
  48. duCentimeters,
  49. duDecimeters,
  50. duMeters,
  51. duDecameters,
  52. duHectometers,
  53. duKilometers,
  54. duMegameters,
  55. duGigameters,
  56. duInches,
  57. duFeet,
  58. duYards,
  59. duMiles ,
  60. duNauticalMiles,
  61. duAstronomicalUnits,
  62. duLightYears,
  63. duParsecs,
  64. duCubits,
  65. duFathoms,
  66. duFurlongs,
  67. duHands,
  68. duPaces,
  69. duRods,
  70. duChains,
  71. duLinks,
  72. duPicas,
  73. duPoints,
  74. {cbMass family}
  75. muNanograms,
  76. muMicrograms,
  77. muMilligrams,
  78. muCentigrams,
  79. muDecigrams,
  80. muGrams,
  81. muDecagrams,
  82. muHectograms,
  83. muKilograms,
  84. muMetricTons,
  85. muDrams,
  86. muGrains,
  87. muLongTons,
  88. muTons,
  89. muOunces,
  90. muPounds,
  91. muStones,
  92. {cbTemperature family}
  93. tuCelsius,
  94. tuKelvin,
  95. tuFahrenheit,
  96. tuRankine,
  97. tuReamur,
  98. {
  99. cbTime family
  100. }
  101. tuMilliSeconds,
  102. tuSeconds,
  103. tuMinutes,
  104. tuHours,
  105. tuDays,
  106. tuWeeks,
  107. tuFortnights,
  108. tuMonths,
  109. tuYears,
  110. tuDecades,
  111. tuCenturies,
  112. tuMillennia,
  113. tuDateTime,
  114. tuJulianDate,
  115. tuModifiedJulianDate,
  116. {
  117. cbVolume family
  118. }
  119. vuCubicMillimeters,
  120. vuCubicCentimeters,
  121. vuCubicDecimeters,
  122. vuCubicMeters,
  123. vuCubicDecameters,
  124. vuCubicHectometers,
  125. vuCubicKilometers,
  126. vuCubicInches,
  127. vuCubicFeet,
  128. vuCubicYards,
  129. vuCubicMiles,
  130. vuMilliLiters,
  131. vuCentiLiters,
  132. vuDeciLiters,
  133. vuLiters,
  134. vuDecaLiters,
  135. vuHectoLiters,
  136. vuKiloLiters,
  137. vuAcreFeet,
  138. vuAcreInches,
  139. vuCords,
  140. vuCordFeet,
  141. vuDecisteres,
  142. vuSteres,
  143. vuDecasteres,
  144. vuFluidGallons,
  145. vuFluidQuarts,
  146. vuFluidPints,
  147. vuFluidCups,
  148. vuFluidGills,
  149. vuFluidOunces,
  150. vuFluidTablespoons,
  151. vuFluidTeaspoons,
  152. vuDryGallons,
  153. vuDryQuarts,
  154. vuDryPints,
  155. vuDryPecks,
  156. vuDryBuckets,
  157. vuDryBushels,
  158. vuUKGallons,
  159. vuUKPottles,
  160. vuUKQuarts,
  161. vuUKPints,
  162. vuUKGills,
  163. vuUKOunces,
  164. vuUKPecks,
  165. vuUKBuckets,
  166. vuUKBushels : TConvType;
  167. var
  168. cbArea : TConvFamily;
  169. cbDistance : TConvFamily;
  170. cbMass : TConvFamily;
  171. cbTemperature : TConvFamily;
  172. cbTime : TConvFamily;
  173. cbVolume : TConvFamily;
  174. Type TConvUtilFloat = double;
  175. Function RegisterConversionFamily(Const S : String):TConvFamily;
  176. Function RegisterConversionType(Fam:TConvFamily;Const S:String;Value:TConvUtilFloat):TConvType;
  177. function Convert ( const Measurement : Double; const FromType, ToType : TConvType ) :TConvUtilFloat;
  178. function Convert ( const Measurement : Double; const FromType1, FromType2, ToType1, ToType2 : TConvType ) :TConvUtilFloat;
  179. function ConvFamilyToDescription(const AFamily: TConvFamily): string;
  180. function ConvTypeToDescription(const AType: TConvType): string;
  181. procedure GetConvFamilies(out AFamilies: TConvFamilyArray);
  182. procedure GetConvTypes(const AFamily: TConvFamily; out ATypes: TConvTypeArray);
  183. Type
  184. TConvTypeInfo = Class(Tobject)
  185. private
  186. FDescription : String;
  187. FConvFamily : TConvFamily;
  188. FConvType : TConvType;
  189. public
  190. Constructor Create(Const AConvFamily : TConvFamily;const ADescription:String);
  191. function ToCommon(const AValue: Double) : Double; virtual; abstract;
  192. function FromCommon(const AValue: Double) : Double; virtual; abstract;
  193. property ConvFamily : TConvFamily read FConvFamily;
  194. property ConvType : TConvType read FConvType;
  195. property Description: String read FDescription;
  196. end;
  197. Implementation
  198. ResourceString // Note, designations for FFU's are guesses.
  199. txtauSquareMillimeters = 'Square millimeters (mm^2)';
  200. txtauSquareCentimeters = 'Square centimeters (cm^2)';
  201. txtauSquareDecimeters = 'Square decimeters (dm^2)';
  202. txtauSquareMeters = 'Square meters (m^2)';
  203. txtauSquareDecameters = 'Square decameters (dam^2)';
  204. txtauSquareHectometers = 'Square hectometers (hm^2)';
  205. txtauSquareKilometers = 'Square kilometers (km^2)';
  206. txtauSquareInches = 'Square inch (in^2)';
  207. txtauSquareFeet = 'Square feet (ft^2)';
  208. txtauSquareYards = 'Square yards (yd^2)';
  209. txtauSquareMiles = 'Square miles (mi^2)';
  210. txtauAcres = 'Square acres (acre^2)';
  211. txtauCentares = 'Centares (care^2)';
  212. txtauAres = 'Ares (are=dam^2)';
  213. txtauHectares = 'Hectares (ha=hm^2)';
  214. txtauSquareRods = 'Square Rods (sqr)';
  215. txtduMicromicrons = 'micro microms (mumum)';
  216. txtduAngstroms = 'Aengstroem (ang)';
  217. txtduMillimicrons = 'millimicroms (mmum)';
  218. txtduMicrons = 'microns (um)';
  219. txtduMillimeters = 'millimeters (mm)';
  220. txtduCentimeters = 'centimeters (cm)';
  221. txtduDecimeters = 'decimeters (dm)';
  222. txtduMeters = 'meters (m)';
  223. txtduDecameters = 'decameters (dam)';
  224. txtduHectometers = 'hectometers (hm)';
  225. txtduKilometers = 'kilometers (km)';
  226. txtduMegameters = 'megameters (Mm)';
  227. txtduGigameters = 'gigameters (Gm)';
  228. txtduInches = 'inches (in)';
  229. txtduFeet = 'feet (ft)';
  230. txtduYards = 'yards (yd)';
  231. txtduMiles = 'miles (mi)';
  232. txtduNauticalMiles = 'nautical miles (nmi)';
  233. txtduAstronomicalUnits = 'astronomical units (au)';
  234. txtduLightYears = 'light years (ly)';
  235. txtduParsecs = 'Parsec (Ps)';
  236. txtduCubits = 'Cubits (cb)';
  237. txtduFathoms = 'Fathom (Fth)';
  238. txtduFurlongs = 'Furlongs (furl)';
  239. txtduHands = 'Hands (hnd)';
  240. txtduPaces = 'Paces (pc)';
  241. txtduRods = 'Rods (rd)';
  242. txtduChains = 'Chains (ch)';
  243. txtduLinks = 'Links (lnk)';
  244. txtduPicas = 'Pica''s (pc)';
  245. txtduPoints = 'Points (pnts)'; // carat/Karaat 2E-6 gram ?
  246. txtmuNanograms = 'nanograms (ng)';
  247. txtmuMicrograms = 'micrograms (um)';
  248. txtmuMilligrams = 'milligrams (mg)';
  249. txtmuCentigrams = 'centigrams (cg)';
  250. txtmuDecigrams = 'decigrams (dg)';
  251. txtmuGrams = 'grams (g)';
  252. txtmuDecagrams = 'decagrams (dag)';
  253. txtmuHectograms = 'hectograms (hg)';
  254. txtmuKilograms = 'kilograms (kg)';
  255. txtmuMetricTons = 'metric ton (t)';
  256. txtmuDrams = 'dramgs (??)';
  257. txtmuGrains = 'grains (??)';
  258. txtmuLongTons = 'longton (??)';
  259. txtmuTons = 'imperial ton (??)'; // calling metric ton "ton" is normal in metric countries
  260. txtmuOunces = 'ounce (??)';
  261. txtmuPounds = 'pounds (??)'; // what kind? Metric pound =0.5
  262. txtmuStones = 'stones (??)';
  263. txttuCelsius = 'degrees Celsius (degC)';
  264. txttuKelvin = 'degrees Kelvin (K)';
  265. txttuFahrenheit = 'degrees Fahrenheit (degF)';
  266. txttuRankine = 'degrees Rankine (degR)';
  267. txttuReamur = 'degrees Reamur (degReam)';
  268. txttuMilliSeconds = 'milli seconds (ms)';
  269. txttuSeconds = 'seconds (s)';
  270. txttuMinutes = 'minutes (min)';
  271. txttuHours = 'hours (hr)';
  272. txttuDays = 'days (days)';
  273. txttuWeeks = 'weeks (weeks)';
  274. txttuFortnights = 'Fortnights (??)';
  275. txttuMonths = 'Months (months)';
  276. txttuYears = 'Years (years)';
  277. txttuDecades = 'Decades (decades)';
  278. txttuCenturies = 'Centuries (centuries)';
  279. txttuMillennia = 'Millennia (millenia)';
  280. txttuDateTime = 'DateTime (??)';
  281. txttuJulianDate = 'JulianDate (??)';
  282. txttuModifiedJulianDate = 'Modified JulianData (??)';
  283. txtvuCubicMillimeters = 'cubic millimeters (mm^3)';
  284. txtvuCubicCentimeters = 'cubic centimeters (cm^3)';
  285. txtvuCubicDecimeters = 'cubic decimeters (dm^3)';
  286. txtvuCubicMeters = 'cubic meters (m^3)';
  287. txtvuCubicDecameters = 'cubic decameters (dam^3)';
  288. txtvuCubicHectometers = 'cubic hectometers (hm^3)';
  289. txtvuCubicKilometers = 'cubic kilometers (km^3)';
  290. txtvuCubicInches = 'cubic inches (in^3)';
  291. txtvuCubicFeet = 'cubic feet (ft^3)';
  292. txtvuCubicYards = 'cubic yards (yd^3)';
  293. txtvuCubicMiles = 'cubic miles (mi^3)';
  294. txtvuMilliLiters = 'milliliters (ml)';
  295. txtvuCentiLiters = 'centiliters (cl)';
  296. txtvuDeciLiters = 'deciliters (dl)';
  297. txtvuLiters = 'liters (l)';
  298. txtvuDecaLiters = 'decaliters (dal)';
  299. txtvuHectoLiters = 'hectoliters (hl)';
  300. txtvuKiloLiters = 'kiloliters (kl)';
  301. txtvuAcreFeet = 'acrefeet (acre ft)';
  302. txtvuAcreInches = 'acreinches (acre in)';
  303. txtvuCords = 'cords (??)';
  304. txtvuCordFeet = 'cordfeet (??)';
  305. txtvuDecisteres = 'decisteres (??)';
  306. txtvuSteres = 'steres (??)';
  307. txtvuDecasteres = 'decasteres (??)';
  308. txtvuFluidGallons = 'US fluid gallons (fl gal)';
  309. txtvuFluidQuarts = 'US fluid Quarts (fl Quart)';
  310. txtvuFluidPints = 'US fluid Pints (fl pints)';
  311. txtvuFluidCups = 'US fluid Cups (fl Cups)';
  312. txtvuFluidGills = 'US fluid Gills (fl Quart)';
  313. txtvuFluidOunces = 'US fluid Ounces (fl Ounces)';
  314. txtvuFluidTablespoons = 'US fluid Tablespoons (fl Tablespoons)';
  315. txtvuFluidTeaspoons = 'US fluid teaspoons (fl teaspoon)';
  316. txtvuDryGallons = 'US dry gallons (dr gal)';
  317. txtvuDryQuarts = 'US dry Quarts (dr Quart)';
  318. txtvuDryPints = 'US dry Pints (dr pints)';
  319. txtvuDryPecks = 'US dry pecks (dr pecks)';
  320. txtvuDryBuckets = 'US dry buckets (dr buckets)';
  321. txtvuDryBushels = 'US dry bushels (dr bushels)';
  322. txtvuUKGallons = 'UK gallons (fl gal)';
  323. txtvuUKPottles = 'UK Pottles (fl pttle)';
  324. txtvuUKQuarts = 'UK Quarts (fl Quart)';
  325. txtvuUKPints = 'UK Pints (fl pints)';
  326. txtvuUKGills = 'UK Gills (fl Quart)';
  327. txtvuUKOunces = 'UK Ounces (fl Ounces)';
  328. txtvuUKPecks = 'UK pecks (dr pecks)';
  329. txtvuUKBuckets = 'UK buckets (dr buckets)';
  330. txtvuUKBushels = 'UK bushels (dr bushels)';
  331. Type ResourceData = record
  332. Description : String;
  333. Value : TConvUtilFloat;
  334. Fam : TConvFamily;
  335. end;
  336. var TheUnits : array of ResourceData =nil;
  337. TheFamilies : array of string =nil;
  338. function ConvFamilyToDescription(const AFamily: TConvFamily): string;
  339. begin
  340. result:='';
  341. if AFamily<length(TheFamilies) then
  342. result:=TheFamilies[AFamily];
  343. end;
  344. procedure GetConvFamilies(out AFamilies: TConvFamilyArray);
  345. var i : integer;
  346. begin
  347. setlength(AFamilies,length(thefamilies));
  348. for i:=0 to length(TheFamilies)-1 do
  349. AFamilies[i]:=i;
  350. end;
  351. procedure GetConvTypes(const AFamily: TConvFamily; out ATypes: TConvTypeArray);
  352. var i,j,nrTypes:integer;
  353. begin
  354. nrTypes:=0;
  355. for i:=0 to length(TheUnits)-1 do
  356. if TheUnits[i].fam=AFamily Then
  357. inc(nrTypes);
  358. setlength(atypes,nrtypes);
  359. j:=0;
  360. for i:=0 to length(TheUnits)-1 do
  361. if TheUnits[i].fam=AFamily Then
  362. begin
  363. atypes[j]:=i;
  364. inc(j);
  365. end;
  366. end;
  367. function ConvTypeToDescription(const AType: TConvType): string;
  368. Begin
  369. result:='';
  370. if AType<length(TheUnits) then
  371. result:=TheUnits[AType].Description;
  372. end;
  373. Function RegisterConversionFamily(Const S:String):TConvFamily;
  374. var i,l : Longint;
  375. begin
  376. l:=Length(TheFamilies);
  377. If l=0 Then
  378. begin
  379. SetLength(TheFamilies,1);
  380. TheFamilies[0]:=S;
  381. Result:=0;
  382. end
  383. else
  384. begin
  385. i:=0;
  386. while (i<l) and (s<>TheFamilies[i]) do inc(i);
  387. if i=l Then
  388. begin
  389. SetLength(TheFamilies,l+1);
  390. TheFamilies[l]:=s;
  391. end;
  392. Result:=i;
  393. end;
  394. end;
  395. Function CheckFamily(i:TConvFamily):Boolean;
  396. begin
  397. Result:=i<Length(TheFamilies);
  398. end;
  399. const macheps=1E-9;
  400. Function RegisterConversionType(Fam:TConvFamily;Const S:String;Value:TConvUtilFloat):TConvType;
  401. var l1 : Longint;
  402. begin
  403. If NOT CheckFamily(Fam) Then exit(-1); // family not registered.
  404. if (value+1.0)<macheps then // not properly defined yet.
  405. exit(-1);
  406. l1:=length(theunits);
  407. Setlength(theunits,l1+1);
  408. theunits[l1].description:=s;
  409. theunits[l1].value:=value;
  410. theunits[l1].fam:=fam;
  411. Result:=l1;
  412. end;
  413. function SearchConvert(TheType:TConvType; var r:ResourceData):Boolean;
  414. var l1 : longint;
  415. begin
  416. l1:=length(TheUnits);
  417. if thetype>=l1 then
  418. exit(false);
  419. r:=theunits[thetype];
  420. result:=true;
  421. end;
  422. function Convert ( const Measurement : Double; const FromType, ToType : TConvType ) :TConvUtilFloat;
  423. var
  424. fromrec,torec : resourcedata;
  425. begin
  426. if not SearchConvert(fromtype,fromrec) then
  427. exit(-1.0); // raise exception?
  428. if not SearchConvert(totype,torec) then
  429. exit(-1.0); // raise except?
  430. if fromrec.fam<>torec.fam then
  431. exit(-1.0);
  432. result:=Measurement*fromrec.value/torec.value;
  433. end;
  434. function Convert ( const Measurement : Double; const FromType1, FromType2, ToType1, ToType2 : TConvType ) :TConvUtilFloat;
  435. var
  436. fromrec1,fromrec2,torec1 ,
  437. torec2 : resourcedata;
  438. begin
  439. if not SearchConvert(fromtype1,fromrec1) then
  440. exit(-1.0); // raise exception?
  441. if not SearchConvert(totype1,torec1) then
  442. exit(-1.0); // raise except?
  443. if not SearchConvert(fromtype2,fromrec2) then
  444. exit(-1.0); // raise exception?
  445. if not SearchConvert(totype2,torec2) then
  446. exit(-1.0); // raise except?
  447. if (fromrec1.fam<>torec1.fam) or (fromrec1.fam<>torec1.fam) then
  448. exit(-1.0);
  449. result:=Measurement*(fromrec1.value/fromrec2.value)/(torec1.value/torec2.value);
  450. end;
  451. Constructor TConvTypeInfo.Create(Const AConvFamily : TConvFamily;const ADescription:String);
  452. begin
  453. FDescription:=ADescription;
  454. FConvFamily :=AConvFamily;
  455. end;
  456. // initial FFU factors from a HP48g calculator and BSD units program. However after
  457. // a while, the bushels/forthnight got boring, so please check.
  458. // undefined/uncertain factors get -1, and convert() functions
  459. // should check that and bomb on it.
  460. procedure RegisterArea;
  461. begin
  462. auSquareMillimeters := RegisterConversionType(cbArea,txtauSquareMillimeters,1E-6);
  463. auSquareCentimeters := RegisterConversionType(cbArea,txtauSquareCentimeters,1E-4);
  464. auSquareDecimeters := RegisterConversionType(cbArea,txtauSquareDecimeters,1E-2);
  465. auSquareMeters := RegisterConversionType(cbArea,txtauSquareMeters,1);
  466. auSquareDecameters := RegisterConversionType(cbArea,txtauSquareDecameters,1E2);
  467. auSquareHectometers := RegisterConversionType(cbArea,txtauSquareHectometers,1E4);
  468. auSquareKilometers := RegisterConversionType(cbArea,txtauSquareKilometers,1E6);
  469. auSquareInches := RegisterConversionType(cbArea,txtauSquareInches,0.00064516);
  470. auSquareFeet := RegisterConversionType(cbArea,txtauSquareFeet,0.092903040);
  471. auSquareYards := RegisterConversionType(cbArea,txtauSquareYards,0.83612736);
  472. auSquareMiles := RegisterConversionType(cbArea,txtauSquareMiles,2589988.11034);
  473. auAcres := RegisterConversionType(cbArea,txtauAcres,4046.87260987);
  474. auCentares := RegisterConversionType(cbArea,txtauCentares,-1);
  475. auAres := RegisterConversionType(cbArea,txtauAres,100);
  476. auHectares := RegisterConversionType(cbArea,txtauHectares,10000);
  477. auSquareRods := RegisterConversionType(cbArea,txtauSquareRods,25.2929538117);
  478. end;
  479. procedure RegisterLengths;
  480. begin
  481. duMicromicrons := RegisterConversionType(cbDistance,txtduMicromicrons,1E-12);
  482. duAngstroms := RegisterConversionType(cbDistance,txtduAngstroms,1E-10);
  483. duMillimicrons := RegisterConversionType(cbDistance,txtduMillimicrons,1E-9);
  484. duMicrons := RegisterConversionType(cbDistance,txtduMicrons,1E-6);
  485. duMillimeters := RegisterConversionType(cbDistance,txtduMillimeters,1E-3);
  486. duCentimeters := RegisterConversionType(cbDistance,txtduCentimeters,1E-2);
  487. duDecimeters := RegisterConversionType(cbDistance,txtduDecimeters,1E-1);
  488. duMeters := RegisterConversionType(cbDistance,txtduMeters,1);
  489. duDecameters := RegisterConversionType(cbDistance,txtduDecameters,10);
  490. duHectometers := RegisterConversionType(cbDistance,txtduHectometers,100);
  491. duKilometers := RegisterConversionType(cbDistance,txtduKilometers,1000);
  492. duMegameters := RegisterConversionType(cbDistance,txtduMegameters,1E6);
  493. duGigameters := RegisterConversionType(cbDistance,txtduGigameters,1E9);
  494. duInches := RegisterConversionType(cbDistance,txtduInches,0.0254);
  495. duFeet := RegisterConversionType(cbDistance,txtduFeet,0.3048);
  496. duYards := RegisterConversionType(cbDistance,txtduYards,0.9144);
  497. duMiles := RegisterConversionType(cbDistance,txtduMiles,1609.344);
  498. duNauticalMiles := RegisterConversionType(cbDistance,txtduNauticalMiles,1852);
  499. duAstronomicalUnits := RegisterConversionType(cbDistance,txtduAstronomicalUnits,149597900000.0);
  500. duLightYears := RegisterConversionType(cbDistance,txtduLightYears,9.46052840488E15);
  501. duParsecs := RegisterConversionType(cbDistance,txtduParsecs, 3.08567818585E16);
  502. duCubits := RegisterConversionType(cbDistance,txtduCubits,0.4572);
  503. duFathoms := RegisterConversionType(cbDistance,txtduFathoms,1.8288);
  504. duFurlongs := RegisterConversionType(cbDistance,txtduFurlongs,201.168);
  505. duHands := RegisterConversionType(cbDistance,txtduHands,0.1016);
  506. duPaces := RegisterConversionType(cbDistance,txtduPaces,0.9144);
  507. duRods := RegisterConversionType(cbDistance,txtduRods,5.0292);
  508. duChains := RegisterConversionType(cbDistance,txtduChains,20.1168);
  509. duLinks := RegisterConversionType(cbDistance,txtduLinks,0.201168);
  510. duPicas := RegisterConversionType(cbDistance,txtduPicas,0.0042333333);
  511. duPoints := RegisterConversionType(cbDistance,txtduPoints,0.00035277778);
  512. end;
  513. procedure Registermass; // weight? :)
  514. begin
  515. muNanograms := RegisterConversionType(cbMass,txtmuNanograms,1E-12);
  516. muMicrograms := RegisterConversionType(cbMass,txtmuMicrograms,1E-9);
  517. muMilligrams := RegisterConversionType(cbMass,txtmuMilligrams,1E-6);
  518. muCentigrams := RegisterConversionType(cbMass,txtmuCentigrams,1E-5);
  519. muDecigrams := RegisterConversionType(cbMass,txtmuDecigrams,1E-4);
  520. muGrams := RegisterConversionType(cbMass,txtmuGrams,1E-3);
  521. muDecagrams := RegisterConversionType(cbMass,txtmuDecagrams,1E-2);
  522. muHectograms := RegisterConversionType(cbMass,txtmuHectograms,1E-1);
  523. muKilograms := RegisterConversionType(cbMass,txtmuKilograms,1);
  524. muMetricTons := RegisterConversionType(cbMass,txtmuMetricTons,1000);
  525. muDrams := RegisterConversionType(cbMass,txtmuDrams,0.0017718452);
  526. muGrains := RegisterConversionType(cbMass,txtmuGrains,6.479891E-5);
  527. muLongTons := RegisterConversionType(cbMass,txtmuLongTons,1016.0469);
  528. muTons := RegisterConversionType(cbMass,txtmuTons,907.18474);
  529. muOunces := RegisterConversionType(cbMass,txtmuOunces,0.028349523);
  530. muPounds := RegisterConversionType(cbMass,txtmuPounds,0.45359237);
  531. muStones := RegisterConversionType(cbMass,txtmuStones,6.3502932);
  532. end;
  533. procedure RegisterTemperature;
  534. begin
  535. tuCelsius := RegisterConversionType(cbTemperature,txttuCelsius,1);
  536. tuKelvin := RegisterConversionType(cbTemperature,txttuKelvin,1);
  537. tuFahrenheit := RegisterConversionType(cbTemperature,txttuFahrenheit,5/9);
  538. tuRankine := RegisterConversionType(cbTemperature,txttuRankine,0.5555556);
  539. tuReamur := RegisterConversionType(cbTemperature,txttuReamur,10/8); // Reaumur?
  540. end;
  541. Const Yearsec=365.24219879*24*3600.0; // year in seconds;
  542. procedure RegisterTimes;
  543. begin
  544. tuMilliSeconds := RegisterConversionType(cbTime,txttuMilliSeconds,1E-3);
  545. tuSeconds := RegisterConversionType(cbTime,txttuSeconds,1);
  546. tuMinutes := RegisterConversionType(cbTime,txttuMinutes,60.0);
  547. tuHours := RegisterConversionType(cbTime,txttuHours,3600.0);
  548. tuDays := RegisterConversionType(cbTime,txttuDays,24*3600.0);
  549. tuWeeks := RegisterConversionType(cbTime,txttuWeeks,7*24*3600.0);
  550. tuFortnights := RegisterConversionType(cbTime,txttuFortnights,14*24*3600.0);
  551. tuMonths := RegisterConversionType(cbTime,txttuMonths,1/12*YearSec);
  552. tuYears := RegisterConversionType(cbTime,txttuYears,YearSec);
  553. tuDecades := RegisterConversionType(cbTime,txttuDecades,10*YearSec);
  554. tuCenturies := RegisterConversionType(cbTime,txttuCenturies,100*yearsec);
  555. tuMillennia := RegisterConversionType(cbTime,txttuMillennia,1000*yearsec);
  556. tuDateTime := RegisterConversionType(cbTime,txttuDateTime,-1);
  557. tuJulianDate := RegisterConversionType(cbTime,txttuJulianDate,-1);
  558. tuModifiedJulianDate := RegisterConversionType(cbTime,txttuModifiedJulianDate,-1);
  559. end;
  560. const flgal=0.0037854118;
  561. procedure RegisterVolumes;
  562. begin
  563. vuCubicMillimeters := RegisterConversionType(cbVolume,txtvuCubicMillimeters,1E-9);
  564. vuCubicCentimeters := RegisterConversionType(cbVolume,txtvuCubicCentimeters,1E-6);
  565. vuCubicDecimeters := RegisterConversionType(cbVolume,txtvuCubicDecimeters,1E-3);
  566. vuCubicMeters := RegisterConversionType(cbVolume,txtvuCubicMeters,1);
  567. vuCubicDecameters := RegisterConversionType(cbVolume,txtvuCubicDecameters,1E3);
  568. vuCubicHectometers := RegisterConversionType(cbVolume,txtvuCubicHectometers,1E6);
  569. vuCubicKilometers := RegisterConversionType(cbVolume,txtvuCubicKilometers,1E9);
  570. vuCubicInches := RegisterConversionType(cbVolume,txtvuCubicInches,1.6387064E-5);
  571. vuCubicFeet := RegisterConversionType(cbVolume,txtvuCubicFeet,0.028316847);
  572. vuCubicYards := RegisterConversionType(cbVolume,txtvuCubicYards,0.76455486);
  573. vuCubicMiles := RegisterConversionType(cbVolume,txtvuCubicMiles,4.1681818E9);
  574. vuMilliLiters := RegisterConversionType(cbVolume,txtvuMilliLiters,1E-6);
  575. vuCentiLiters := RegisterConversionType(cbVolume,txtvuCentiLiters,1E-5);
  576. vuDeciLiters := RegisterConversionType(cbVolume,txtvuDeciLiters,1E-4);
  577. vuLiters := RegisterConversionType(cbVolume,txtvuLiters,1E-3);
  578. vuDecaLiters := RegisterConversionType(cbVolume,txtvuDecaLiters,1E-2);
  579. vuHectoLiters := RegisterConversionType(cbVolume,txtvuHectoLiters,1E-1);
  580. vuKiloLiters := RegisterConversionType(cbVolume,txtvuKiloLiters,1);
  581. vuAcreFeet := RegisterConversionType(cbVolume,txtvuAcreFeet, -1);
  582. vuAcreInches := RegisterConversionType(cbVolume,txtvuAcreInches, -1);
  583. vuCords := RegisterConversionType(cbVolume,txtvuCords,128*0.028316847);
  584. vuCordFeet := RegisterConversionType(cbVolume,txtvuCordFeet,128*0.028316847);
  585. vuDecisteres := RegisterConversionType(cbVolume,txtvuDecisteres,0.1);
  586. vuSteres := RegisterConversionType(cbVolume,txtvuSteres,1);
  587. vuDecasteres := RegisterConversionType(cbVolume,txtvuDecasteres,10);
  588. vuFluidGallons := RegisterConversionType(cbVolume,txtvuFluidGallons,flgal);
  589. vuFluidQuarts := RegisterConversionType(cbVolume,txtvuFluidQuarts,0.25*flgal);
  590. vuFluidPints := RegisterConversionType(cbVolume,txtvuFluidPints,0.5*0.25*flgal);
  591. vuFluidCups := RegisterConversionType(cbVolume,txtvuFluidCups, -1);
  592. vuFluidGills := RegisterConversionType(cbVolume,txtvuFluidGills,-1);
  593. vuFluidOunces := RegisterConversionType(cbVolume,txtvuFluidOunces,1/16*0.5*0.25*flgal);
  594. vuFluidTablespoons := RegisterConversionType(cbVolume,txtvuFluidTablespoons,-1);
  595. vuFluidTeaspoons := RegisterConversionType(cbVolume,txtvuFluidTeaspoons,-1);
  596. vuDryGallons := RegisterConversionType(cbVolume,txtvuDryGallons,-1);
  597. vuDryQuarts := RegisterConversionType(cbVolume,txtvuDryQuarts,-1);
  598. vuDryPints := RegisterConversionType(cbVolume,txtvuDryPints,-1);
  599. vuDryPecks := RegisterConversionType(cbVolume,txtvuDryPecks, 0.0088097675);
  600. vuDryBuckets := RegisterConversionType(cbVolume,txtvuDryBuckets,-1);
  601. vuDryBushels := RegisterConversionType(cbVolume,txtvuDryBushels,0.03523907);
  602. vuUKGallons := RegisterConversionType(cbVolume,txtvuUKGallons,0.0045460993);
  603. vuUKPottles := RegisterConversionType(cbVolume,txtvuUKPottles,-1);
  604. vuUKQuarts := RegisterConversionType(cbVolume,txtvuUKQuarts,0.0011365248);
  605. vuUKPints := RegisterConversionType(cbVolume,txtvuUKPints,-1);
  606. vuUKGills := RegisterConversionType(cbVolume,txtvuUKGills,-1);
  607. vuUKOunces := RegisterConversionType(cbVolume,txtvuUKOunces,2.8413121E-5);
  608. vuUKPecks := RegisterConversionType(cbVolume,txtvuUKPecks,0.0090921986);
  609. vuUKBuckets := RegisterConversionType(cbVolume,txtvuUKBuckets,-1);
  610. vuUKBushels := RegisterConversionType(cbVolume,txtvuUKBushels,0.036368794);
  611. end;
  612. Procedure RegisterFamilies;
  613. Begin
  614. cbArea := RegisterConversionFamily('Area');
  615. cbDistance := RegisterConversionFamily('Distance');
  616. cbMass := RegisterConversionFamily('Mass');
  617. cbTemperature := RegisterConversionFamily('Temperature');
  618. cbTime := RegisterConversionFamily('Time');
  619. cbVolume := RegisterConversionFamily('Volume');
  620. End;
  621. Procedure RegisterAll;
  622. begin
  623. RegisterFamilies;
  624. RegisterVolumes;
  625. RegisterTimes;
  626. RegisterTemperature;
  627. Registermass;
  628. RegisterLengths;
  629. RegisterArea;
  630. end;
  631. initialization
  632. registerall;
  633. finalization
  634. setlength(theunits,0);
  635. setlength(thefamilies,0);
  636. end.