2
0

cvarutil.inc 55 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 2000,2001 by the Free Pascal development team
  4. Interface and OS-dependent part of variant support
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. Resourcestring
  12. SNoInterfaces = 'No interfaces supported';
  13. Procedure NoInterfaces;
  14. begin
  15. Raise Exception.Create(SNoInterfaces);
  16. end;
  17. Procedure VariantTypeMismatch; overload;
  18. begin
  19. Raise EVariantError.CreateCode(VAR_TYPEMISMATCH);
  20. end;
  21. Procedure VariantTypeMismatch(const SourceType, DestType: TVarType);
  22. begin
  23. { ignore the types for now ... }
  24. Raise EVariantError.CreateCode(VAR_TYPEMISMATCH);
  25. end;
  26. Function ExceptionToVariantError (E : Exception): HResult;
  27. begin
  28. If E is EoutOfMemory then
  29. Result:=VAR_OUTOFMEMORY
  30. else
  31. Result:=VAR_EXCEPTION;
  32. end;
  33. { ---------------------------------------------------------------------
  34. OS-independent functions not present in Windows
  35. ---------------------------------------------------------------------}
  36. {--- SmallInt ---}
  37. Function WStrToSmallInt(p: Pointer) : SmallInt;
  38. var
  39. Error : Word;
  40. begin
  41. Val(WideString(p), Result, Error);
  42. if Error <> 0 then
  43. VariantTypeMismatch(varOleStr, varSmallInt);
  44. end;
  45. Function LStrToSmallInt(p: Pointer) : SmallInt;
  46. var
  47. Error : Word;
  48. begin
  49. Val(AnsiString(p), Result, Error);
  50. if Error <> 0 then
  51. VariantTypeMismatch(varString, varSmallInt);
  52. end;
  53. function UStrToSmallInt(p: Pointer): SmallInt;
  54. var
  55. Error: Word;
  56. begin
  57. Val(UnicodeString(p), Result, Error);
  58. if Error <> 0 then
  59. VariantTypeMismatch(varUString, varSmallInt);
  60. end;
  61. Function VariantToSmallInt(const VargSrc : TVarData) : SmallInt;
  62. begin
  63. {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
  64. DumpVariant('VariantToSmallInt', VargSrc);
  65. end; {$ENDIF}
  66. with VargSrc do
  67. case vType and not varTypeMask of
  68. 0: case vType of
  69. varEmpty : Result := 0;
  70. varSmallInt : Result := vSmallInt;
  71. varShortInt : Result := vShortInt;
  72. varInteger : Result := smallint(vInteger);
  73. {$ifndef FPUNONE}
  74. varSingle : Result := smallint(Round(vSingle));
  75. varDouble : Result := smallint(Round(vDouble));
  76. varDate : Result := smallint(Round(vDate));
  77. {$endif}
  78. varCurrency : Result := smallint(Round(vCurrency));
  79. varBoolean : Result := smallint(SmallInt(vBoolean));
  80. varVariant : Result := VariantToSmallInt(PVarData(vPointer)^);
  81. varByte : Result := vByte;
  82. varWord : Result := smallint(vWord);
  83. varLongWord : Result := smallint(vLongWord);
  84. varInt64 : Result := smallint(vInt64);
  85. varQword : Result := smallint(vQWord);
  86. varOleStr : Result := WStrToSmallInt(vOleStr);
  87. varString : Result := LStrToSmallInt(vString);
  88. varUString : Result := UStrToSmallInt(vString);
  89. else
  90. VariantTypeMismatch(vType, varSmallInt);
  91. end;
  92. varByRef: if Assigned(vPointer) then case vType and varTypeMask of
  93. varSmallInt : Result := PSmallInt(vPointer)^;
  94. varShortInt : Result := PShortInt(vPointer)^;
  95. varInteger : Result := smallint(PInteger(vPointer)^);
  96. {$ifndef FPUNONE}
  97. varSingle : Result := smallint(Round(PSingle(vPointer)^));
  98. varDouble : Result := smallint(Round(PDouble(vPointer)^));
  99. varDate : Result := smallint(Round(PDate(vPointer)^));
  100. {$endif}
  101. varCurrency : Result := smallint(Round(PCurrency(vPointer)^));
  102. varBoolean : Result := SmallInt(PWordBool(vPointer)^);
  103. varVariant : Result := VariantToSmallInt(PVarData(vPointer)^);
  104. varByte : Result := PByte(vPointer)^;
  105. varWord : Result := smallint(PWord(vPointer)^);
  106. varLongWord : Result := smallint(PLongWord(vPointer)^);
  107. varInt64 : Result := smallint(PInt64(vPointer)^);
  108. varQword : Result := smallint(PQWord(vPointer)^);
  109. varOleStr : Result := WStrToSmallInt(PPointer(vPointer)^);
  110. varString : Result := LStrToSmallInt(PPointer(vPointer)^);
  111. varUString : Result := UStrToSmallInt(PPointer(vPointer)^);
  112. else { other vtype }
  113. VariantTypeMismatch(vType, varSmallInt);
  114. end else { pointer is nil }
  115. VariantTypeMismatch(vType, varSmallInt);
  116. else { array or something like that }
  117. VariantTypeMismatch(vType, varSmallInt);
  118. end;
  119. {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
  120. WriteLn('VariantToSmallInt -> ', Result);
  121. end; {$ENDIF}
  122. end;
  123. {--- ShortInt ---}
  124. Function WStrToShortInt(p: Pointer) : ShortInt;
  125. var
  126. Error : Word;
  127. begin
  128. Val(WideString(p), Result, Error);
  129. if Error <> 0 then
  130. VariantTypeMismatch(varOleStr, varShortInt);
  131. end;
  132. Function LStrToShortInt(p: Pointer) : ShortInt;
  133. var
  134. Error : Word;
  135. begin
  136. Val(AnsiString(p), Result, Error);
  137. if Error <> 0 then
  138. VariantTypeMismatch(varString, varShortInt);
  139. end;
  140. Function UStrToShortInt(p: Pointer) : ShortInt;
  141. var
  142. Error : Word;
  143. begin
  144. Val(UnicodeString(p), Result, Error);
  145. if Error <> 0 then
  146. VariantTypeMismatch(varUString, varShortInt);
  147. end;
  148. Function VariantToShortInt(const VargSrc : TVarData) : ShortInt;
  149. begin
  150. {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
  151. DumpVariant('VariantToShortInt', VargSrc);
  152. end; {$ENDIF}
  153. with VargSrc do
  154. case vType and not varTypeMask of
  155. 0: case vType of
  156. varEmpty : Result := 0;
  157. varSmallInt : Result := shortint(vSmallInt);
  158. varShortInt : Result := vShortInt;
  159. varInteger : Result := shortint(vInteger);
  160. {$ifndef FPUNONE}
  161. varSingle : Result := shortint(Round(vSingle));
  162. varDouble : Result := shortint(Round(vDouble));
  163. varDate : Result := shortint(Round(vDate));
  164. {$endif}
  165. varCurrency : Result := shortint(Round(vCurrency));
  166. varBoolean : Result := shortint(vBoolean);
  167. varVariant : Result := VariantToShortInt(PVarData(vPointer)^);
  168. varByte : Result := shortint(vByte);
  169. varWord : Result := shortint(vWord);
  170. varLongWord : Result := shortint(vLongWord);
  171. varInt64 : Result := shortint(vInt64);
  172. varQword : Result := shortint(vQWord);
  173. varOleStr : Result := WStrToShortInt(vOleStr);
  174. varString : Result := LStrToShortInt(vString);
  175. varUString : Result := UStrToShortInt(vString);
  176. else
  177. VariantTypeMismatch(vType, varShortInt);
  178. end;
  179. varByRef: if Assigned(vPointer) then case vType and varTypeMask of
  180. varSmallInt : Result := shortint(PSmallInt(vPointer)^);
  181. varShortInt : Result := PShortInt(vPointer)^;
  182. varInteger : Result := shortint(PInteger(vPointer)^);
  183. {$ifndef FPUNONE}
  184. varSingle : Result := shortint(Round(PSingle(vPointer)^));
  185. varDouble : Result := shortint(Round(PDouble(vPointer)^));
  186. varDate : Result := shortint(Round(PDate(vPointer)^));
  187. {$endif}
  188. varCurrency : Result := shortint(Round(PCurrency(vPointer)^));
  189. varBoolean : Result := SmallInt(PWordBool(vPointer)^);
  190. varVariant : Result := VariantToShortInt(PVarData(vPointer)^);
  191. varByte : Result := shortint(PByte(vPointer)^);
  192. varWord : Result := shortint(PWord(vPointer)^);
  193. varLongWord : Result := shortint(PLongWord(vPointer)^);
  194. varInt64 : Result := shortint(PInt64(vPointer)^);
  195. varQword : Result := shortint(PQWord(vPointer)^);
  196. varOleStr : Result := WStrToShortInt(PPointer(vPointer)^);
  197. varString : Result := LStrToShortInt(PPointer(vPointer)^);
  198. varUString : Result := UStrToShortInt(PPointer(vPointer)^);
  199. else { other vtype }
  200. VariantTypeMismatch(vType, varShortInt);
  201. end else { pointer is nil }
  202. VariantTypeMismatch(vType, varShortInt);
  203. else { array or something like that }
  204. VariantTypeMismatch(vType, varShortInt);
  205. end;
  206. {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
  207. WriteLn('VariantToShortInt -> ', Result);
  208. end; {$ENDIF}
  209. end;
  210. {--- LongInt ---}
  211. Function WStrToLongInt(p: Pointer) : LongInt;
  212. var
  213. Error : Word;
  214. begin
  215. Val(WideString(p), Result, Error);
  216. if Error <> 0 then
  217. VariantTypeMismatch(varOleStr, varInteger);
  218. end;
  219. Function LStrToLongInt(p: Pointer) : LongInt;
  220. var
  221. Error : Word;
  222. begin
  223. Val(AnsiString(p), Result, Error);
  224. if Error <> 0 then
  225. VariantTypeMismatch(varString, varInteger);
  226. end;
  227. Function UStrToLongInt(p: Pointer) : LongInt;
  228. var
  229. Error : Word;
  230. begin
  231. Val(UnicodeString(p), Result, Error);
  232. if Error <> 0 then
  233. VariantTypeMismatch(varUString, varInteger);
  234. end;
  235. Function VariantToLongInt(const VargSrc : TVarData) : LongInt;
  236. begin
  237. {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
  238. DumpVariant('VariantToLongInt', VargSrc);
  239. end; {$ENDIF}
  240. with VargSrc do
  241. case vType and not varTypeMask of
  242. 0: case vType of
  243. varEmpty : Result := 0;
  244. varSmallInt : Result := vSmallInt;
  245. varShortInt : Result := vShortInt;
  246. varInteger : Result := vInteger;
  247. {$ifndef FPUNONE}
  248. varSingle : Result := longint(Round(vSingle));
  249. varDouble : Result := longint(Round(vDouble));
  250. varDate : Result := longint(Round(vDate));
  251. {$endif}
  252. varCurrency : Result := longint(Round(vCurrency));
  253. varBoolean : Result := SmallInt(vBoolean);
  254. varVariant : Result := VariantToLongInt(PVarData(vPointer)^);
  255. varByte : Result := vByte;
  256. varWord : Result := vWord;
  257. varLongWord : Result := longint(vLongWord);
  258. varInt64 : Result := longint(vInt64);
  259. varQword : Result := longint(vQWord);
  260. varOleStr : Result := WStrToLongInt(vOleStr);
  261. varString : Result := LStrToLongInt(vString);
  262. varUString : Result := UStrToLongInt(vString);
  263. else
  264. VariantTypeMismatch(vType, varInteger);
  265. end;
  266. varByRef: if Assigned(vPointer) then case vType and varTypeMask of
  267. varSmallInt : Result := PSmallInt(vPointer)^;
  268. varShortInt : Result := PShortInt(vPointer)^;
  269. varInteger : Result := PInteger(vPointer)^;
  270. {$ifndef FPUNONE}
  271. varSingle : Result := longint(Round(PSingle(vPointer)^));
  272. varDouble : Result := longint(Round(PDouble(vPointer)^));
  273. varDate : Result := longint(Round(PDate(vPointer)^));
  274. {$endif}
  275. varCurrency : Result := longint(Round(PCurrency(vPointer)^));
  276. varBoolean : Result := SmallInt(PWordBool(vPointer)^);
  277. varVariant : Result := VariantToLongInt(PVarData(vPointer)^);
  278. varByte : Result := PByte(vPointer)^;
  279. varWord : Result := PWord(vPointer)^;
  280. varLongWord : Result := longint(PLongWord(vPointer)^);
  281. varInt64 : Result := longint(PInt64(vPointer)^);
  282. varQword : Result := longint(PQWord(vPointer)^);
  283. varOleStr : Result := WStrToLongInt(PPointer(vPointer)^);
  284. varString : Result := LStrToLongInt(PPointer(vPointer)^);
  285. varUString : Result := UStrToLongInt(PPointer(vPointer)^);
  286. else { other vtype }
  287. VariantTypeMismatch(vType, varInteger);
  288. end else { pointer is nil }
  289. VariantTypeMismatch(vType, varInteger);
  290. else { array or something like that }
  291. VariantTypeMismatch(vType, varInteger);
  292. end;
  293. {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
  294. WriteLn('VariantToLongInt -> ', Result);
  295. end; {$ENDIF}
  296. end;
  297. {--- Cardinal ---}
  298. Function WStrToCardinal(p: Pointer) : Cardinal;
  299. var
  300. Error : Word;
  301. begin
  302. Val(WideString(p), Result, Error);
  303. if Error <> 0 then
  304. VariantTypeMismatch(varOleStr, varLongWord);
  305. end;
  306. Function LStrToCardinal(p: Pointer) : Cardinal;
  307. var
  308. Error : Word;
  309. begin
  310. Val(AnsiString(p), Result, Error);
  311. if Error <> 0 then
  312. VariantTypeMismatch(varString, varLongWord);
  313. end;
  314. Function UStrToCardinal(p: Pointer) : Cardinal;
  315. var
  316. Error : Word;
  317. begin
  318. Val(UnicodeString(p), Result, Error);
  319. if Error <> 0 then
  320. VariantTypeMismatch(varUString, varLongWord);
  321. end;
  322. Function VariantToCardinal(const VargSrc : TVarData) : Cardinal;
  323. begin
  324. {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
  325. DumpVariant('VariantToCardinal', VargSrc);
  326. end; {$ENDIF}
  327. with VargSrc do
  328. case vType and not varTypeMask of
  329. 0: case vType of
  330. varEmpty : Result := 0;
  331. varSmallInt : Result := vSmallInt;
  332. varShortInt : Result := vShortInt;
  333. varInteger : Result := cardinal(vInteger);
  334. {$ifndef FPUNONE}
  335. varSingle : Result := cardinal(Round(vSingle));
  336. varDouble : Result := cardinal(Round(vDouble));
  337. varDate : Result := cardinal(Round(vDate));
  338. {$endif}
  339. varCurrency : Result := cardinal(Round(vCurrency));
  340. varBoolean : Result := cardinal(SmallInt(vBoolean));
  341. varVariant : Result := VariantToCardinal(PVarData(vPointer)^);
  342. varByte : Result := vByte;
  343. varWord : Result := vWord;
  344. varLongWord : Result := vLongWord;
  345. varInt64 : Result := cardinal(vInt64);
  346. varQword : Result := cardinal(vQWord);
  347. varOleStr : Result := WStrToCardinal(vOleStr);
  348. varString : Result := LStrToCardinal(vString);
  349. varUString : Result := UStrToCardinal(vString);
  350. else
  351. VariantTypeMismatch(vType, varLongWord);
  352. end;
  353. varByRef: if Assigned(vPointer) then case vType and varTypeMask of
  354. varSmallInt : Result := cardinal(PSmallInt(vPointer)^);
  355. varShortInt : Result := cardinal(PShortInt(vPointer)^);
  356. varInteger : Result := cardinal(PInteger(vPointer)^);
  357. {$ifndef FPUNONE}
  358. varSingle : Result := cardinal(Round(PSingle(vPointer)^));
  359. varDouble : Result := cardinal(Round(PDouble(vPointer)^));
  360. varDate : Result := cardinal(Round(PDate(vPointer)^));
  361. {$endif}
  362. varCurrency : Result := cardinal(Round(PCurrency(vPointer)^));
  363. varBoolean : Result := cardinal(SmallInt(PWordBool(vPointer)^));
  364. varVariant : Result := VariantToCardinal(PVarData(vPointer)^);
  365. varByte : Result := PByte(vPointer)^;
  366. varWord : Result := PWord(vPointer)^;
  367. varLongWord : Result := PLongWord(vPointer)^;
  368. varInt64 : Result := cardinal(PInt64(vPointer)^);
  369. varQword : Result := cardinal(PQWord(vPointer)^);
  370. varOleStr : Result := WStrToCardinal(PPointer(vPointer)^);
  371. varString : Result := LStrToCardinal(PPointer(vPointer)^);
  372. varUString : Result := UStrToCardinal(PPointer(vPointer)^);
  373. else { other vtype }
  374. VariantTypeMismatch(vType, varLongWord);
  375. end else { pointer is nil }
  376. VariantTypeMismatch(vType, varLongWord);
  377. else { array or something like that }
  378. VariantTypeMismatch(vType, varLongWord);
  379. end;
  380. {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
  381. WriteLn('VariantToCardinal -> ', Result);
  382. end; {$ENDIF}
  383. end;
  384. procedure PrepareFloatStr(var s: ShortString);
  385. var
  386. i, j : Byte;
  387. begin
  388. j := 1;
  389. for i := 1 to Length(s) do
  390. if s[i] <> ThousandSeparator then begin
  391. if s[i] = DecimalSeparator then
  392. s[j] := '.'
  393. else
  394. s[j] := s[i];
  395. Inc(j);
  396. end;
  397. SetLength(s, Pred(j));
  398. end;
  399. {--- Single ---}
  400. {$ifndef FPUNONE}
  401. Function WStrToSingle(p: Pointer) : Single;
  402. var
  403. s : ShortString;
  404. Error : Word;
  405. begin
  406. if Length(WideString(p)) > 255 then
  407. VariantTypeMismatch(varOleStr, varSingle);
  408. s := WideString(p);
  409. PrepareFloatStr(s);
  410. Val(s, Result, Error);
  411. if Error <> 0 then
  412. VariantTypeMismatch(varOleStr, varSingle);
  413. end;
  414. Function LStrToSingle(p: Pointer) : Single;
  415. var
  416. s : ShortString;
  417. Error : Word;
  418. begin
  419. if Length(AnsiString(p)) > 255 then
  420. VariantTypeMismatch(varString, varSingle);
  421. s := AnsiString(p);
  422. PrepareFloatStr(s);
  423. Val(s, Result, Error);
  424. if Error <> 0 then
  425. VariantTypeMismatch(varString, varSingle);
  426. end;
  427. Function UStrToSingle(p: Pointer) : Single;
  428. var
  429. s : ShortString;
  430. Error : Word;
  431. begin
  432. if Length(UnicodeString(p)) > 255 then
  433. VariantTypeMismatch(varUString, varSingle);
  434. s := UnicodeString(p);
  435. PrepareFloatStr(s);
  436. Val(s, Result, Error);
  437. if Error <> 0 then
  438. VariantTypeMismatch(varUString, varSingle);
  439. end;
  440. Function VariantToSingle(const VargSrc : TVarData) : Single;
  441. begin
  442. {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
  443. DumpVariant('VariantToSingle', VargSrc);
  444. end; {$ENDIF}
  445. with VargSrc do
  446. case vType and not varTypeMask of
  447. 0: case vType of
  448. varEmpty : Result := 0;
  449. varSmallInt : Result := vSmallInt;
  450. varShortInt : Result := vShortInt;
  451. varInteger : Result := vInteger;
  452. varSingle : Result := vSingle;
  453. varDouble : Result := vDouble;
  454. varCurrency : Result := vCurrency;
  455. varDate : Result := vDate;
  456. varBoolean : Result := SmallInt(vBoolean);
  457. varVariant : Result := VariantToSingle(PVarData(vPointer)^);
  458. varByte : Result := vByte;
  459. varWord : Result := vWord;
  460. varLongWord : Result := vLongWord;
  461. varInt64 : Result := vInt64;
  462. varQword : Result := vQWord;
  463. varOleStr : Result := WStrToSingle(vOleStr);
  464. varString : Result := LStrToSingle(vString);
  465. varUString : Result := UStrToSingle(vString);
  466. else
  467. VariantTypeMismatch(vType, varSingle);
  468. end;
  469. varByRef: if Assigned(vPointer) then case vType and varTypeMask of
  470. varSmallInt : Result := PSmallInt(vPointer)^;
  471. varShortInt : Result := PShortInt(vPointer)^;
  472. varInteger : Result := PInteger(vPointer)^;
  473. varSingle : Result := PSingle(vPointer)^;
  474. varDouble : Result := PDouble(vPointer)^;
  475. varCurrency : Result := PCurrency(vPointer)^;
  476. varDate : Result := PDate(vPointer)^;
  477. varBoolean : Result := SmallInt(PWordBool(vPointer)^);
  478. varVariant : Result := VariantToSingle(PVarData(vPointer)^);
  479. varByte : Result := PByte(vPointer)^;
  480. varWord : Result := PWord(vPointer)^;
  481. varLongWord : Result := PLongWord(vPointer)^;
  482. varInt64 : Result := PInt64(vPointer)^;
  483. varQword : Result := PQWord(vPointer)^;
  484. varOleStr : Result := WStrToSingle(PPointer(vPointer)^);
  485. varString : Result := LStrToSingle(PPointer(vPointer)^);
  486. varUString : Result := UStrToSingle(PPointer(vPointer)^);
  487. else { other vtype }
  488. VariantTypeMismatch(vType, varSingle);
  489. end else { pointer is nil }
  490. VariantTypeMismatch(vType, varSingle);
  491. else { array or something like that }
  492. VariantTypeMismatch(vType, varSingle);
  493. end;
  494. {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
  495. WriteLn('VariantToSingle -> ', Result);
  496. end; {$ENDIF}
  497. end;
  498. {--- Double ---}
  499. Function WStrToDouble(p: Pointer) : Double;
  500. var
  501. s : ShortString;
  502. Error : Word;
  503. begin
  504. if Length(WideString(p)) > 255 then
  505. VariantTypeMismatch(varOleStr, varDouble);
  506. s := WideString(p);
  507. PrepareFloatStr(s);
  508. Val(s, Result, Error);
  509. if Error <> 0 then
  510. VariantTypeMismatch(varOleStr, varDouble);
  511. end;
  512. Function LStrToDouble(p: Pointer) : Double;
  513. var
  514. s : ShortString;
  515. Error : Word;
  516. begin
  517. if Length(AnsiString(p)) > 255 then
  518. VariantTypeMismatch(varString, varDouble);
  519. s := AnsiString(p);
  520. PrepareFloatStr(s);
  521. Val(s, Result, Error);
  522. if Error <> 0 then
  523. VariantTypeMismatch(varString, varDouble);
  524. end;
  525. Function UStrToDouble(p: Pointer) : Double;
  526. var
  527. s : ShortString;
  528. Error : Word;
  529. begin
  530. if Length(UnicodeString(p)) > 255 then
  531. VariantTypeMismatch(varUString, varDouble);
  532. s := UnicodeString(p);
  533. PrepareFloatStr(s);
  534. Val(s, Result, Error);
  535. if Error <> 0 then
  536. VariantTypeMismatch(varUString, varDouble);
  537. end;
  538. Function VariantToDouble(const VargSrc : TVarData) : Double;
  539. begin
  540. {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
  541. DumpVariant('VariantToDouble', VargSrc);
  542. end; {$ENDIF}
  543. with VargSrc do
  544. case vType and not varTypeMask of
  545. 0: case vType of
  546. varEmpty : Result := 0;
  547. varSmallInt : Result := vSmallInt;
  548. varShortInt : Result := vShortInt;
  549. varInteger : Result := vInteger;
  550. varSingle : Result := vSingle;
  551. varDouble : Result := vDouble;
  552. varCurrency : Result := vCurrency;
  553. varDate : Result := vDate;
  554. varBoolean : Result := SmallInt(vBoolean);
  555. varVariant : Result := VariantToDouble(PVarData(vPointer)^);
  556. varByte : Result := vByte;
  557. varWord : Result := vWord;
  558. varLongWord : Result := vLongWord;
  559. varInt64 : Result := vInt64;
  560. varQword : Result := vQWord;
  561. varOleStr : Result := WStrToDouble(vOleStr);
  562. varString : Result := LStrToDouble(vString);
  563. varUString : Result := UStrToDouble(vString);
  564. else
  565. VariantTypeMismatch(vType, varDouble);
  566. end;
  567. varByRef: if Assigned(vPointer) then case vType and varTypeMask of
  568. varSmallInt : Result := PSmallInt(vPointer)^;
  569. varShortInt : Result := PShortInt(vPointer)^;
  570. varInteger : Result := PInteger(vPointer)^;
  571. varSingle : Result := PSingle(vPointer)^;
  572. varDouble : Result := PDouble(vPointer)^;
  573. varCurrency : Result := PCurrency(vPointer)^;
  574. varDate : Result := PDate(vPointer)^;
  575. varBoolean : Result := SmallInt(PWordBool(vPointer)^);
  576. varVariant : Result := VariantToDouble(PVarData(vPointer)^);
  577. varByte : Result := PByte(vPointer)^;
  578. varWord : Result := PWord(vPointer)^;
  579. varLongWord : Result := PLongWord(vPointer)^;
  580. varInt64 : Result := PInt64(vPointer)^;
  581. varQword : Result := PQWord(vPointer)^;
  582. varOleStr : Result := WStrToDouble(PPointer(vPointer)^);
  583. varString : Result := LStrToDouble(PPointer(vPointer)^);
  584. varUString : Result := UStrToDouble(PPointer(vPointer)^);
  585. else { other vtype }
  586. VariantTypeMismatch(vType, varDouble);
  587. end else { pointer is nil }
  588. VariantTypeMismatch(vType, varDouble);
  589. else { array or something like that }
  590. VariantTypeMismatch(vType, varDouble);
  591. end;
  592. {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
  593. WriteLn('VariantToDouble -> ', Result);
  594. end; {$ENDIF}
  595. end;
  596. {$endif FPUNONE}
  597. {--- Currency ---}
  598. Function WStrToCurrency(p: Pointer) : Currency;
  599. var
  600. s : ShortString;
  601. Error : Word;
  602. {$IFNDEF FPC_HAS_STR_CURRENCY}
  603. Temp : Extended;
  604. {$ENDIF FPC_HAS_STR_CURRENCY}
  605. begin
  606. if Length(WideString(p)) > 255 then
  607. VariantTypeMismatch(varOleStr, varCurrency);
  608. s := WideString(p);
  609. PrepareFloatStr(s);
  610. {$IFDEF FPC_HAS_STR_CURRENCY}
  611. Val(s, Result, Error);
  612. {$ELSE FPC_HAS_STR_CURRENCY} { needed for platforms where Currency = Int64 }
  613. Val(s, Temp, Error);
  614. Result := Temp;
  615. {$ENDIF FPC_HAS_STR_CURRENCY}
  616. if Error <> 0 then
  617. VariantTypeMismatch(varOleStr, varCurrency);
  618. end;
  619. Function LStrToCurrency(p: Pointer) : Currency;
  620. var
  621. s : ShortString;
  622. Error : Word;
  623. {$IFNDEF FPC_HAS_STR_CURRENCY}
  624. Temp : Extended;
  625. {$ENDIF FPC_HAS_STR_CURRENCY}
  626. begin
  627. if Length(AnsiString(p)) > 255 then
  628. VariantTypeMismatch(varString, varCurrency);
  629. s := AnsiString(p);
  630. PrepareFloatStr(s);
  631. {$IFDEF FPC_HAS_STR_CURRENCY}
  632. Val(s, Result, Error);
  633. {$ELSE FPC_HAS_STR_CURRENCY} { needed for platforms where Currency = Int64 }
  634. Val(s, Temp, Error);
  635. Result := Temp;
  636. {$ENDIF FPC_HAS_STR_CURRENCY}
  637. if Error <> 0 then
  638. VariantTypeMismatch(varString, varCurrency);
  639. end;
  640. Function UStrToCurrency(p: Pointer) : Currency;
  641. var
  642. s : ShortString;
  643. Error : Word;
  644. {$IFNDEF FPC_HAS_STR_CURRENCY}
  645. Temp : Extended;
  646. {$ENDIF FPC_HAS_STR_CURRENCY}
  647. begin
  648. if Length(UnicodeString(p)) > 255 then
  649. VariantTypeMismatch(varUString, varCurrency);
  650. s := UnicodeString(p);
  651. PrepareFloatStr(s);
  652. {$IFDEF FPC_HAS_STR_CURRENCY}
  653. Val(s, Result, Error);
  654. {$ELSE FPC_HAS_STR_CURRENCY} { needed for platforms where Currency = Int64 }
  655. Val(s, Temp, Error);
  656. Result := Temp;
  657. {$ENDIF FPC_HAS_STR_CURRENCY}
  658. if Error <> 0 then
  659. VariantTypeMismatch(varUString, varCurrency);
  660. end;
  661. Function VariantToCurrency(const VargSrc : TVarData) : Currency;
  662. begin
  663. {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
  664. DumpVariant('VariantToCurrency', VargSrc);
  665. end; {$ENDIF}
  666. with VargSrc do
  667. case vType and not varTypeMask of
  668. 0: case vType of
  669. varEmpty : Result := 0;
  670. varSmallInt : Result := vSmallInt;
  671. varShortInt : Result := vShortInt;
  672. varInteger : Result := vInteger;
  673. {$ifndef FPUNONE}
  674. varSingle : begin
  675. if (vSingle > MaxCurrency) or (vSingle < MinCurrency) then
  676. VariantTypeMismatch(vType, varCurrency);
  677. Result := vSingle;
  678. end;
  679. varDouble : begin
  680. if (vDouble > MaxCurrency) or (vDouble < MinCurrency) then
  681. VariantTypeMismatch(vType, varCurrency);
  682. Result := vDouble;
  683. end;
  684. varDate : begin
  685. if (vDate > MaxCurrency) or (vDate < MinCurrency) then
  686. VariantTypeMismatch(vType, varCurrency);
  687. Result := vDate;
  688. end;
  689. {$endif}
  690. varCurrency : Result := vCurrency;
  691. varBoolean : Result := SmallInt(vBoolean);
  692. varVariant : Result := VariantToCurrency(PVarData(vPointer)^);
  693. varByte : Result := vByte;
  694. varWord : Result := vWord;
  695. varLongWord : Result := vLongWord;
  696. varInt64 : Result := vInt64;
  697. varQword : Result := currency(vQWord);
  698. varOleStr : Result := WStrToCurrency(vOleStr);
  699. varString : Result := LStrToCurrency(vString);
  700. varUString : Result := UStrToCurrency(vString);
  701. else
  702. VariantTypeMismatch(vType, varCurrency);
  703. end;
  704. varByRef: if Assigned(vPointer) then case vType and varTypeMask of
  705. varSmallInt : Result := PSmallInt(vPointer)^;
  706. varShortInt : Result := PShortInt(vPointer)^;
  707. varInteger : Result := PInteger(vPointer)^;
  708. {$ifndef FPUNONE}
  709. varSingle : begin
  710. if (PSingle(vPointer)^ > MaxCurrency) or (PSingle(vPointer)^ < MinCurrency) then
  711. VariantTypeMismatch(vType, varCurrency);
  712. Result := PSingle(vPointer)^;
  713. end;
  714. varDouble : begin
  715. if (PDouble(vPointer)^ > MaxCurrency) or (PDouble(vPointer)^ < MinCurrency) then
  716. VariantTypeMismatch(vType, varCurrency);
  717. Result := PDouble(vPointer)^;
  718. end;
  719. varDate : begin
  720. if (PDate(vPointer)^ > MaxCurrency) or (PDate(vPointer)^ < MinCurrency) then
  721. VariantTypeMismatch(vType, varCurrency);
  722. Result := PDate(vPointer)^;
  723. end;
  724. {$endif}
  725. varCurrency : Result := PCurrency(vPointer)^;
  726. varBoolean : Result := SmallInt(PWordBool(vPointer)^);
  727. varVariant : Result := VariantToCurrency(PVarData(vPointer)^);
  728. varByte : Result := PByte(vPointer)^;
  729. varWord : Result := PWord(vPointer)^;
  730. varLongWord : Result := PLongWord(vPointer)^;
  731. varInt64 : Result := PInt64(vPointer)^;
  732. varQword : Result := currency(PQWord(vPointer)^);
  733. varOleStr : Result := WStrToCurrency(PPointer(vPointer)^);
  734. varString : Result := LStrToCurrency(PPointer(vPointer)^);
  735. varUString : Result := UStrToCurrency(PPointer(vPointer)^);
  736. else { other vtype }
  737. VariantTypeMismatch(vType, varCurrency);
  738. end else { pointer is nil }
  739. VariantTypeMismatch(vType, varCurrency);
  740. else { array or something like that }
  741. VariantTypeMismatch(vType, varCurrency);
  742. end;
  743. {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
  744. WriteLn('VariantToCurrency -> ', Result);
  745. end; {$ENDIF}
  746. end;
  747. {--- Date ---}
  748. {$ifndef FPUNONE}
  749. Function WStrToDate(p: Pointer) : TDateTime;
  750. var
  751. s: string;
  752. begin
  753. s := WideString(p);
  754. if not (TryStrToDateTime(s, Result) or
  755. TryStrToDate(s, Result) or
  756. TryStrToTime(s, Result)) then
  757. VariantTypeMismatch(varOleStr, varDate);
  758. end;
  759. Function LStrToDate(p: Pointer) : TDateTime;
  760. begin
  761. if not (TryStrToDateTime(AnsiString(p), Result) or
  762. TryStrToDate(AnsiString(p), Result) or
  763. TryStrToTime(AnsiString(p), Result)) then
  764. VariantTypeMismatch(varString, varDate);
  765. end;
  766. Function UStrToDate(p: Pointer) : TDateTime;
  767. begin
  768. if not (TryStrToDateTime(UnicodeString(p), Result) or
  769. TryStrToDate(UnicodeString(p), Result) or
  770. TryStrToTime(UnicodeString(p), Result)) then
  771. VariantTypeMismatch(varUString, varDate);
  772. end;
  773. Function VariantToDate(const VargSrc : TVarData) : TDateTime;
  774. begin
  775. {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
  776. DumpVariant('VariantToDate', VargSrc);
  777. end; {$ENDIF}
  778. with VargSrc do
  779. case vType and not varTypeMask of
  780. 0: case vType of
  781. varEmpty : Result := 0;
  782. varSmallInt : Result := vSmallInt;
  783. varShortInt : Result := vShortInt;
  784. varInteger : Result := vInteger;
  785. varSingle : Result := vSingle;
  786. varDouble : Result := vDouble;
  787. varCurrency : Result := vCurrency;
  788. varDate : Result := vDate;
  789. varBoolean : Result := SmallInt(vBoolean);
  790. varVariant : Result := VariantToDate(PVarData(vPointer)^);
  791. varByte : Result := vByte;
  792. varWord : Result := vWord;
  793. varLongWord : Result := vLongWord;
  794. varInt64 : Result := vInt64;
  795. varQword : Result := vQWord;
  796. varOleStr : Result := WStrToDate(vOleStr);
  797. varString : Result := LStrToDate(vString);
  798. varUString : Result := UStrToDate(vString);
  799. else
  800. VariantTypeMismatch(vType, varDate);
  801. end;
  802. varByRef: if Assigned(vPointer) then case vType and varTypeMask of
  803. varSmallInt : Result := PSmallInt(vPointer)^;
  804. varShortInt : Result := PShortInt(vPointer)^;
  805. varInteger : Result := PInteger(vPointer)^;
  806. varSingle : Result := PSingle(vPointer)^;
  807. varDouble : Result := PDouble(vPointer)^;
  808. varCurrency : Result := PCurrency(vPointer)^;
  809. varDate : Result := PDate(vPointer)^;
  810. varBoolean : Result := SmallInt(PWordBool(vPointer)^);
  811. varVariant : Result := VariantToDate(PVarData(vPointer)^);
  812. varByte : Result := PByte(vPointer)^;
  813. varWord : Result := PWord(vPointer)^;
  814. varLongWord : Result := PLongWord(vPointer)^;
  815. varInt64 : Result := PInt64(vPointer)^;
  816. varQword : Result := PQWord(vPointer)^;
  817. varOleStr : Result := WStrToDate(PPointer(vPointer)^);
  818. varString : Result := LStrToDate(PPointer(vPointer)^);
  819. varUString : Result := UStrToDate(PPointer(vPointer)^);
  820. else { other vtype }
  821. VariantTypeMismatch(vType, varDate);
  822. end else { pointer is nil }
  823. VariantTypeMismatch(vType, varDate);
  824. else { array or something like that }
  825. VariantTypeMismatch(vType, varDate);
  826. end;
  827. if (Result < MinDateTime) or (Result > MaxDateTime) then
  828. VariantTypeMismatch(VargSrc.vType, varDate);
  829. {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
  830. WriteLn('VariantToDate -> ', Result);
  831. end; {$ENDIF}
  832. end;
  833. {$endif}
  834. {--- Boolean ---}
  835. Function WStrToBoolean(p: Pointer) : Boolean;
  836. begin
  837. if not TryStrToBool(WideString(p), Result) then
  838. VariantTypeMismatch(varOleStr, varBoolean);
  839. end;
  840. Function LStrToBoolean(p: Pointer) : Boolean;
  841. begin
  842. if not TryStrToBool(AnsiString(p), Result) then
  843. VariantTypeMismatch(varString, varBoolean);
  844. end;
  845. Function UStrToBoolean(p: Pointer) : Boolean;
  846. begin
  847. if not TryStrToBool(UnicodeString(p), Result) then
  848. VariantTypeMismatch(varUString, varBoolean);
  849. end;
  850. Function VariantToBoolean(const VargSrc : TVarData) : Boolean;
  851. begin
  852. {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
  853. DumpVariant('VariantToBoolean', VargSrc);
  854. end; {$ENDIF}
  855. with VargSrc do
  856. case vType and not varTypeMask of
  857. 0: case vType of
  858. varEmpty : Result := False;
  859. varSmallInt : Result := vSmallInt <> 0;
  860. varShortInt : Result := vShortInt <> 0;
  861. varInteger : Result := vInteger <> 0;
  862. {$ifndef FPUNONE}
  863. varSingle : Result := vSingle <> 0;
  864. varDouble : Result := vDouble <> 0;
  865. varCurrency : Result := vCurrency <> 0;
  866. varDate : Result := vDate <> 0;
  867. {$endif}
  868. varBoolean : Result := vBoolean;
  869. varVariant : Result := VariantToBoolean(PVarData(vPointer)^);
  870. varByte : Result := vByte <> 0;
  871. varWord : Result := vWord <> 0;
  872. varLongWord : Result := vLongWord <> 0;
  873. varInt64 : Result := vInt64 <> 0;
  874. varQword : Result := vQWord <> 0;
  875. varOleStr : Result := WStrToBoolean(vOleStr);
  876. varString : Result := LStrToBoolean(vString);
  877. varUString : Result := UStrToBoolean(vString);
  878. else
  879. VariantTypeMismatch(vType, varBoolean);
  880. end;
  881. varByRef: if Assigned(vPointer) then case vType and varTypeMask of
  882. varSmallInt : Result := PSmallInt(vPointer)^ <> 0;
  883. varShortInt : Result := PShortInt(vPointer)^ <> 0;
  884. varInteger : Result := PInteger(vPointer)^ <> 0;
  885. {$ifndef FPUNONE}
  886. varSingle : Result := PSingle(vPointer)^ <> 0;
  887. varDouble : Result := PDouble(vPointer)^ <> 0;
  888. varCurrency : Result := PCurrency(vPointer)^ <> 0;
  889. varDate : Result := PDate(vPointer)^ <> 0;
  890. {$endif}
  891. varBoolean : Result := SmallInt(PWordBool(vPointer)^) <> 0;
  892. varVariant : Result := VariantToBoolean(PVarData(vPointer)^);
  893. varByte : Result := PByte(vPointer)^ <> 0;
  894. varWord : Result := PWord(vPointer)^ <> 0;
  895. varLongWord : Result := PLongWord(vPointer)^ <> 0;
  896. varInt64 : Result := PInt64(vPointer)^ <> 0;
  897. varQword : Result := PQWord(vPointer)^ <> 0;
  898. varOleStr : Result := WStrToBoolean(PPointer(vPointer)^);
  899. varString : Result := LStrToBoolean(PPointer(vPointer)^);
  900. varUString : Result := UStrToBoolean(PPointer(vPointer)^);
  901. else { other vtype }
  902. VariantTypeMismatch(vType, varBoolean);
  903. end else { pointer is nil }
  904. Result := False;
  905. else { array or something like that }
  906. VariantTypeMismatch(vType, varBoolean);
  907. end;
  908. {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
  909. WriteLn('VariantToBoolean -> ', Result);
  910. end; {$ENDIF}
  911. end;
  912. {--- Byte ---}
  913. Function WStrToByte(p: Pointer) : Byte;
  914. var
  915. Error : Word;
  916. begin
  917. Val(WideString(p), Result, Error);
  918. if Error <> 0 then
  919. VariantTypeMismatch(varOleStr, varByte);
  920. end;
  921. Function LStrToByte(p: Pointer) : Byte;
  922. var
  923. Error : Word;
  924. begin
  925. Val(AnsiString(p), Result, Error);
  926. if Error <> 0 then
  927. VariantTypeMismatch(varString, varByte);
  928. end;
  929. Function UStrToByte(p: Pointer) : Byte;
  930. var
  931. Error : Word;
  932. begin
  933. Val(UnicodeString(p), Result, Error);
  934. if Error <> 0 then
  935. VariantTypeMismatch(varUString, varByte);
  936. end;
  937. Function VariantToByte(const VargSrc : TVarData) : Byte;
  938. begin
  939. {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
  940. DumpVariant('VariantToByte', VargSrc);
  941. end; {$ENDIF}
  942. with VargSrc do
  943. case vType and not varTypeMask of
  944. 0: case vType of
  945. varEmpty : Result := 0;
  946. varSmallInt : Result := byte(vSmallInt);
  947. varShortInt : Result := byte(vShortInt);
  948. varInteger : Result := byte(vInteger);
  949. {$ifndef FPUNONE}
  950. varSingle : Result := byte(Round(vSingle));
  951. varDouble : Result := byte(Round(vDouble));
  952. varCurrency : Result := byte(Round(vCurrency));
  953. varDate : Result := byte(Round(vDate));
  954. {$endif}
  955. varBoolean : Result := byte(SmallInt(vBoolean));
  956. varVariant : Result := VariantToByte(PVarData(vPointer)^);
  957. varByte : Result := vByte;
  958. varWord : Result := byte(vWord);
  959. varLongWord : Result := byte(vLongWord);
  960. varInt64 : Result := byte(vInt64);
  961. varQword : Result := byte(vQWord);
  962. varOleStr : Result := WStrToByte(vOleStr);
  963. varString : Result := LStrToByte(vString);
  964. varUString : Result := UStrToByte(vString);
  965. else
  966. VariantTypeMismatch(vType, varByte);
  967. end;
  968. varByRef: if Assigned(vPointer) then case vType and varTypeMask of
  969. varSmallInt : Result := byte(PSmallInt(vPointer)^);
  970. varShortInt : Result := byte(PShortInt(vPointer)^);
  971. varInteger : Result := byte(PInteger(vPointer)^);
  972. {$ifndef FPUNONE}
  973. varSingle : Result := byte(Round(PSingle(vPointer)^));
  974. varDouble : Result := byte(Round(PDouble(vPointer)^));
  975. varCurrency : Result := byte(Round(PCurrency(vPointer)^));
  976. varDate : Result := byte(Round(PDate(vPointer)^));
  977. {$endif}
  978. varBoolean : Result := byte(SmallInt(PWordBool(vPointer)^));
  979. varVariant : Result := byte(VariantToByte(PVarData(vPointer)^));
  980. varByte : Result := PByte(vPointer)^;
  981. varWord : Result := byte(PWord(vPointer)^);
  982. varLongWord : Result := byte(PLongWord(vPointer)^);
  983. varInt64 : Result := byte(PInt64(vPointer)^);
  984. varQword : Result := byte(PQWord(vPointer)^);
  985. varOleStr : Result := WStrToByte(PPointer(vPointer)^);
  986. varString : Result := LStrToByte(PPointer(vPointer)^);
  987. varUString : Result := UStrToByte(PPointer(vPointer)^);
  988. else { other vtype }
  989. VariantTypeMismatch(vType, varByte);
  990. end else { pointer is nil }
  991. VariantTypeMismatch(vType, varByte);
  992. else { array or something like that }
  993. VariantTypeMismatch(vType, varByte);
  994. end;
  995. {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
  996. WriteLn('VariantToByte -> ', Result);
  997. end; {$ENDIF}
  998. end;
  999. {--- Int64 ---}
  1000. Function WStrToInt64(p: Pointer) : Int64;
  1001. var
  1002. Error : Word;
  1003. begin
  1004. Val(WideString(p), Result, Error);
  1005. if Error <> 0 then
  1006. VariantTypeMismatch(varOleStr, varInt64);
  1007. end;
  1008. Function LStrToInt64(p: Pointer) : Int64;
  1009. var
  1010. Error : Word;
  1011. begin
  1012. Val(AnsiString(p), Result, Error);
  1013. if Error <> 0 then
  1014. VariantTypeMismatch(varString, varInt64);
  1015. end;
  1016. Function UStrToInt64(p: Pointer) : Int64;
  1017. var
  1018. Error : Word;
  1019. begin
  1020. Val(UnicodeString(p), Result, Error);
  1021. if Error <> 0 then
  1022. VariantTypeMismatch(varUString, varInt64);
  1023. end;
  1024. Function VariantToInt64(const VargSrc : TVarData) : Int64;
  1025. begin
  1026. {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
  1027. DumpVariant('VariantToInt64', VargSrc);
  1028. end; {$ENDIF}
  1029. with VargSrc do
  1030. case vType and not varTypeMask of
  1031. 0: case vType of
  1032. varEmpty : Result := 0;
  1033. varSmallInt : Result := vSmallInt;
  1034. varShortInt : Result := vShortInt;
  1035. varInteger : Result := vInteger;
  1036. {$ifndef FPUNONE}
  1037. varSingle : Result := Round(vSingle);
  1038. varDouble : Result := Round(vDouble);
  1039. varCurrency : Result := Round(vCurrency);
  1040. varDate : Result := Round(vDate);
  1041. {$endif}
  1042. varBoolean : Result := SmallInt(vBoolean);
  1043. varVariant : Result := VariantToInt64(PVarData(vPointer)^);
  1044. varByte : Result := vByte;
  1045. varWord : Result := vWord;
  1046. varLongWord : Result := vLongWord;
  1047. varInt64 : Result := vInt64;
  1048. varQword : Result := int64(vQWord);
  1049. varOleStr : Result := WStrToInt64(vOleStr);
  1050. varString : Result := LStrToInt64(vString);
  1051. varUString : Result := UStrToInt64(vString);
  1052. else
  1053. VariantTypeMismatch(vType, varInt64);
  1054. end;
  1055. varByRef: if Assigned(vPointer) then case vType and varTypeMask of
  1056. varSmallInt : Result := PSmallInt(vPointer)^;
  1057. varShortInt : Result := PShortInt(vPointer)^;
  1058. varInteger : Result := PInteger(vPointer)^;
  1059. {$ifndef FPUNONE}
  1060. varSingle : Result := Round(PSingle(vPointer)^);
  1061. varDouble : Result := Round(PDouble(vPointer)^);
  1062. varCurrency : Result := Round(PCurrency(vPointer)^);
  1063. varDate : Result := Round(PDate(vPointer)^);
  1064. {$endif}
  1065. varBoolean : Result := SmallInt(PWordBool(vPointer)^);
  1066. varVariant : Result := VariantToInt64(PVarData(vPointer)^);
  1067. varByte : Result := PByte(vPointer)^;
  1068. varWord : Result := PWord(vPointer)^;
  1069. varLongWord : Result := PLongWord(vPointer)^;
  1070. varInt64 : Result := PInt64(vPointer)^;
  1071. varQword : Result := PQWord(vPointer)^;
  1072. varOleStr : Result := WStrToInt64(PPointer(vPointer)^);
  1073. varString : Result := LStrToInt64(PPointer(vPointer)^);
  1074. varUString : Result := UStrToInt64(PPointer(vPointer)^);
  1075. else { other vtype }
  1076. VariantTypeMismatch(vType, varInt64);
  1077. end else { pointer is nil }
  1078. VariantTypeMismatch(vType, varInt64);
  1079. else { array or something like that }
  1080. VariantTypeMismatch(vType, varInt64);
  1081. end;
  1082. {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
  1083. WriteLn('VariantToInt64 -> ', Result);
  1084. end; {$ENDIF}
  1085. end;
  1086. {--- QWord ---}
  1087. Function WStrToQWord(p: Pointer) : QWord;
  1088. var
  1089. Error : Word;
  1090. begin
  1091. Val(WideString(p), Result, Error);
  1092. if Error <> 0 then
  1093. VariantTypeMismatch(varOleStr, varQWord);
  1094. end;
  1095. Function LStrToQWord(p: Pointer) : QWord;
  1096. var
  1097. Error : Word;
  1098. begin
  1099. Val(AnsiString(p), Result, Error);
  1100. if Error <> 0 then
  1101. VariantTypeMismatch(varString, varQWord);
  1102. end;
  1103. Function UStrToQWord(p: Pointer) : QWord;
  1104. var
  1105. Error : Word;
  1106. begin
  1107. Val(UnicodeString(p), Result, Error);
  1108. if Error <> 0 then
  1109. VariantTypeMismatch(varUString, varQWord);
  1110. end;
  1111. Function VariantToQWord(const VargSrc : TVarData) : QWord;
  1112. begin
  1113. {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
  1114. DumpVariant('VariantToQWord', VargSrc);
  1115. end; {$ENDIF}
  1116. with VargSrc do
  1117. case vType and not varTypeMask of
  1118. 0: case vType of
  1119. varEmpty : Result := 0;
  1120. varSmallInt : Result := qword(vSmallInt);
  1121. varShortInt : Result := qword(vShortInt);
  1122. varInteger : Result := qword(vInteger);
  1123. {$ifndef FPUNONE}
  1124. varSingle : Result := qword(Round(vSingle));
  1125. varDouble : Result := qword(Round(vDouble));
  1126. varCurrency : Result := qword(Round(vCurrency));
  1127. varDate : Result := qword(Round(vDate));
  1128. {$endif}
  1129. varBoolean : Result := qword(SmallInt(vBoolean));
  1130. varVariant : Result := VariantToQWord(PVarData(vPointer)^);
  1131. varByte : Result := vByte;
  1132. varWord : Result := vWord;
  1133. varLongWord : Result := vLongWord;
  1134. varInt64 : Result := qword(vInt64);
  1135. varQword : Result := vQWord;
  1136. varOleStr : Result := WStrToQWord(vOleStr);
  1137. varString : Result := LStrToQWord(vString);
  1138. varUString : Result := UStrToQWord(vString);
  1139. else
  1140. VariantTypeMismatch(vType, varQWord);
  1141. end;
  1142. varByRef: if Assigned(vPointer) then case vType and varTypeMask of
  1143. varSmallInt : Result := qword(PSmallInt(vPointer)^);
  1144. varShortInt : Result := qword(PShortInt(vPointer)^);
  1145. varInteger : Result := qword(PInteger(vPointer)^);
  1146. {$ifndef FPUNONE}
  1147. varSingle : Result := qword(Round(PSingle(vPointer)^));
  1148. varDouble : Result := qword(Round(PDouble(vPointer)^));
  1149. varCurrency : Result := qword(Round(PCurrency(vPointer)^));
  1150. varDate : Result := qword(Round(PDate(vPointer)^));
  1151. {$endif}
  1152. varBoolean : Result := qword(SmallInt(PWordBool(vPointer)^));
  1153. varVariant : Result := VariantToQWord(PVarData(vPointer)^);
  1154. varByte : Result := PByte(vPointer)^;
  1155. varWord : Result := PWord(vPointer)^;
  1156. varLongWord : Result := PLongWord(vPointer)^;
  1157. varInt64 : Result := qword(PInt64(vPointer)^);
  1158. varQword : Result := PQWord(vPointer)^;
  1159. varOleStr : Result := WStrToQWord(PPointer(vPointer)^);
  1160. varString : Result := LStrToQWord(PPointer(vPointer)^);
  1161. varUString : Result := UStrToQWord(PPointer(vPointer)^);
  1162. else { other vtype }
  1163. VariantTypeMismatch(vType, varQWord);
  1164. end else { pointer is nil }
  1165. VariantTypeMismatch(vType, varQWord);
  1166. else { array or something like that }
  1167. VariantTypeMismatch(vType, varQWord);
  1168. end;
  1169. {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
  1170. WriteLn('VariantToQWord -> ', Result);
  1171. end; {$ENDIF}
  1172. end;
  1173. {--- WideString ---}
  1174. Function VariantToWideString(const VargSrc : TVarData) : WideString;
  1175. begin
  1176. {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
  1177. DumpVariant('VariantToWideString', VargSrc);
  1178. end; {$ENDIF}
  1179. with VargSrc do
  1180. case vType and not varTypeMask of
  1181. 0: case vType of
  1182. varEmpty : Result := '';
  1183. varSmallInt : Result := IntToStr(vSmallInt);
  1184. varShortInt : Result := IntToStr(vShortInt);
  1185. varInteger : Result := IntToStr(vInteger);
  1186. {$ifndef FPUNONE}
  1187. varSingle : Result := FloatToStr(vSingle);
  1188. varDouble : Result := FloatToStr(vDouble);
  1189. varCurrency : Result := FloatToStr(vCurrency);
  1190. varDate : Result := FloatToStr(vDate);
  1191. {$endif}
  1192. varBoolean : Result := BoolToStr(vBoolean, True);
  1193. varVariant : Result := VariantToWideString(PVarData(vPointer)^);
  1194. varByte : Result := IntToStr(vByte);
  1195. varWord : Result := IntToStr(vWord);
  1196. varLongWord : Result := IntToStr(vLongWord);
  1197. varInt64 : Result := IntToStr(vInt64);
  1198. varQword : Result := IntToStr(vQWord);
  1199. varOleStr : Result := WideString(Pointer(vOleStr));
  1200. varString : Result := AnsiString(vString);
  1201. varUString : Result := UnicodeString(vString);
  1202. else
  1203. VariantTypeMismatch(vType, varOleStr);
  1204. end;
  1205. varByRef: if Assigned(vPointer) then case vType and varTypeMask of
  1206. varSmallInt : Result := IntToStr(PSmallInt(vPointer)^);
  1207. varShortInt : Result := IntToStr(PShortInt(vPointer)^);
  1208. varInteger : Result := IntToStr(PInteger(vPointer)^);
  1209. {$ifndef FPUNONE}
  1210. varSingle : Result := FloatToStr(PSingle(vPointer)^);
  1211. varDouble : Result := FloatToStr(PDouble(vPointer)^);
  1212. varCurrency : Result := FloatToStr(PCurrency(vPointer)^);
  1213. varDate : Result := FloatToStr(PDate(vPointer)^);
  1214. {$endif}
  1215. varBoolean : Result := BoolToStr(PWordBool(vPointer)^, True);
  1216. varVariant : Result := VariantToWideString(PVarData(vPointer)^);
  1217. varByte : Result := IntToStr(PByte(vPointer)^);
  1218. varWord : Result := IntToStr(PWord(vPointer)^);
  1219. varLongWord : Result := IntToStr(PLongWord(vPointer)^);
  1220. varInt64 : Result := IntToStr(PInt64(vPointer)^);
  1221. varQword : Result := IntToStr(PQWord(vPointer)^);
  1222. varOleStr : Result := WideString(PPointer(vPointer)^);
  1223. varString : Result := AnsiString(PPointer(vPointer)^);
  1224. varUString : Result := UnicodeString(PPointer(vPointer)^);
  1225. else { other vtype }
  1226. VariantTypeMismatch(vType, varOleStr);
  1227. end else { pointer is nil }
  1228. VariantTypeMismatch(vType, varOleStr);
  1229. else { array or something like that }
  1230. VariantTypeMismatch(vType, varOleStr);
  1231. end;
  1232. {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
  1233. WriteLn('VariantToWideString -> ', Result);
  1234. end; {$ENDIF}
  1235. end;
  1236. {--- AnsiString ---}
  1237. Function VariantToAnsiString(const VargSrc : TVarData) : AnsiString;
  1238. begin
  1239. {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
  1240. DumpVariant('VariantToAnsiString', VargSrc);
  1241. end; {$ENDIF}
  1242. with VargSrc do
  1243. case vType and not varTypeMask of
  1244. 0: case vType of
  1245. varEmpty : Result := '';
  1246. varSmallInt : Result := IntToStr(vSmallInt);
  1247. varShortInt : Result := IntToStr(vShortInt);
  1248. varInteger : Result := IntToStr(vInteger);
  1249. {$ifndef FPUNONE}
  1250. varSingle : Result := FloatToStr(vSingle);
  1251. varDouble : Result := FloatToStr(vDouble);
  1252. varCurrency : Result := FloatToStr(vCurrency);
  1253. varDate : Result := DateToStr(vDate);
  1254. {$endif}
  1255. varBoolean : Result := BoolToStr(vBoolean, True);
  1256. varVariant : Result := VariantToAnsiString(PVarData(vPointer)^);
  1257. varByte : Result := IntToStr(vByte);
  1258. varWord : Result := IntToStr(vWord);
  1259. varLongWord : Result := IntToStr(vLongWord);
  1260. varInt64 : Result := IntToStr(vInt64);
  1261. varQword : Result := IntToStr(vQWord);
  1262. varOleStr : Result := WideString(Pointer(vOleStr));
  1263. varString : Result := AnsiString(vString);
  1264. varUString : Result := UnicodeString(vString);
  1265. else
  1266. VariantTypeMismatch(vType, varString);
  1267. end;
  1268. varByRef: if Assigned(vPointer) then case vType and varTypeMask of
  1269. varSmallInt : Result := IntToStr(PSmallInt(vPointer)^);
  1270. varShortInt : Result := IntToStr(PShortInt(vPointer)^);
  1271. varInteger : Result := IntToStr(PInteger(vPointer)^);
  1272. {$ifndef FPUNONE}
  1273. varSingle : Result := FloatToStr(PSingle(vPointer)^);
  1274. varDouble : Result := FloatToStr(PDouble(vPointer)^);
  1275. varCurrency : Result := FloatToStr(PCurrency(vPointer)^);
  1276. varDate : Result := DateToStr(PDate(vPointer)^);
  1277. {$endif}
  1278. varBoolean : Result := BoolToStr(PWordBool(vPointer)^, True);
  1279. varVariant : Result := VariantToAnsiString(PVarData(vPointer)^);
  1280. varByte : Result := IntToStr(PByte(vPointer)^);
  1281. varWord : Result := IntToStr(PWord(vPointer)^);
  1282. varLongWord : Result := IntToStr(PLongWord(vPointer)^);
  1283. varInt64 : Result := IntToStr(PInt64(vPointer)^);
  1284. varQword : Result := IntToStr(PQWord(vPointer)^);
  1285. varOleStr : Result := WideString(PPointer(vPointer)^);
  1286. varString : Result := AnsiString(PPointer(vPointer)^);
  1287. varUString : Result := UnicodeString(PPointer(vPointer)^);
  1288. else { other vtype }
  1289. VariantTypeMismatch(vType, varString);
  1290. end else { pointer is nil }
  1291. VariantTypeMismatch(vType, varString);
  1292. else { array or something like that }
  1293. VariantTypeMismatch(vType, varString);
  1294. end;
  1295. {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
  1296. WriteLn('VariantToAnsiString -> ', Result);
  1297. end; {$ENDIF}
  1298. end;
  1299. Function VariantToShortString(const VargSrc : TVarData) : ShortString;
  1300. begin
  1301. Result:=VariantToAnsiString(VargSrc);
  1302. end;
  1303. { ---------------------------------------------------------------------
  1304. Some debug routines
  1305. ---------------------------------------------------------------------}
  1306. Procedure DumpVariant(const VSrc : Variant);
  1307. begin
  1308. DumpVariant(Output, '', TVarData(VSrc));
  1309. end;
  1310. Procedure DumpVariant(const aName: string; const VSrc : Variant);
  1311. begin
  1312. DumpVariant(Output, aName, TVarData(VSrc));
  1313. end;
  1314. Procedure DumpVariant(Var F : Text; const VSrc : Variant);
  1315. begin
  1316. DumpVariant(F, '', TVarData(VSrc));
  1317. end;
  1318. procedure DumpVariant(var F : Text; const aName: string; const VSrc : Variant);
  1319. begin
  1320. DumpVariant(F, aName, TVarData(VSrc));
  1321. end;
  1322. Procedure DumpVariant(const VargSrc : TVarData);
  1323. begin
  1324. DumpVariant(Output, '', VargSrc);
  1325. end;
  1326. Procedure DumpVariant(const aName: string; const VargSrc : TVarData);
  1327. begin
  1328. DumpVariant(Output, aName, VargSrc);
  1329. end;
  1330. Procedure DumpVariant(Var F : Text; const VargSrc : TVarData);
  1331. begin
  1332. DumpVariant(F, '', VargSrc);
  1333. end;
  1334. const
  1335. VarTypeStrings : array [varEmpty..varQword] of string = (
  1336. 'empty', { varempty = 0 }
  1337. 'null', { varnull = 1 }
  1338. 'smallint', { varsmallint = 2 }
  1339. 'integer', { varinteger = 3 }
  1340. 'single', { varsingle = 4 }
  1341. 'double', { vardouble = 5 }
  1342. 'currency', { varcurrency = 6 }
  1343. 'date', { vardate = 7 }
  1344. 'olestr', { varolestr = 8 }
  1345. 'dispatch', { vardispatch = 9 }
  1346. 'error', { varerror = 10 }
  1347. 'boolean', { varboolean = 11 }
  1348. 'variant', { varvariant = 12 }
  1349. 'unknown', { varunknown = 13 }
  1350. 'decimal', { vardecimal = 14 }
  1351. 'undefined',
  1352. 'shortint', { varshortint = 16 }
  1353. 'byte', { varbyte = 17 }
  1354. 'word', { varword = 18 }
  1355. 'longword', { varlongword = 19 }
  1356. 'int64', { varint64 = 20 }
  1357. 'qword'); { varqword = 21 }
  1358. Procedure DumpVariant(Var F : Text; const aName: string; const VargSrc : TVarData);
  1359. Var
  1360. i: Integer;
  1361. begin
  1362. Writeln(F,'---> ', aName, ' at $', IntToHex(Cardinal(@VargSrc), 8), ' <----------------');
  1363. with VargSrc do begin
  1364. if vType and varByRef = varByRef then
  1365. Writeln(F,'Variant is by reference.');
  1366. if vType and varArray = varArray then
  1367. Writeln(F,'Variant is an array.');
  1368. if vType and not (varTypeMask or varArray or varByRef) <> 0 then
  1369. Writeln(F,'Variant has unknown flags set in type: $', IntToHex(vType, 4));
  1370. If (vType and varTypeMask) in [varEmpty..varQword] then
  1371. Writeln(F,'Variant has type : ', VarTypeStrings[vType and varTypeMask])
  1372. else If (vType and varTypeMask) = varString then
  1373. Writeln(F,'Variant has type : string')
  1374. else if (vType and varTypeMask) = varUString then
  1375. Writeln(F,'Variant has type : UnicodeString')
  1376. else
  1377. Writeln(F,'Variant has unknown type : $', IntToHex(vType and varTypeMask, 4));
  1378. Write('Bytes :');
  1379. for i := 0 to 13 do
  1380. Write(IntToHex(VBytes[i], 2),' ');
  1381. WriteLn;
  1382. if vType and varArray = varArray then begin
  1383. Writeln(F,'---< ', aName, ' at $', IntToHex(Cardinal(@VargSrc), 8), ' >----------------');
  1384. Writeln(F);
  1385. Exit;
  1386. end;
  1387. If vType <> varEmpty then begin
  1388. Write(F,'Value is: [');
  1389. if (vType and varByRef = varByRef) or (vType and varTypeMask = varVariant) then
  1390. if not Assigned(vPointer) then begin
  1391. WriteLn(F, 'nil]');
  1392. Writeln(F,'---< ', aName, ' at $', IntToHex(Cardinal(@VargSrc), 8), ' >----------------');
  1393. Writeln(F);
  1394. Exit;
  1395. end;
  1396. case vType of
  1397. varNull : Write(F, 'Null');
  1398. varSmallInt : Write(F, vSmallInt);
  1399. varInteger : Write(F, vInteger);
  1400. {$ifndef FPUNONE}
  1401. varSingle : Write(F, vSingle);
  1402. varDouble : Write(F, vDouble);
  1403. varCurrency : Write(F, vCurrency);
  1404. varDate : Write(F, vDate);
  1405. {$endif}
  1406. varOleStr : Write(F, WideString(Pointer(vOleStr)));
  1407. varError : Write(F, IntToHex(Cardinal(vError), 8));
  1408. varBoolean : Write(F, vBoolean);
  1409. varVariant, varVariant or varByRef : begin
  1410. WriteLn(' dereferencing -> ]');
  1411. DumpVariant(F, aName+'^', PVarData(vPointer)^);
  1412. Exit;
  1413. end;
  1414. varShortInt : Write(F, vShortInt);
  1415. varByte : Write(F, vByte);
  1416. varWord : Write(F, vWord);
  1417. varLongWord : Write(F, vLongWord);
  1418. varInt64 : Write(F, vInt64);
  1419. varQword : Write(F, vQWord);
  1420. varString : Write(F, AnsiString(vString));
  1421. varNull or varByRef : Write(F, 'Null');
  1422. varSmallInt or varByRef : Write(F, PSmallInt(vPointer)^);
  1423. varInteger or varByRef : Write(F, PInteger(vPointer)^);
  1424. {$ifndef FPUNONE}
  1425. varSingle or varByRef : Write(F, PSingle(vPointer)^);
  1426. varDouble or varByRef : Write(F, PDouble(vPointer)^);
  1427. varCurrency or varByRef : Write(F, PCurrency(vPointer)^);
  1428. varDate or varByRef : Write(F, PDate(vPointer)^);
  1429. {$endif}
  1430. varOleStr or varByRef : Write(F, WideString(PPointer(vPointer)^));
  1431. varError or varByRef : Write(F, IntToHex(Cardinal(PLongWord(vPointer)^), 8));
  1432. varBoolean or varByRef : Write(F, PWordBool(vPointer)^);
  1433. varShortInt or varByRef : Write(F, PShortInt(vPointer)^);
  1434. varByte or varByRef : Write(F, PByte(vPointer)^);
  1435. varWord or varByRef : Write(F, PWord(vPointer)^);
  1436. varLongWord or varByRef : Write(F, PLongWord(vPointer)^);
  1437. varInt64 or varByRef : Write(F, PInt64(vPointer)^);
  1438. varQword or varByRef : Write(F, PQWord(vPointer)^);
  1439. varString or varByRef : Write(F, AnsiString(PPointer(vPointer)^));
  1440. else
  1441. Write(F, 'Unsupported');
  1442. end;
  1443. WriteLn(F, ']');
  1444. end;
  1445. end;
  1446. Writeln(F,'---< ', aName, ' at $', IntToHex(Cardinal(@VargSrc), 8), ' >----------------');
  1447. Writeln(F);
  1448. end;