convutil.inc 25 KB

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