gpt4 book ai didi

delphi - 将 ToString 用于 Variant 变量

转载 作者:行者123 更新时间:2023-12-05 02:07:16 25 4
gpt4 key购买 nike

以下代码产生一个EVariantInvalidOpError异常:

var
i : Variant;
begin
i := 10;
ShowMessage(i.ToString());
end;

Picture displaying the "Invalid variant operation" exception dialog

以下所有工作正常,但我不明白为什么 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 COM technology 相关)。 IDispatch 的实例通过 GetTypeInfoCountGetTypeInfo 方法提供有关其方法和属性的信息。您可以使用其 GetIDsOfNames 方法按名称查询信息。

让我们先回答您评论中的问题:

Why does Delphi allow me to use the ToString function even if there is no helper implementing such function for the Variant type?

这就是 Delphi 实现称为 late binding 的概念的方式.它允许您调用编译时类型未知的对象的方法。这个工作的先决条件是底层变体类型支持后期绑定(bind)。 Delphi 内置了对 varDispatchvarUnknown 变体的后期绑定(bind)支持,这可以在单元 System.Variants 中的过程 DispInvokeCore 中看到

I don't understand why the ToString function raises exception for Variant type variables.

如上所述,在运行时,您的程序会尝试对变量值调用 ToString 方法,在您的例子中,变量值是 varByte 类型。由于它不支持后期绑定(bind)(以及更多的序数变体类型),您会遇到异常。

要将变量值转换为字符串,请使用 VarToStr .

下面是一个使用 Microsoft Speech API 进行后期绑定(bind)的简单示例:

uses
Winapi.ActiveX,
System.Win.ComObj;

var
Voice: Variant;
begin
CoInitialize(nil);
try
Voice := CreateOleObject('SAPI.SpVoice');
Voice.Speak('Hello, World!');
finally
CoUninitialize;
end;
end.

关于delphi - 将 ToString 用于 Variant 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61950339/

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