gpt4 book ai didi

delphi - 如何测试 OleVariant 是否包含接口(interface)

转载 作者:行者123 更新时间:2023-12-03 15:44:52 28 4
gpt4 key购买 nike

通过自动化界面使用 Excel 时最烦人的事情之一就是弱类型。
返回值可以包含 anything 不同类型。
如何测试 caller 返回的变体是否是 ExcelRange 接口(interface)?

function TAddInModule.InBank: boolean;
var
ExcelAppAsVariant: OleVariant;
test: string;
Caller: OleVariant;
begin //Exception handling omitted for brevity.
Result:= false;
ExcelAppAsVariant:= ExcelApp.Application;
Caller:= ExcelApp.Application.Caller[EmptyParam, 0];
if IDispatch(Caller) is ExcelRange then begin //E2015 Operator not applicable
Result:= lowercase(Caller.Parent.Name) = 'bank'
end;
end;

(奇怪的是,as 运算符可以工作(IDispatch(Caller) as ExcelRange).Parent; 编译得很好)。

以下代码可以工作,但看起来过于冗长:

if VarIsType(Caller, varDispatch) then begin 
IUnknown(Caller).QueryInterface(ExcelRange, ICaller)
if Assigned(ICaller) then ICaller......

也没有内置函数VarIsInterface(Variant, Interface)
如何测试 OleVariant 是否包含给定接口(interface)?

另请参阅:How to cast OleVariant to IDispatch derived?

编辑
谢谢大家,我使用以下内容进行测试,因为 Excel 混合了接口(interface)和 OleStrings 作为可能的返回值。

if VarIsType(Caller, varDispatch) and Supports(Caller, ExcelRange) then begin

最佳答案

我可能会使用Supports为此:

if Supports(Caller, ExcelRange) then
....

这解析为与 @Stijn 给出的代码相同的代码,但 Supports 调用更加简洁。

关于delphi - 如何测试 OleVariant 是否包含接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30621704/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com