以下代码产生EVariantInvalidOpError
异常:
var
i : Variant;
begin
i := 10;
ShowMessage(i.ToString());
end;
以下所有方法都很好,但我不明白为什么ToString
函数会引发Variant
类型变量的异常:
var
i : Variant;
begin
i := 10;
ShowMessage(VarToStr(i));
end;
var
i : Integer;
begin
i := 10;
ShowMessage(i.ToString());
end;
变量使您可以在其中存储各种类型的值,而在编译时该类型可能是未知的。您可以将整数值写入Variant
类型的单个变量,然后用字符串值覆盖它。除值变量记录外,type information也存储在其中。在这些值中,其中一些是自动分配和/或引用计数的。从Variant
变量写入或读取值时,编译器在后台做了很多工作。
varDispatch
类型的变量从编译器中获得更多特殊待遇。 varDispatch
表示该值的类型为IDispatch
(通常,但不一定与Windows IDispatch
相关)。 COM technology的实例通过IDispatch
和GetTypeInfoCount
方法提供有关其方法和属性的信息。您可以使用其GetTypeInfo
方法按名称查询信息。
让我们先从您的评论中回答问题:
即使没有帮助者为
GetIDsOfNames
类型实现该功能,Delphi为什么允许我使用ToString
函数?这就是Delphi如何实现称为
Variant
的概念。它允许您调用在编译时类型未知的对象的方法。此项工作的前提是基础变体类型支持后期绑定。 Delphi具有对late binding和varDispatch
变体的后期绑定的内置支持,如在程序varUnknown
中的单元DispInvokeCore
中所见。
我不明白为什么
System.Variants
函数会引发ToString
类型变量的异常。如上所述,在运行时,您的程序尝试对变量值为
Variant
的变量值调用ToString
方法。由于它不支持后期绑定(以及其他序数变体类型),因此会出现异常。
要将变量值转换为字符串,请使用varByte
。