在 Delphi 10.3中,我写了一些Excel自动化代码。我使用了变量。当例程完成后,我清除并freeAndNil变量…
VarClear(arrData);
FreeAndNil(arrData);
这编译和运行良好。我刚刚升级到D11,即。 Alexandria 此代码现在给出一个错误。...不兼容类型:TObject和Variant。
我将这部分代码重写为:
VarClear(arrData);
arrData.Free;
这编译,乍一看,似乎运行良好。这是正确的方式来清除/处置变种在 Alexandria ?
3条答案
按热度按时间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()
aVariant
是错误的。这从来没有起过作用,而且一开始就不应该出现在你的代码中。在旧的定义下,FreeAndNil()
会在Variant
上调用TObject.Free()
,这是错误的。在您的新代码中,arrData.Free;
将编译,但将在运行时调用方法调度来调用Excel对象上不存在的Free()
方法,这将失败。所以,只要完全删除
Free
,它不属于这里。在所有 Delphi 版本中,手动将Variant
重置为默认状态的正确解决方案是将Variants.Null
或Variants.Unassigned
分配给它,例如:vkc1a9a22#
这两段代码都是错误的。你不能在一个变量上调用
Free
。在对象示例上调用Free
。只要把那条线去掉。bejyjqdl3#
如果变量是指针数组FreeAndNil不是解决方案。但是自由人