可以使用VariantChangeTypeEx
功能構建這樣的功能。
uses
VarUtils,
Variants;
function TryVarAsType(AVariant : OleVariant; const AVarType: TVarType) :Boolean;
var
SourceType: TVarType;
begin
SourceType:=TVarData(AVariant).VType;
//the types are ole compatible
if (AVarType and varTypeMask < varInt64) and (SourceType and varTypeMask < varInt64) then
Result:=
(SourceType=AVarType) or
(VariantChangeTypeEx(TVarData(AVariant), TVarData(AVariant), VAR_LOCALE_USER_DEFAULT, 0, AVarType)=VAR_OK)
else
Result:=False; //Here you must process the variant pascal types like varString
end;
和使用這樣
TryVarAsType('1',varInteger);
TryVarAsType('s',varInteger)
這將與只與OLE兼容的變量類型
varEmpty = $0000; { vt_empty 0 }
varNull = $0001; { vt_null 1 }
varSmallint = $0002; { vt_i2 2 }
varInteger = $0003; { vt_i4 3 }
varSingle = $0004; { vt_r4 4 }
varDouble = $0005; { vt_r8 5 }
varCurrency = $0006; { vt_cy 6 }
varDate = $0007; { vt_date 7 }
varOleStr = $0008; { vt_bstr 8 }
varDispatch = $0009; { vt_dispatch 9 }
varError = $000A; { vt_error 10 }
varBoolean = $000B; { vt_bool 11 }
varVariant = $000C; { vt_variant 12 }
varUnknown = $000D; { vt_unknown 13 }
varShortInt = $0010; { vt_i1 16 }
varByte = $0011; { vt_ui1 17 }
varWord = $0012; { vt_ui2 18 }
varLongWord = $0013; { vt_ui4 19 }
varInt64 = $0014; { vt_i8 20 }
的另一類型(帕斯卡變種),如varString
,varAny
必須檢查源和目的地TVarType
並編寫您自己的測試用例。
UPDATE
作爲@大衛指出我出去,區域設置可以產生不同的結果爲相同的值,所以你必須考慮這個答案就像初始步驟或提示構建自己的功能,你必須瞭解所提議的功能中引起的區域設置問題。
異常不是錯誤。例外是一個例外。這是不是規則,這是例外。另一條路。可能佔用堆棧多於一層的路徑。需要你編寫try..catch的路徑。在應用程序內故意引發和例行處理異常並不總是「錯誤狀態」,不應總是避免。有時,程序流程例外,特別是對於「無效輸入」條件。 – 2011-03-03 19:43:37
授予異常是一個例外。但是就這個問題而言,任何代碼路徑都不例外,並且不能將變體轉換爲給定類型,這與條件一樣有效。 – 2011-03-04 08:31:02