Одной из неприятных вещей при работе с Excel через интерфейс автоматизации является слабый набор.
Возвращаемое значение может содержать
что угодно
разных типов.
Как проверить, соответствует ли вариант, возвращаемый caller
интерфейсом ExcelRange
?Как проверить, содержит ли OleVariant интерфейс
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;
(достаточно Strangly оператор 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 содержит данный интерфейс?
Смотрите также: How to cast OleVariant to IDispatch derived?
EDIT
Спасибо всем, я использовал следующие сделать тестирование, потому что Excel смешивает интерфейсы и OleStrings в качестве возможных возвращаемых значений.
if VarIsType(Caller, varDispatch) and Supports(Caller, ExcelRange) then begin
Интерфейсы всегда поддерживает 'как' для тиснения. Странно то, что 'is' не работает, а не' '. –