1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603 |
- {
- This file is part of the Free Pascal run time library.
- Copyright (c) 2000,2001 by the Free Pascal development team
- Interface and OS-dependent part of variant support
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- **********************************************************************}
- Procedure VariantTypeMismatch; overload;
- begin
- Raise EVariantError.CreateCode(VAR_TYPEMISMATCH);
- end;
- Procedure VariantTypeMismatch(const SourceType, DestType: TVarType);
- begin
- { ignore the types for now ... }
- Raise EVariantError.CreateCode(VAR_TYPEMISMATCH);
- end;
- Function ExceptionToVariantError (E : Exception): HResult;
- begin
- If E is EoutOfMemory then
- Result:=VAR_OUTOFMEMORY
- else
- Result:=VAR_EXCEPTION;
- end;
- { ---------------------------------------------------------------------
- OS-independent functions not present in Windows
- ---------------------------------------------------------------------}
- {--- SmallInt ---}
- Function WStrToSmallInt(p: Pointer) : SmallInt;
- var
- Error : Word;
- begin
- Val(WideString(p), Result, Error);
- if Error <> 0 then
- VariantTypeMismatch(varOleStr, varSmallInt);
- end;
- Function LStrToSmallInt(p: Pointer) : SmallInt;
- var
- Error : Word;
- begin
- Val(AnsiString(p), Result, Error);
- if Error <> 0 then
- VariantTypeMismatch(varString, varSmallInt);
- end;
- function UStrToSmallInt(p: Pointer): SmallInt;
- var
- Error: Word;
- begin
- Val(UnicodeString(p), Result, Error);
- if Error <> 0 then
- VariantTypeMismatch(varUString, varSmallInt);
- end;
- Function VariantToSmallInt(const VargSrc : TVarData) : SmallInt;
- begin
- {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
- DumpVariant('VariantToSmallInt', VargSrc);
- end; {$ENDIF}
- with VargSrc do
- case vType and not varTypeMask of
- 0: case vType of
- varEmpty : Result := 0;
- varSmallInt : Result := vSmallInt;
- varShortInt : Result := vShortInt;
- varInteger : Result := smallint(vInteger);
- {$ifndef FPUNONE}
- varSingle : Result := smallint(Round(vSingle));
- varDouble : Result := smallint(Round(vDouble));
- varDate : Result := smallint(Round(vDate));
- {$endif}
- varCurrency : Result := smallint(Round(vCurrency));
- varBoolean : Result := smallint(SmallInt(vBoolean));
- varVariant : Result := VariantToSmallInt(PVarData(vPointer)^);
- varByte : Result := vByte;
- varWord : Result := smallint(vWord);
- varLongWord : Result := smallint(vLongWord);
- varInt64 : Result := smallint(vInt64);
- varQword : Result := smallint(vQWord);
- varOleStr : Result := WStrToSmallInt(vOleStr);
- varString : Result := LStrToSmallInt(vString);
- varUString : Result := UStrToSmallInt(vString);
- else
- VariantTypeMismatch(vType, varSmallInt);
- end;
- varByRef: if Assigned(vPointer) then case vType and varTypeMask of
- varSmallInt : Result := PSmallInt(vPointer)^;
- varShortInt : Result := PShortInt(vPointer)^;
- varInteger : Result := smallint(PInteger(vPointer)^);
- {$ifndef FPUNONE}
- varSingle : Result := smallint(Round(PSingle(vPointer)^));
- varDouble : Result := smallint(Round(PDouble(vPointer)^));
- varDate : Result := smallint(Round(PDate(vPointer)^));
- {$endif}
- varCurrency : Result := smallint(Round(PCurrency(vPointer)^));
- varBoolean : Result := SmallInt(PWordBool(vPointer)^);
- varVariant : Result := VariantToSmallInt(PVarData(vPointer)^);
- varByte : Result := PByte(vPointer)^;
- varWord : Result := smallint(PWord(vPointer)^);
- varLongWord : Result := smallint(PLongWord(vPointer)^);
- varInt64 : Result := smallint(PInt64(vPointer)^);
- varQword : Result := smallint(PQWord(vPointer)^);
- varOleStr : Result := WStrToSmallInt(PPointer(vPointer)^);
- varString : Result := LStrToSmallInt(PPointer(vPointer)^);
- varUString : Result := UStrToSmallInt(PPointer(vPointer)^);
- else { other vtype }
- VariantTypeMismatch(vType, varSmallInt);
- end else { pointer is nil }
- VariantTypeMismatch(vType, varSmallInt);
- else { array or something like that }
- VariantTypeMismatch(vType, varSmallInt);
- end;
- {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
- WriteLn('VariantToSmallInt -> ', Result);
- end; {$ENDIF}
- end;
- {--- ShortInt ---}
- Function WStrToShortInt(p: Pointer) : ShortInt;
- var
- Error : Word;
- begin
- Val(WideString(p), Result, Error);
- if Error <> 0 then
- VariantTypeMismatch(varOleStr, varShortInt);
- end;
- Function LStrToShortInt(p: Pointer) : ShortInt;
- var
- Error : Word;
- begin
- Val(AnsiString(p), Result, Error);
- if Error <> 0 then
- VariantTypeMismatch(varString, varShortInt);
- end;
- Function UStrToShortInt(p: Pointer) : ShortInt;
- var
- Error : Word;
- begin
- Val(UnicodeString(p), Result, Error);
- if Error <> 0 then
- VariantTypeMismatch(varUString, varShortInt);
- end;
- Function VariantToShortInt(const VargSrc : TVarData) : ShortInt;
- begin
- {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
- DumpVariant('VariantToShortInt', VargSrc);
- end; {$ENDIF}
- with VargSrc do
- case vType and not varTypeMask of
- 0: case vType of
- varEmpty : Result := 0;
- varSmallInt : Result := shortint(vSmallInt);
- varShortInt : Result := vShortInt;
- varInteger : Result := shortint(vInteger);
- {$ifndef FPUNONE}
- varSingle : Result := shortint(Round(vSingle));
- varDouble : Result := shortint(Round(vDouble));
- varDate : Result := shortint(Round(vDate));
- {$endif}
- varCurrency : Result := shortint(Round(vCurrency));
- varBoolean : Result := shortint(vBoolean);
- varVariant : Result := VariantToShortInt(PVarData(vPointer)^);
- varByte : Result := shortint(vByte);
- varWord : Result := shortint(vWord);
- varLongWord : Result := shortint(vLongWord);
- varInt64 : Result := shortint(vInt64);
- varQword : Result := shortint(vQWord);
- varOleStr : Result := WStrToShortInt(vOleStr);
- varString : Result := LStrToShortInt(vString);
- varUString : Result := UStrToShortInt(vString);
- else
- VariantTypeMismatch(vType, varShortInt);
- end;
- varByRef: if Assigned(vPointer) then case vType and varTypeMask of
- varSmallInt : Result := shortint(PSmallInt(vPointer)^);
- varShortInt : Result := PShortInt(vPointer)^;
- varInteger : Result := shortint(PInteger(vPointer)^);
- {$ifndef FPUNONE}
- varSingle : Result := shortint(Round(PSingle(vPointer)^));
- varDouble : Result := shortint(Round(PDouble(vPointer)^));
- varDate : Result := shortint(Round(PDate(vPointer)^));
- {$endif}
- varCurrency : Result := shortint(Round(PCurrency(vPointer)^));
- varBoolean : Result := SmallInt(PWordBool(vPointer)^);
- varVariant : Result := VariantToShortInt(PVarData(vPointer)^);
- varByte : Result := shortint(PByte(vPointer)^);
- varWord : Result := shortint(PWord(vPointer)^);
- varLongWord : Result := shortint(PLongWord(vPointer)^);
- varInt64 : Result := shortint(PInt64(vPointer)^);
- varQword : Result := shortint(PQWord(vPointer)^);
- varOleStr : Result := WStrToShortInt(PPointer(vPointer)^);
- varString : Result := LStrToShortInt(PPointer(vPointer)^);
- varUString : Result := UStrToShortInt(PPointer(vPointer)^);
- else { other vtype }
- VariantTypeMismatch(vType, varShortInt);
- end else { pointer is nil }
- VariantTypeMismatch(vType, varShortInt);
- else { array or something like that }
- VariantTypeMismatch(vType, varShortInt);
- end;
- {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
- WriteLn('VariantToShortInt -> ', Result);
- end; {$ENDIF}
- end;
- {--- LongInt ---}
- Function WStrToLongInt(p: Pointer) : LongInt;
- var
- Error : Word;
- begin
- Val(WideString(p), Result, Error);
- if Error <> 0 then
- VariantTypeMismatch(varOleStr, varInteger);
- end;
- Function LStrToLongInt(p: Pointer) : LongInt;
- var
- Error : Word;
- begin
- Val(AnsiString(p), Result, Error);
- if Error <> 0 then
- VariantTypeMismatch(varString, varInteger);
- end;
- Function UStrToLongInt(p: Pointer) : LongInt;
- var
- Error : Word;
- begin
- Val(UnicodeString(p), Result, Error);
- if Error <> 0 then
- VariantTypeMismatch(varUString, varInteger);
- end;
- Function VariantToLongInt(const VargSrc : TVarData) : LongInt;
- begin
- {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
- DumpVariant('VariantToLongInt', VargSrc);
- end; {$ENDIF}
- with VargSrc do
- case vType and not varTypeMask of
- 0: case vType of
- varEmpty : Result := 0;
- varSmallInt : Result := vSmallInt;
- varShortInt : Result := vShortInt;
- varInteger : Result := vInteger;
- {$ifndef FPUNONE}
- varSingle : Result := longint(Round(vSingle));
- varDouble : Result := longint(Round(vDouble));
- varDate : Result := longint(Round(vDate));
- {$endif}
- varCurrency : Result := longint(Round(vCurrency));
- varBoolean : Result := SmallInt(vBoolean);
- varVariant : Result := VariantToLongInt(PVarData(vPointer)^);
- varByte : Result := vByte;
- varWord : Result := vWord;
- varLongWord : Result := longint(vLongWord);
- varInt64 : Result := longint(vInt64);
- varQword : Result := longint(vQWord);
- varOleStr : Result := WStrToLongInt(vOleStr);
- varString : Result := LStrToLongInt(vString);
- varUString : Result := UStrToLongInt(vString);
- else
- VariantTypeMismatch(vType, varInteger);
- end;
- varByRef: if Assigned(vPointer) then case vType and varTypeMask of
- varSmallInt : Result := PSmallInt(vPointer)^;
- varShortInt : Result := PShortInt(vPointer)^;
- varInteger : Result := PInteger(vPointer)^;
- {$ifndef FPUNONE}
- varSingle : Result := longint(Round(PSingle(vPointer)^));
- varDouble : Result := longint(Round(PDouble(vPointer)^));
- varDate : Result := longint(Round(PDate(vPointer)^));
- {$endif}
- varCurrency : Result := longint(Round(PCurrency(vPointer)^));
- varBoolean : Result := SmallInt(PWordBool(vPointer)^);
- varVariant : Result := VariantToLongInt(PVarData(vPointer)^);
- varByte : Result := PByte(vPointer)^;
- varWord : Result := PWord(vPointer)^;
- varLongWord : Result := longint(PLongWord(vPointer)^);
- varInt64 : Result := longint(PInt64(vPointer)^);
- varQword : Result := longint(PQWord(vPointer)^);
- varOleStr : Result := WStrToLongInt(PPointer(vPointer)^);
- varString : Result := LStrToLongInt(PPointer(vPointer)^);
- varUString : Result := UStrToLongInt(PPointer(vPointer)^);
- else { other vtype }
- VariantTypeMismatch(vType, varInteger);
- end else { pointer is nil }
- VariantTypeMismatch(vType, varInteger);
- else { array or something like that }
- VariantTypeMismatch(vType, varInteger);
- end;
- {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
- WriteLn('VariantToLongInt -> ', Result);
- end; {$ENDIF}
- end;
- {--- Cardinal ---}
- Function WStrToCardinal(p: Pointer) : Cardinal;
- var
- Error : Word;
- begin
- Val(WideString(p), Result, Error);
- if Error <> 0 then
- VariantTypeMismatch(varOleStr, varLongWord);
- end;
- Function LStrToCardinal(p: Pointer) : Cardinal;
- var
- Error : Word;
- begin
- Val(AnsiString(p), Result, Error);
- if Error <> 0 then
- VariantTypeMismatch(varString, varLongWord);
- end;
- Function UStrToCardinal(p: Pointer) : Cardinal;
- var
- Error : Word;
- begin
- Val(UnicodeString(p), Result, Error);
- if Error <> 0 then
- VariantTypeMismatch(varUString, varLongWord);
- end;
- Function VariantToCardinal(const VargSrc : TVarData) : Cardinal;
- begin
- {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
- DumpVariant('VariantToCardinal', VargSrc);
- end; {$ENDIF}
- with VargSrc do
- case vType and not varTypeMask of
- 0: case vType of
- varEmpty : Result := 0;
- varSmallInt : Result := vSmallInt;
- varShortInt : Result := vShortInt;
- varInteger : Result := cardinal(vInteger);
- {$ifndef FPUNONE}
- varSingle : Result := cardinal(Round(vSingle));
- varDouble : Result := cardinal(Round(vDouble));
- varDate : Result := cardinal(Round(vDate));
- {$endif}
- varCurrency : Result := cardinal(Round(vCurrency));
- varBoolean : Result := cardinal(SmallInt(vBoolean));
- varVariant : Result := VariantToCardinal(PVarData(vPointer)^);
- varByte : Result := vByte;
- varWord : Result := vWord;
- varLongWord : Result := vLongWord;
- varInt64 : Result := cardinal(vInt64);
- varQword : Result := cardinal(vQWord);
- varOleStr : Result := WStrToCardinal(vOleStr);
- varString : Result := LStrToCardinal(vString);
- varUString : Result := UStrToCardinal(vString);
- else
- VariantTypeMismatch(vType, varLongWord);
- end;
- varByRef: if Assigned(vPointer) then case vType and varTypeMask of
- varSmallInt : Result := cardinal(PSmallInt(vPointer)^);
- varShortInt : Result := cardinal(PShortInt(vPointer)^);
- varInteger : Result := cardinal(PInteger(vPointer)^);
- {$ifndef FPUNONE}
- varSingle : Result := cardinal(Round(PSingle(vPointer)^));
- varDouble : Result := cardinal(Round(PDouble(vPointer)^));
- varDate : Result := cardinal(Round(PDate(vPointer)^));
- {$endif}
- varCurrency : Result := cardinal(Round(PCurrency(vPointer)^));
- varBoolean : Result := cardinal(SmallInt(PWordBool(vPointer)^));
- varVariant : Result := VariantToCardinal(PVarData(vPointer)^);
- varByte : Result := PByte(vPointer)^;
- varWord : Result := PWord(vPointer)^;
- varLongWord : Result := PLongWord(vPointer)^;
- varInt64 : Result := cardinal(PInt64(vPointer)^);
- varQword : Result := cardinal(PQWord(vPointer)^);
- varOleStr : Result := WStrToCardinal(PPointer(vPointer)^);
- varString : Result := LStrToCardinal(PPointer(vPointer)^);
- varUString : Result := UStrToCardinal(PPointer(vPointer)^);
- else { other vtype }
- VariantTypeMismatch(vType, varLongWord);
- end else { pointer is nil }
- VariantTypeMismatch(vType, varLongWord);
- else { array or something like that }
- VariantTypeMismatch(vType, varLongWord);
- end;
- {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
- WriteLn('VariantToCardinal -> ', Result);
- end; {$ENDIF}
- end;
- procedure PrepareFloatStr(var s: ShortString);
- var
- i, j : Byte;
- begin
- j := 1;
- for i := 1 to Length(s) do
- if s[i] <> DefaultFormatSettings.ThousandSeparator then begin
- if s[i] = DefaultFormatSettings.DecimalSeparator then
- s[j] := '.'
- else
- s[j] := s[i];
- Inc(j);
- end;
- SetLength(s, Pred(j));
- end;
- {--- Single ---}
- {$ifndef FPUNONE}
- Function WStrToSingle(p: Pointer) : Single;
- var
- s : ShortString;
- Error : Word;
- begin
- if Length(WideString(p)) > 255 then
- VariantTypeMismatch(varOleStr, varSingle);
- s := WideString(p);
- PrepareFloatStr(s);
- Val(s, Result, Error);
- if Error <> 0 then
- VariantTypeMismatch(varOleStr, varSingle);
- end;
- Function LStrToSingle(p: Pointer) : Single;
- var
- s : ShortString;
- Error : Word;
- begin
- if Length(AnsiString(p)) > 255 then
- VariantTypeMismatch(varString, varSingle);
- s := AnsiString(p);
- PrepareFloatStr(s);
- Val(s, Result, Error);
- if Error <> 0 then
- VariantTypeMismatch(varString, varSingle);
- end;
- Function UStrToSingle(p: Pointer) : Single;
- var
- s : ShortString;
- Error : Word;
- begin
- if Length(UnicodeString(p)) > 255 then
- VariantTypeMismatch(varUString, varSingle);
- s := UnicodeString(p);
- PrepareFloatStr(s);
- Val(s, Result, Error);
- if Error <> 0 then
- VariantTypeMismatch(varUString, varSingle);
- end;
- Function VariantToSingle(const VargSrc : TVarData) : Single;
- begin
- {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
- DumpVariant('VariantToSingle', VargSrc);
- end; {$ENDIF}
- with VargSrc do
- case vType and not varTypeMask of
- 0: case vType of
- varEmpty : Result := 0;
- varSmallInt : Result := vSmallInt;
- varShortInt : Result := vShortInt;
- varInteger : Result := vInteger;
- varSingle : Result := vSingle;
- varDouble : Result := vDouble;
- varCurrency : Result := vCurrency;
- varDate : Result := vDate;
- varBoolean : Result := SmallInt(vBoolean);
- varVariant : Result := VariantToSingle(PVarData(vPointer)^);
- varByte : Result := vByte;
- varWord : Result := vWord;
- varLongWord : Result := vLongWord;
- varInt64 : Result := vInt64;
- varQword : Result := vQWord;
- varOleStr : Result := WStrToSingle(vOleStr);
- varString : Result := LStrToSingle(vString);
- varUString : Result := UStrToSingle(vString);
- else
- VariantTypeMismatch(vType, varSingle);
- end;
- varByRef: if Assigned(vPointer) then case vType and varTypeMask of
- varSmallInt : Result := PSmallInt(vPointer)^;
- varShortInt : Result := PShortInt(vPointer)^;
- varInteger : Result := PInteger(vPointer)^;
- varSingle : Result := PSingle(vPointer)^;
- varDouble : Result := PDouble(vPointer)^;
- varCurrency : Result := PCurrency(vPointer)^;
- varDate : Result := PDate(vPointer)^;
- varBoolean : Result := SmallInt(PWordBool(vPointer)^);
- varVariant : Result := VariantToSingle(PVarData(vPointer)^);
- varByte : Result := PByte(vPointer)^;
- varWord : Result := PWord(vPointer)^;
- varLongWord : Result := PLongWord(vPointer)^;
- varInt64 : Result := PInt64(vPointer)^;
- varQword : Result := PQWord(vPointer)^;
- varOleStr : Result := WStrToSingle(PPointer(vPointer)^);
- varString : Result := LStrToSingle(PPointer(vPointer)^);
- varUString : Result := UStrToSingle(PPointer(vPointer)^);
- else { other vtype }
- VariantTypeMismatch(vType, varSingle);
- end else { pointer is nil }
- VariantTypeMismatch(vType, varSingle);
- else { array or something like that }
- VariantTypeMismatch(vType, varSingle);
- end;
- {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
- WriteLn('VariantToSingle -> ', Result);
- end; {$ENDIF}
- end;
- {--- Double ---}
- Function WStrToDouble(p: Pointer) : Double;
- var
- s : ShortString;
- Error : Word;
- begin
- if Length(WideString(p)) > 255 then
- VariantTypeMismatch(varOleStr, varDouble);
- s := WideString(p);
- PrepareFloatStr(s);
- Val(s, Result, Error);
- if Error <> 0 then
- VariantTypeMismatch(varOleStr, varDouble);
- end;
- Function LStrToDouble(p: Pointer) : Double;
- var
- s : ShortString;
- Error : Word;
- begin
- if Length(AnsiString(p)) > 255 then
- VariantTypeMismatch(varString, varDouble);
- s := AnsiString(p);
- PrepareFloatStr(s);
- Val(s, Result, Error);
- if Error <> 0 then
- VariantTypeMismatch(varString, varDouble);
- end;
- Function UStrToDouble(p: Pointer) : Double;
- var
- s : ShortString;
- Error : Word;
- begin
- if Length(UnicodeString(p)) > 255 then
- VariantTypeMismatch(varUString, varDouble);
- s := UnicodeString(p);
- PrepareFloatStr(s);
- Val(s, Result, Error);
- if Error <> 0 then
- VariantTypeMismatch(varUString, varDouble);
- end;
- Function VariantToDouble(const VargSrc : TVarData) : Double;
- begin
- {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
- DumpVariant('VariantToDouble', VargSrc);
- end; {$ENDIF}
- with VargSrc do
- case vType and not varTypeMask of
- 0: case vType of
- varEmpty : Result := 0;
- varSmallInt : Result := vSmallInt;
- varShortInt : Result := vShortInt;
- varInteger : Result := vInteger;
- varSingle : Result := vSingle;
- varDouble : Result := vDouble;
- varCurrency : Result := vCurrency;
- varDate : Result := vDate;
- varBoolean : Result := SmallInt(vBoolean);
- varVariant : Result := VariantToDouble(PVarData(vPointer)^);
- varByte : Result := vByte;
- varWord : Result := vWord;
- varLongWord : Result := vLongWord;
- varInt64 : Result := vInt64;
- varQword : Result := vQWord;
- varOleStr : Result := WStrToDouble(vOleStr);
- varString : Result := LStrToDouble(vString);
- varUString : Result := UStrToDouble(vString);
- else
- VariantTypeMismatch(vType, varDouble);
- end;
- varByRef: if Assigned(vPointer) then case vType and varTypeMask of
- varSmallInt : Result := PSmallInt(vPointer)^;
- varShortInt : Result := PShortInt(vPointer)^;
- varInteger : Result := PInteger(vPointer)^;
- varSingle : Result := PSingle(vPointer)^;
- varDouble : Result := PDouble(vPointer)^;
- varCurrency : Result := PCurrency(vPointer)^;
- varDate : Result := PDate(vPointer)^;
- varBoolean : Result := SmallInt(PWordBool(vPointer)^);
- varVariant : Result := VariantToDouble(PVarData(vPointer)^);
- varByte : Result := PByte(vPointer)^;
- varWord : Result := PWord(vPointer)^;
- varLongWord : Result := PLongWord(vPointer)^;
- varInt64 : Result := PInt64(vPointer)^;
- varQword : Result := PQWord(vPointer)^;
- varOleStr : Result := WStrToDouble(PPointer(vPointer)^);
- varString : Result := LStrToDouble(PPointer(vPointer)^);
- varUString : Result := UStrToDouble(PPointer(vPointer)^);
- else { other vtype }
- VariantTypeMismatch(vType, varDouble);
- end else { pointer is nil }
- VariantTypeMismatch(vType, varDouble);
- else { array or something like that }
- VariantTypeMismatch(vType, varDouble);
- end;
- {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
- WriteLn('VariantToDouble -> ', Result);
- end; {$ENDIF}
- end;
- {$endif FPUNONE}
- {--- Currency ---}
- Function WStrToCurrency(p: Pointer) : Currency;
- var
- s : ShortString;
- Error : Word;
- {$IFNDEF FPC_HAS_STR_CURRENCY}
- Temp : Extended;
- {$ENDIF FPC_HAS_STR_CURRENCY}
- begin
- if Length(WideString(p)) > 255 then
- VariantTypeMismatch(varOleStr, varCurrency);
- s := WideString(p);
- PrepareFloatStr(s);
- {$IFDEF FPC_HAS_STR_CURRENCY}
- Val(s, Result, Error);
- {$ELSE FPC_HAS_STR_CURRENCY} { needed for platforms where Currency = Int64 }
- Val(s, Temp, Error);
- Result := Temp;
- {$ENDIF FPC_HAS_STR_CURRENCY}
- if Error <> 0 then
- VariantTypeMismatch(varOleStr, varCurrency);
- end;
- Function LStrToCurrency(p: Pointer) : Currency;
- var
- s : ShortString;
- Error : Word;
- {$IFNDEF FPC_HAS_STR_CURRENCY}
- Temp : Extended;
- {$ENDIF FPC_HAS_STR_CURRENCY}
- begin
- if Length(AnsiString(p)) > 255 then
- VariantTypeMismatch(varString, varCurrency);
- s := AnsiString(p);
- PrepareFloatStr(s);
- {$IFDEF FPC_HAS_STR_CURRENCY}
- Val(s, Result, Error);
- {$ELSE FPC_HAS_STR_CURRENCY} { needed for platforms where Currency = Int64 }
- Val(s, Temp, Error);
- Result := Temp;
- {$ENDIF FPC_HAS_STR_CURRENCY}
- if Error <> 0 then
- VariantTypeMismatch(varString, varCurrency);
- end;
- Function UStrToCurrency(p: Pointer) : Currency;
- var
- s : ShortString;
- Error : Word;
- {$IFNDEF FPC_HAS_STR_CURRENCY}
- Temp : Extended;
- {$ENDIF FPC_HAS_STR_CURRENCY}
- begin
- if Length(UnicodeString(p)) > 255 then
- VariantTypeMismatch(varUString, varCurrency);
- s := UnicodeString(p);
- PrepareFloatStr(s);
- {$IFDEF FPC_HAS_STR_CURRENCY}
- Val(s, Result, Error);
- {$ELSE FPC_HAS_STR_CURRENCY} { needed for platforms where Currency = Int64 }
- Val(s, Temp, Error);
- Result := Temp;
- {$ENDIF FPC_HAS_STR_CURRENCY}
- if Error <> 0 then
- VariantTypeMismatch(varUString, varCurrency);
- end;
- Function VariantToCurrency(const VargSrc : TVarData) : Currency;
- begin
- {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
- DumpVariant('VariantToCurrency', VargSrc);
- end; {$ENDIF}
- with VargSrc do
- case vType and not varTypeMask of
- 0: case vType of
- varEmpty : Result := 0;
- varSmallInt : Result := vSmallInt;
- varShortInt : Result := vShortInt;
- varInteger : Result := vInteger;
- {$ifndef FPUNONE}
- varSingle : begin
- if (vSingle > MaxCurrency) or (vSingle < MinCurrency) then
- VariantTypeMismatch(vType, varCurrency);
- Result := vSingle;
- end;
- varDouble : begin
- if (vDouble > MaxCurrency) or (vDouble < MinCurrency) then
- VariantTypeMismatch(vType, varCurrency);
- Result := vDouble;
- end;
- varDate : begin
- if (vDate > MaxCurrency) or (vDate < MinCurrency) then
- VariantTypeMismatch(vType, varCurrency);
- Result := vDate;
- end;
- {$endif}
- varCurrency : Result := vCurrency;
- varBoolean : Result := SmallInt(vBoolean);
- varVariant : Result := VariantToCurrency(PVarData(vPointer)^);
- varByte : Result := vByte;
- varWord : Result := vWord;
- varLongWord : Result := vLongWord;
- varInt64 : Result := vInt64;
- varQword : Result := currency(vQWord);
- varOleStr : Result := WStrToCurrency(vOleStr);
- varString : Result := LStrToCurrency(vString);
- varUString : Result := UStrToCurrency(vString);
- else
- VariantTypeMismatch(vType, varCurrency);
- end;
- varByRef: if Assigned(vPointer) then case vType and varTypeMask of
- varSmallInt : Result := PSmallInt(vPointer)^;
- varShortInt : Result := PShortInt(vPointer)^;
- varInteger : Result := PInteger(vPointer)^;
- {$ifndef FPUNONE}
- varSingle : begin
- if (PSingle(vPointer)^ > MaxCurrency) or (PSingle(vPointer)^ < MinCurrency) then
- VariantTypeMismatch(vType, varCurrency);
- Result := PSingle(vPointer)^;
- end;
- varDouble : begin
- if (PDouble(vPointer)^ > MaxCurrency) or (PDouble(vPointer)^ < MinCurrency) then
- VariantTypeMismatch(vType, varCurrency);
- Result := PDouble(vPointer)^;
- end;
- varDate : begin
- if (PDate(vPointer)^ > MaxCurrency) or (PDate(vPointer)^ < MinCurrency) then
- VariantTypeMismatch(vType, varCurrency);
- Result := PDate(vPointer)^;
- end;
- {$endif}
- varCurrency : Result := PCurrency(vPointer)^;
- varBoolean : Result := SmallInt(PWordBool(vPointer)^);
- varVariant : Result := VariantToCurrency(PVarData(vPointer)^);
- varByte : Result := PByte(vPointer)^;
- varWord : Result := PWord(vPointer)^;
- varLongWord : Result := PLongWord(vPointer)^;
- varInt64 : Result := PInt64(vPointer)^;
- varQword : Result := currency(PQWord(vPointer)^);
- varOleStr : Result := WStrToCurrency(PPointer(vPointer)^);
- varString : Result := LStrToCurrency(PPointer(vPointer)^);
- varUString : Result := UStrToCurrency(PPointer(vPointer)^);
- else { other vtype }
- VariantTypeMismatch(vType, varCurrency);
- end else { pointer is nil }
- VariantTypeMismatch(vType, varCurrency);
- else { array or something like that }
- VariantTypeMismatch(vType, varCurrency);
- end;
- {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
- WriteLn('VariantToCurrency -> ', Result);
- end; {$ENDIF}
- end;
- {--- Date ---}
- {$ifndef FPUNONE}
- Function WStrToDate(p: Pointer) : TDateTime;
- var
- s: string;
- begin
- s := WideString(p);
- if not TryStrToDateTime(s, Result) then
- VariantTypeMismatch(varOleStr, varDate);
- end;
- Function LStrToDate(p: Pointer) : TDateTime;
- begin
- if not TryStrToDateTime(AnsiString(p), Result) then
- VariantTypeMismatch(varString, varDate);
- end;
- Function UStrToDate(p: Pointer) : TDateTime;
- begin
- if not TryStrToDateTime(UnicodeString(p), Result) then
- VariantTypeMismatch(varUString, varDate);
- end;
- Function VariantToDate(const VargSrc : TVarData) : TDateTime;
- begin
- {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
- DumpVariant('VariantToDate', VargSrc);
- end; {$ENDIF}
- with VargSrc do
- case vType and not varTypeMask of
- 0: case vType of
- varEmpty : Result := 0;
- varSmallInt : Result := vSmallInt;
- varShortInt : Result := vShortInt;
- varInteger : Result := vInteger;
- varSingle : Result := vSingle;
- varDouble : Result := vDouble;
- varCurrency : Result := vCurrency;
- varDate : Result := vDate;
- varBoolean : Result := SmallInt(vBoolean);
- varVariant : Result := VariantToDate(PVarData(vPointer)^);
- varByte : Result := vByte;
- varWord : Result := vWord;
- varLongWord : Result := vLongWord;
- varInt64 : Result := vInt64;
- varQword : Result := vQWord;
- varOleStr : Result := WStrToDate(vOleStr);
- varString : Result := LStrToDate(vString);
- varUString : Result := UStrToDate(vString);
- else
- VariantTypeMismatch(vType, varDate);
- end;
- varByRef: if Assigned(vPointer) then case vType and varTypeMask of
- varSmallInt : Result := PSmallInt(vPointer)^;
- varShortInt : Result := PShortInt(vPointer)^;
- varInteger : Result := PInteger(vPointer)^;
- varSingle : Result := PSingle(vPointer)^;
- varDouble : Result := PDouble(vPointer)^;
- varCurrency : Result := PCurrency(vPointer)^;
- varDate : Result := PDate(vPointer)^;
- varBoolean : Result := SmallInt(PWordBool(vPointer)^);
- varVariant : Result := VariantToDate(PVarData(vPointer)^);
- varByte : Result := PByte(vPointer)^;
- varWord : Result := PWord(vPointer)^;
- varLongWord : Result := PLongWord(vPointer)^;
- varInt64 : Result := PInt64(vPointer)^;
- varQword : Result := PQWord(vPointer)^;
- varOleStr : Result := WStrToDate(PPointer(vPointer)^);
- varString : Result := LStrToDate(PPointer(vPointer)^);
- varUString : Result := UStrToDate(PPointer(vPointer)^);
- else { other vtype }
- VariantTypeMismatch(vType, varDate);
- end else { pointer is nil }
- VariantTypeMismatch(vType, varDate);
- else { array or something like that }
- VariantTypeMismatch(vType, varDate);
- end;
- if (Result < MinDateTime) or (Result > MaxDateTime) then
- VariantTypeMismatch(VargSrc.vType, varDate);
- {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
- WriteLn('VariantToDate -> ', Result);
- end; {$ENDIF}
- end;
- {$endif}
- {--- Boolean ---}
- Function WStrToBoolean(p: Pointer) : Boolean;
- begin
- if not TryStrToBool(WideString(p), Result) then
- VariantTypeMismatch(varOleStr, varBoolean);
- end;
- Function LStrToBoolean(p: Pointer) : Boolean;
- begin
- if not TryStrToBool(AnsiString(p), Result) then
- VariantTypeMismatch(varString, varBoolean);
- end;
- Function UStrToBoolean(p: Pointer) : Boolean;
- begin
- if not TryStrToBool(UnicodeString(p), Result) then
- VariantTypeMismatch(varUString, varBoolean);
- end;
- Function VariantToBoolean(const VargSrc : TVarData) : Boolean;
- begin
- {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
- DumpVariant('VariantToBoolean', VargSrc);
- end; {$ENDIF}
- with VargSrc do
- case vType and not varTypeMask of
- 0: case vType of
- varEmpty : Result := False;
- varSmallInt : Result := vSmallInt <> 0;
- varShortInt : Result := vShortInt <> 0;
- varInteger : Result := vInteger <> 0;
- {$ifndef FPUNONE}
- varSingle : Result := vSingle <> 0;
- varDouble : Result := vDouble <> 0;
- varCurrency : Result := vCurrency <> 0;
- varDate : Result := vDate <> 0;
- {$endif}
- varBoolean : Result := vBoolean;
- varVariant : Result := VariantToBoolean(PVarData(vPointer)^);
- varByte : Result := vByte <> 0;
- varWord : Result := vWord <> 0;
- varLongWord : Result := vLongWord <> 0;
- varInt64 : Result := vInt64 <> 0;
- varQword : Result := vQWord <> 0;
- varOleStr : Result := WStrToBoolean(vOleStr);
- varString : Result := LStrToBoolean(vString);
- varUString : Result := UStrToBoolean(vString);
- else
- VariantTypeMismatch(vType, varBoolean);
- end;
- varByRef: if Assigned(vPointer) then case vType and varTypeMask of
- varSmallInt : Result := PSmallInt(vPointer)^ <> 0;
- varShortInt : Result := PShortInt(vPointer)^ <> 0;
- varInteger : Result := PInteger(vPointer)^ <> 0;
- {$ifndef FPUNONE}
- varSingle : Result := PSingle(vPointer)^ <> 0;
- varDouble : Result := PDouble(vPointer)^ <> 0;
- varCurrency : Result := PCurrency(vPointer)^ <> 0;
- varDate : Result := PDate(vPointer)^ <> 0;
- {$endif}
- varBoolean : Result := SmallInt(PWordBool(vPointer)^) <> 0;
- varVariant : Result := VariantToBoolean(PVarData(vPointer)^);
- varByte : Result := PByte(vPointer)^ <> 0;
- varWord : Result := PWord(vPointer)^ <> 0;
- varLongWord : Result := PLongWord(vPointer)^ <> 0;
- varInt64 : Result := PInt64(vPointer)^ <> 0;
- varQword : Result := PQWord(vPointer)^ <> 0;
- varOleStr : Result := WStrToBoolean(PPointer(vPointer)^);
- varString : Result := LStrToBoolean(PPointer(vPointer)^);
- varUString : Result := UStrToBoolean(PPointer(vPointer)^);
- else { other vtype }
- VariantTypeMismatch(vType, varBoolean);
- end else { pointer is nil }
- Result := False;
- else { array or something like that }
- VariantTypeMismatch(vType, varBoolean);
- end;
- {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
- WriteLn('VariantToBoolean -> ', Result);
- end; {$ENDIF}
- end;
- {--- Byte ---}
- Function WStrToByte(p: Pointer) : Byte;
- var
- Error : Word;
- begin
- Val(WideString(p), Result, Error);
- if Error <> 0 then
- VariantTypeMismatch(varOleStr, varByte);
- end;
- Function LStrToByte(p: Pointer) : Byte;
- var
- Error : Word;
- begin
- Val(AnsiString(p), Result, Error);
- if Error <> 0 then
- VariantTypeMismatch(varString, varByte);
- end;
- Function UStrToByte(p: Pointer) : Byte;
- var
- Error : Word;
- begin
- Val(UnicodeString(p), Result, Error);
- if Error <> 0 then
- VariantTypeMismatch(varUString, varByte);
- end;
- Function VariantToByte(const VargSrc : TVarData) : Byte;
- begin
- {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
- DumpVariant('VariantToByte', VargSrc);
- end; {$ENDIF}
- with VargSrc do
- case vType and not varTypeMask of
- 0: case vType of
- varEmpty : Result := 0;
- varSmallInt : Result := byte(vSmallInt);
- varShortInt : Result := byte(vShortInt);
- varInteger : Result := byte(vInteger);
- {$ifndef FPUNONE}
- varSingle : Result := byte(Round(vSingle));
- varDouble : Result := byte(Round(vDouble));
- varCurrency : Result := byte(Round(vCurrency));
- varDate : Result := byte(Round(vDate));
- {$endif}
- varBoolean : Result := byte(SmallInt(vBoolean));
- varVariant : Result := VariantToByte(PVarData(vPointer)^);
- varByte : Result := vByte;
- varWord : Result := byte(vWord);
- varLongWord : Result := byte(vLongWord);
- varInt64 : Result := byte(vInt64);
- varQword : Result := byte(vQWord);
- varOleStr : Result := WStrToByte(vOleStr);
- varString : Result := LStrToByte(vString);
- varUString : Result := UStrToByte(vString);
- else
- VariantTypeMismatch(vType, varByte);
- end;
- varByRef: if Assigned(vPointer) then case vType and varTypeMask of
- varSmallInt : Result := byte(PSmallInt(vPointer)^);
- varShortInt : Result := byte(PShortInt(vPointer)^);
- varInteger : Result := byte(PInteger(vPointer)^);
- {$ifndef FPUNONE}
- varSingle : Result := byte(Round(PSingle(vPointer)^));
- varDouble : Result := byte(Round(PDouble(vPointer)^));
- varCurrency : Result := byte(Round(PCurrency(vPointer)^));
- varDate : Result := byte(Round(PDate(vPointer)^));
- {$endif}
- varBoolean : Result := byte(SmallInt(PWordBool(vPointer)^));
- varVariant : Result := byte(VariantToByte(PVarData(vPointer)^));
- varByte : Result := PByte(vPointer)^;
- varWord : Result := byte(PWord(vPointer)^);
- varLongWord : Result := byte(PLongWord(vPointer)^);
- varInt64 : Result := byte(PInt64(vPointer)^);
- varQword : Result := byte(PQWord(vPointer)^);
- varOleStr : Result := WStrToByte(PPointer(vPointer)^);
- varString : Result := LStrToByte(PPointer(vPointer)^);
- varUString : Result := UStrToByte(PPointer(vPointer)^);
- else { other vtype }
- VariantTypeMismatch(vType, varByte);
- end else { pointer is nil }
- VariantTypeMismatch(vType, varByte);
- else { array or something like that }
- VariantTypeMismatch(vType, varByte);
- end;
- {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
- WriteLn('VariantToByte -> ', Result);
- end; {$ENDIF}
- end;
- {--- Int64 ---}
- Function WStrToInt64(p: Pointer) : Int64;
- var
- Error : Word;
- begin
- Val(WideString(p), Result, Error);
- if Error <> 0 then
- VariantTypeMismatch(varOleStr, varInt64);
- end;
- Function LStrToInt64(p: Pointer) : Int64;
- var
- Error : Word;
- begin
- Val(AnsiString(p), Result, Error);
- if Error <> 0 then
- VariantTypeMismatch(varString, varInt64);
- end;
- Function UStrToInt64(p: Pointer) : Int64;
- var
- Error : Word;
- begin
- Val(UnicodeString(p), Result, Error);
- if Error <> 0 then
- VariantTypeMismatch(varUString, varInt64);
- end;
- Function VariantToInt64(const VargSrc : TVarData) : Int64;
- begin
- {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
- DumpVariant('VariantToInt64', VargSrc);
- end; {$ENDIF}
- with VargSrc do
- case vType and not varTypeMask of
- 0: case vType of
- varEmpty : Result := 0;
- varSmallInt : Result := vSmallInt;
- varShortInt : Result := vShortInt;
- varInteger : Result := vInteger;
- {$ifndef FPUNONE}
- varSingle : Result := Round(vSingle);
- varDouble : Result := Round(vDouble);
- varCurrency : Result := Round(vCurrency);
- varDate : Result := Round(vDate);
- {$endif}
- varBoolean : Result := SmallInt(vBoolean);
- varVariant : Result := VariantToInt64(PVarData(vPointer)^);
- varByte : Result := vByte;
- varWord : Result := vWord;
- varLongWord : Result := vLongWord;
- varInt64 : Result := vInt64;
- varQword : Result := int64(vQWord);
- varOleStr : Result := WStrToInt64(vOleStr);
- varString : Result := LStrToInt64(vString);
- varUString : Result := UStrToInt64(vString);
- else
- VariantTypeMismatch(vType, varInt64);
- end;
- varByRef: if Assigned(vPointer) then case vType and varTypeMask of
- varSmallInt : Result := PSmallInt(vPointer)^;
- varShortInt : Result := PShortInt(vPointer)^;
- varInteger : Result := PInteger(vPointer)^;
- {$ifndef FPUNONE}
- varSingle : Result := Round(PSingle(vPointer)^);
- varDouble : Result := Round(PDouble(vPointer)^);
- varCurrency : Result := Round(PCurrency(vPointer)^);
- varDate : Result := Round(PDate(vPointer)^);
- {$endif}
- varBoolean : Result := SmallInt(PWordBool(vPointer)^);
- varVariant : Result := VariantToInt64(PVarData(vPointer)^);
- varByte : Result := PByte(vPointer)^;
- varWord : Result := PWord(vPointer)^;
- varLongWord : Result := PLongWord(vPointer)^;
- varInt64 : Result := PInt64(vPointer)^;
- varQword : Result := PQWord(vPointer)^;
- varOleStr : Result := WStrToInt64(PPointer(vPointer)^);
- varString : Result := LStrToInt64(PPointer(vPointer)^);
- varUString : Result := UStrToInt64(PPointer(vPointer)^);
- else { other vtype }
- VariantTypeMismatch(vType, varInt64);
- end else { pointer is nil }
- VariantTypeMismatch(vType, varInt64);
- else { array or something like that }
- VariantTypeMismatch(vType, varInt64);
- end;
- {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
- WriteLn('VariantToInt64 -> ', Result);
- end; {$ENDIF}
- end;
- {--- QWord ---}
- Function WStrToQWord(p: Pointer) : QWord;
- var
- Error : Word;
- begin
- Val(WideString(p), Result, Error);
- if Error <> 0 then
- VariantTypeMismatch(varOleStr, varQWord);
- end;
- Function LStrToQWord(p: Pointer) : QWord;
- var
- Error : Word;
- begin
- Val(AnsiString(p), Result, Error);
- if Error <> 0 then
- VariantTypeMismatch(varString, varQWord);
- end;
- Function UStrToQWord(p: Pointer) : QWord;
- var
- Error : Word;
- begin
- Val(UnicodeString(p), Result, Error);
- if Error <> 0 then
- VariantTypeMismatch(varUString, varQWord);
- end;
- Function VariantToQWord(const VargSrc : TVarData) : QWord;
- begin
- {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
- DumpVariant('VariantToQWord', VargSrc);
- end; {$ENDIF}
- with VargSrc do
- case vType and not varTypeMask of
- 0: case vType of
- varEmpty : Result := 0;
- varSmallInt : Result := qword(vSmallInt);
- varShortInt : Result := qword(vShortInt);
- varInteger : Result := qword(vInteger);
- {$ifndef FPUNONE}
- varSingle : Result := qword(Round(vSingle));
- varDouble : Result := qword(Round(vDouble));
- varCurrency : Result := qword(Round(vCurrency));
- varDate : Result := qword(Round(vDate));
- {$endif}
- varBoolean : Result := qword(SmallInt(vBoolean));
- varVariant : Result := VariantToQWord(PVarData(vPointer)^);
- varByte : Result := vByte;
- varWord : Result := vWord;
- varLongWord : Result := vLongWord;
- varInt64 : Result := qword(vInt64);
- varQword : Result := vQWord;
- varOleStr : Result := WStrToQWord(vOleStr);
- varString : Result := LStrToQWord(vString);
- varUString : Result := UStrToQWord(vString);
- else
- VariantTypeMismatch(vType, varQWord);
- end;
- varByRef: if Assigned(vPointer) then case vType and varTypeMask of
- varSmallInt : Result := qword(PSmallInt(vPointer)^);
- varShortInt : Result := qword(PShortInt(vPointer)^);
- varInteger : Result := qword(PInteger(vPointer)^);
- {$ifndef FPUNONE}
- varSingle : Result := qword(Round(PSingle(vPointer)^));
- varDouble : Result := qword(Round(PDouble(vPointer)^));
- varCurrency : Result := qword(Round(PCurrency(vPointer)^));
- varDate : Result := qword(Round(PDate(vPointer)^));
- {$endif}
- varBoolean : Result := qword(SmallInt(PWordBool(vPointer)^));
- varVariant : Result := VariantToQWord(PVarData(vPointer)^);
- varByte : Result := PByte(vPointer)^;
- varWord : Result := PWord(vPointer)^;
- varLongWord : Result := PLongWord(vPointer)^;
- varInt64 : Result := qword(PInt64(vPointer)^);
- varQword : Result := PQWord(vPointer)^;
- varOleStr : Result := WStrToQWord(PPointer(vPointer)^);
- varString : Result := LStrToQWord(PPointer(vPointer)^);
- varUString : Result := UStrToQWord(PPointer(vPointer)^);
- else { other vtype }
- VariantTypeMismatch(vType, varQWord);
- end else { pointer is nil }
- VariantTypeMismatch(vType, varQWord);
- else { array or something like that }
- VariantTypeMismatch(vType, varQWord);
- end;
- {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
- WriteLn('VariantToQWord -> ', Result);
- end; {$ENDIF}
- end;
- function VarDateToString(DT: TDateTime): AnsiString;
- begin
- if Trunc(DT) = 0 then
- Result := TimeToStr(DT)
- else
- Result := DateTimeToStr(DT);
- end;
- {--- WideString ---}
- Function VariantToWideString(const VargSrc : TVarData) : WideString;
- begin
- {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
- DumpVariant('VariantToWideString', VargSrc);
- end; {$ENDIF}
- with VargSrc do
- case vType and not varTypeMask of
- 0: case vType of
- varEmpty : Result := '';
- varSmallInt : Result := IntToStr(vSmallInt);
- varShortInt : Result := IntToStr(vShortInt);
- varInteger : Result := IntToStr(vInteger);
- {$ifndef FPUNONE}
- varSingle : Result := FloatToStr(vSingle);
- varDouble : Result := FloatToStr(vDouble);
- varCurrency : Result := FloatToStr(vCurrency);
- varDate : Result := VarDateToString(vDate);
- {$endif}
- varBoolean : Result := BoolToStr(vBoolean, True);
- varVariant : Result := VariantToWideString(PVarData(vPointer)^);
- varByte : Result := IntToStr(vByte);
- varWord : Result := IntToStr(vWord);
- varLongWord : Result := IntToStr(vLongWord);
- varInt64 : Result := IntToStr(vInt64);
- varQword : Result := IntToStr(vQWord);
- varOleStr : Result := WideString(Pointer(vOleStr));
- varString : Result := AnsiString(vString);
- varUString : Result := UnicodeString(vString);
- else
- VariantTypeMismatch(vType, varOleStr);
- end;
- varByRef: if Assigned(vPointer) then case vType and varTypeMask of
- varSmallInt : Result := IntToStr(PSmallInt(vPointer)^);
- varShortInt : Result := IntToStr(PShortInt(vPointer)^);
- varInteger : Result := IntToStr(PInteger(vPointer)^);
- {$ifndef FPUNONE}
- varSingle : Result := FloatToStr(PSingle(vPointer)^);
- varDouble : Result := FloatToStr(PDouble(vPointer)^);
- varCurrency : Result := FloatToStr(PCurrency(vPointer)^);
- varDate : Result := VarDateToString(PDate(vPointer)^);
- {$endif}
- varBoolean : Result := BoolToStr(PWordBool(vPointer)^, True);
- varVariant : Result := VariantToWideString(PVarData(vPointer)^);
- varByte : Result := IntToStr(PByte(vPointer)^);
- varWord : Result := IntToStr(PWord(vPointer)^);
- varLongWord : Result := IntToStr(PLongWord(vPointer)^);
- varInt64 : Result := IntToStr(PInt64(vPointer)^);
- varQword : Result := IntToStr(PQWord(vPointer)^);
- varOleStr : Result := WideString(PPointer(vPointer)^);
- varString : Result := AnsiString(PPointer(vPointer)^);
- varUString : Result := UnicodeString(PPointer(vPointer)^);
- else { other vtype }
- VariantTypeMismatch(vType, varOleStr);
- end else { pointer is nil }
- VariantTypeMismatch(vType, varOleStr);
- else { array or something like that }
- VariantTypeMismatch(vType, varOleStr);
- end;
- {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
- WriteLn('VariantToWideString -> ', Result);
- end; {$ENDIF}
- end;
- {--- AnsiString ---}
- Function VariantToAnsiString(const VargSrc : TVarData) : AnsiString;
- begin
- {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
- DumpVariant('VariantToAnsiString', VargSrc);
- end; {$ENDIF}
- with VargSrc do
- case vType and not varTypeMask of
- 0: case vType of
- varEmpty : Result := '';
- varSmallInt : Result := IntToStr(vSmallInt);
- varShortInt : Result := IntToStr(vShortInt);
- varInteger : Result := IntToStr(vInteger);
- {$ifndef FPUNONE}
- varSingle : Result := FloatToStr(vSingle);
- varDouble : Result := FloatToStr(vDouble);
- varCurrency : Result := FloatToStr(vCurrency);
- varDate : Result := VarDateToString(vDate);
- {$endif}
- varBoolean : Result := BoolToStr(vBoolean, True);
- varVariant : Result := VariantToAnsiString(PVarData(vPointer)^);
- varByte : Result := IntToStr(vByte);
- varWord : Result := IntToStr(vWord);
- varLongWord : Result := IntToStr(vLongWord);
- varInt64 : Result := IntToStr(vInt64);
- varQword : Result := IntToStr(vQWord);
- varOleStr : Result := WideString(Pointer(vOleStr));
- varString : Result := AnsiString(vString);
- varUString : Result := UnicodeString(vString);
- else
- VariantTypeMismatch(vType, varString);
- end;
- varByRef: if Assigned(vPointer) then case vType and varTypeMask of
- varSmallInt : Result := IntToStr(PSmallInt(vPointer)^);
- varShortInt : Result := IntToStr(PShortInt(vPointer)^);
- varInteger : Result := IntToStr(PInteger(vPointer)^);
- {$ifndef FPUNONE}
- varSingle : Result := FloatToStr(PSingle(vPointer)^);
- varDouble : Result := FloatToStr(PDouble(vPointer)^);
- varCurrency : Result := FloatToStr(PCurrency(vPointer)^);
- varDate : Result := VarDateToString(PDate(vPointer)^);
- {$endif}
- varBoolean : Result := BoolToStr(PWordBool(vPointer)^, True);
- varVariant : Result := VariantToAnsiString(PVarData(vPointer)^);
- varByte : Result := IntToStr(PByte(vPointer)^);
- varWord : Result := IntToStr(PWord(vPointer)^);
- varLongWord : Result := IntToStr(PLongWord(vPointer)^);
- varInt64 : Result := IntToStr(PInt64(vPointer)^);
- varQword : Result := IntToStr(PQWord(vPointer)^);
- varOleStr : Result := WideString(PPointer(vPointer)^);
- varString : Result := AnsiString(PPointer(vPointer)^);
- varUString : Result := UnicodeString(PPointer(vPointer)^);
- else { other vtype }
- VariantTypeMismatch(vType, varString);
- end else { pointer is nil }
- VariantTypeMismatch(vType, varString);
- else { array or something like that }
- VariantTypeMismatch(vType, varString);
- end;
- {$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
- WriteLn('VariantToAnsiString -> ', Result);
- end; {$ENDIF}
- end;
- Function VariantToShortString(const VargSrc : TVarData) : ShortString;
- begin
- Result:=VariantToAnsiString(VargSrc);
- end;
- { ---------------------------------------------------------------------
- Some debug routines
- ---------------------------------------------------------------------}
- Procedure DumpVariant(const VSrc : Variant);
- begin
- DumpVariant(Output, '', TVarData(VSrc));
- end;
- Procedure DumpVariant(const aName: string; const VSrc : Variant);
- begin
- DumpVariant(Output, aName, TVarData(VSrc));
- end;
- Procedure DumpVariant(Var F : Text; const VSrc : Variant);
- begin
- DumpVariant(F, '', TVarData(VSrc));
- end;
- procedure DumpVariant(var F : Text; const aName: string; const VSrc : Variant);
- begin
- DumpVariant(F, aName, TVarData(VSrc));
- end;
- Procedure DumpVariant(const VargSrc : TVarData);
- begin
- DumpVariant(Output, '', VargSrc);
- end;
- Procedure DumpVariant(const aName: string; const VargSrc : TVarData);
- begin
- DumpVariant(Output, aName, VargSrc);
- end;
- Procedure DumpVariant(Var F : Text; const VargSrc : TVarData);
- begin
- DumpVariant(F, '', VargSrc);
- end;
- const
- VarTypeStrings : array [varEmpty..varQword] of string = (
- 'empty', { varempty = 0 }
- 'null', { varnull = 1 }
- 'smallint', { varsmallint = 2 }
- 'integer', { varinteger = 3 }
- 'single', { varsingle = 4 }
- 'double', { vardouble = 5 }
- 'currency', { varcurrency = 6 }
- 'date', { vardate = 7 }
- 'olestr', { varolestr = 8 }
- 'dispatch', { vardispatch = 9 }
- 'error', { varerror = 10 }
- 'boolean', { varboolean = 11 }
- 'variant', { varvariant = 12 }
- 'unknown', { varunknown = 13 }
- 'decimal', { vardecimal = 14 }
- 'undefined',
- 'shortint', { varshortint = 16 }
- 'byte', { varbyte = 17 }
- 'word', { varword = 18 }
- 'longword', { varlongword = 19 }
- 'int64', { varint64 = 20 }
- 'qword'); { varqword = 21 }
- Procedure DumpVariant(Var F : Text; const aName: string; const VargSrc : TVarData);
- Var
- i: Integer;
- begin
- Writeln(F,'---> ', aName, ' at $', HexStr(@VargSrc), ' <----------------');
- with VargSrc do begin
- if vType and varByRef = varByRef then
- Writeln(F,'Variant is by reference.');
- if vType and varArray = varArray then
- Writeln(F,'Variant is an array.');
- if vType and not (varTypeMask or varArray or varByRef) <> 0 then
- Writeln(F,'Variant has unknown flags set in type: $', IntToHex(vType, 4));
- If (vType and varTypeMask) in [varEmpty..varQword] then
- Writeln(F,'Variant has type : ', VarTypeStrings[vType and varTypeMask])
- else If (vType and varTypeMask) = varString then
- Writeln(F,'Variant has type : string')
- else if (vType and varTypeMask) = varUString then
- Writeln(F,'Variant has type : UnicodeString')
- else
- Writeln(F,'Variant has unknown type : $', IntToHex(vType and varTypeMask, 4));
- Write('Bytes :');
- for i := 0 to 13 do
- Write(IntToHex(VBytes[i], 2),' ');
- WriteLn;
- if vType and varArray = varArray then begin
- Writeln(F,'---< ', aName, ' at $', HexStr(@VargSrc), ' >----------------');
- Writeln(F);
- Exit;
- end;
- If vType <> varEmpty then begin
- Write(F,'Value is: [');
- if (vType and varByRef = varByRef) or (vType and varTypeMask = varVariant) then
- if not Assigned(vPointer) then begin
- WriteLn(F, 'nil]');
- Writeln(F,'---< ', aName, ' at $', HexStr(@VargSrc), ' >----------------');
- Writeln(F);
- Exit;
- end;
- case vType of
- varNull : Write(F, 'Null');
- varSmallInt : Write(F, vSmallInt);
- varInteger : Write(F, vInteger);
- {$ifndef FPUNONE}
- varSingle : Write(F, vSingle);
- varDouble : Write(F, vDouble);
- varCurrency : Write(F, vCurrency);
- varDate : Write(F, vDate);
- {$endif}
- varOleStr : Write(F, WideString(Pointer(vOleStr)));
- varError : Write(F, IntToHex(Cardinal(vError), 8));
- varBoolean : Write(F, vBoolean);
- varVariant, varVariant or varByRef : begin
- WriteLn(' dereferencing -> ]');
- DumpVariant(F, aName+'^', PVarData(vPointer)^);
- Exit;
- end;
- varShortInt : Write(F, vShortInt);
- varByte : Write(F, vByte);
- varWord : Write(F, vWord);
- varLongWord : Write(F, vLongWord);
- varInt64 : Write(F, vInt64);
- varQword : Write(F, vQWord);
- varString : Write(F, AnsiString(vString));
- varNull or varByRef : Write(F, 'Null');
- varSmallInt or varByRef : Write(F, PSmallInt(vPointer)^);
- varInteger or varByRef : Write(F, PInteger(vPointer)^);
- {$ifndef FPUNONE}
- varSingle or varByRef : Write(F, PSingle(vPointer)^);
- varDouble or varByRef : Write(F, PDouble(vPointer)^);
- varCurrency or varByRef : Write(F, PCurrency(vPointer)^);
- varDate or varByRef : Write(F, PDate(vPointer)^);
- {$endif}
- varOleStr or varByRef : Write(F, WideString(PPointer(vPointer)^));
- varError or varByRef : Write(F, IntToHex(Cardinal(PLongWord(vPointer)^), 8));
- varBoolean or varByRef : Write(F, PWordBool(vPointer)^);
- varShortInt or varByRef : Write(F, PShortInt(vPointer)^);
- varByte or varByRef : Write(F, PByte(vPointer)^);
- varWord or varByRef : Write(F, PWord(vPointer)^);
- varLongWord or varByRef : Write(F, PLongWord(vPointer)^);
- varInt64 or varByRef : Write(F, PInt64(vPointer)^);
- varQword or varByRef : Write(F, PQWord(vPointer)^);
- varString or varByRef : Write(F, AnsiString(PPointer(vPointer)^));
- else
- Write(F, 'Unsupported');
- end;
- WriteLn(F, ']');
- end;
- end;
- Writeln(F,'---< ', aName, ' at $', HexStr(@VargSrc), ' >----------------');
- Writeln(F);
- end;
|