Delphi 11中的变体行为有变化吗?

6mzjoqzu  于 2023-05-17  发布在  其他
关注(0)|答案(3)|浏览(142)

在 Delphi 10.3中,我写了一些Excel自动化代码。我使用了变量。当例程完成后,我清除并freeAndNil变量…

VarClear(arrData);
  FreeAndNil(arrData);

这编译和运行良好。我刚刚升级到D11,即。 Alexandria 此代码现在给出一个错误。...不兼容类型:TObject和Variant。
我将这部分代码重写为:

VarClear(arrData);
  arrData.Free;

这编译,乍一看,似乎运行良好。这是正确的方式来清除/处置变种在 Alexandria ?

91zkwejq

91zkwejq1#

FreeAndNil()的签名确实在 Delphi 10.4中被更改了,确切地说:
https://blog.marcocantu.com/blog/2020-may-delphi-104-rtl.html
我们更新了FreeAndNil过程的签名,以避免其与接口引用和其他不支持的数据类型一起使用。现在声明它需要对TObject的引用:
procedure FreeAndNil(const [ref] Obj: TObject); inline;

**这意味着FreeAndNil的不正确使用现在会导致编译器错误。**在过去,不正确的使用不会被捕获,导致困难的bug。请注意,尽管参数被声明为const,但引用变量确实被修改了。

首先,尝试Free() a Variant是错误的。这从来没有起过作用,而且一开始就不应该出现在你的代码中。在旧的定义下,FreeAndNil()会在Variant上调用TObject.Free(),这是错误的。在您的新代码中,arrData.Free;将编译,但将在运行时调用方法调度来调用Excel对象上不存在的Free()方法,这将失败。
所以,只要完全删除Free,它不属于这里。在所有 Delphi 版本中,手动将Variant重置为默认状态的正确解决方案是将Variants.NullVariants.Unassigned分配给它,例如:

arrData := Null;
arrData := Unassigned;
vkc1a9a2

vkc1a9a22#

这两段代码都是错误的。你不能在一个变量上调用Free。在对象示例上调用Free。只要把那条线去掉。

bejyjqdl

bejyjqdl3#

如果变量是指针数组FreeAndNil不是解决方案。但是自由人

FreeMem(PSomeArray);

相关问题