- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 Delphi 中,我想确定是否可以将特定的 OleVariant 转换为特定的数据类型如果不能则不引发异常。异常不适用于程序流程,对吗?
我想要的是这样的,其中 Type 可以是 OleVariant 支持的任何内容:
if TryVarAsType(variant, value) then ...
我不想要的是
try
value := Type(variant);
// case where the variant could be converted to a Type
except
// case where the variant could not be converted to a Type
end;
变体无法转换为 bool 值的情况只是经常发生的正常情况,并不表示任何类型的错误。
最佳答案
您可以使用 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 }
对于其他类型(pascal 变体),例如 varString
、varAny
,您必须检查源和目标 TVarType
并编写自己的测试用例.
更新
正如@David 指出的,区域设置可以为相同的值产生不同的结果,因此您必须将此答案视为构建您自己的函数的初始步骤或提示,并且您必须意识到在建议的功能。关于delphi - 测试强制转换 OleVariant 是否会引发异常(不引发异常),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5183794/
我有一个 OleVariant或 Variant例如,使用 IXMLNode.GetAttributeNS 读取的值,使其成为“字符串”( varOleStr 或 varString ),我想用例如
我有一个第三方 ActiveX 控件,已导入到我的应用程序中。其中一个函数导入为: function GenerateMACClearIVSync(const KeyName: WideString;
我一直认为 OleVariant 变量的初始值始终等于“未分配”(类型 VT_EMPTY)。但下面用 XE3 编译的简单代码告诉我事实并非如此。 {$APPTYPE CONSOLE} uses A
考虑以下代码摘录: type MyIntf = interface procedure Work(param: OleVariant); end; MyClass = class
今天我带来了另一个让我头疼的问题, 我确实将一个 DAO 3.6 类型库导入到我的 delphi 7 中,并且我开始看到许多有趣的接口(interface),所以我面临着一个有趣的问题。 每次Fiel
有没有办法在 OleVariant 中传递包装并解开 TObject 后代?我正在尝试跨自动化对象传递 TObject。我知道这不是一个好主意,但我没有更好的选择。 如果有任何区别,该对象将在来自同一
我正在使用 Delphi 和 WinHTTP 执行 HTTP 请求以从互联网下载一些文件,我可以执行该请求,但我不知道如何从 返回的 OleVariant 获取 IStream响应流。我花了很多时间谷
通过自动化界面使用 Excel 时最烦人的事情之一就是弱类型。 返回值可以包含anything不同类型。 如何测试 caller 返回的变体是否是 ExcelRange 接口(interface)?
我想做一个界面,但我不知道。 OleVariant 是包含“标准”字符串的“标准”吗 - 传递和返回? function Any(Input : OleVariant; out Output : Ol
这是一个简单的代码: procedure Test; var V: OleVariant; begin V := CreateOleObject('ADOX.Catalog'); try
在 Delphi 中,我想确定是否可以将特定的 OleVariant 转换为特定的数据类型如果不能则不引发异常。异常不适用于程序流程,对吗? 我想要的是这样的,其中 Type 可以是 OleVaria
我有 Delphi 2006 客户端应用程序。该客户端从 COM 服务器接收 Olevariant 类型数据。其功能是: procedure OnLimitsChanged(var SymbolsCh
我正在尝试找到一种安全/确定的方法来释放封装在 OleVariant 中的接口(interface)。 AFAICS Delphi 在程序结束时释放接口(interface)引用,但就我而言,我必须更
我需要从 Stream 中读取数据并将读取的缓冲区放入 OleVariant (VarArray) 变量中。 var MemoryStream : TMemoryStream; Data : OleV
program UInt32ToVariant; uses Vcl.Dialogs, System.SysUtils, System.Variants; var ui32Val: Cardin
我可以将内存从缓冲区复制到安全数组中,如下所示 function GetVarArrayFromBuffer(ABuffer : pByte; ASizeInBytes: Cardinal) :
当我使用 RTTI 将 TDateTime 值分配给对象的 OleVariant 属性时,对象将变为浮点值。 该对象的设计使得该属性可以变为 Null 或任何数据类型的值。如果它变成 float ,则
我正在通过 COM 连接指纹读取器,我需要帮助将 VB.NET 和 C++ 代码转换为 Delphi。 API 以 olevariant 作为参数: Function FingerPrint.GetD
使用 Delphi,我需要访问一个包含数组中的一条或多条记录的 OleVariant。 我调用的方法返回VT_RECORD的VT_ARRAY,记录本身定义为: struct StreamTimeInf
我是一名优秀的程序员,十分优秀!