在Delphi 10.3中,我编写了一些Excel自动化代码。我使用了变体。当例程完成后,我清除并释放了 AndNil 变体......
VarClear(arrData);
FreeAndNil(arrData);
Run Code Online (Sandbox Code Playgroud)
这编译并运行良好。我刚刚升级到D11,即亚历山大。这段代码现在给出了一个错误。...不兼容的类型:TObject 和 Variant。
我将这部分代码重写为:
VarClear(arrData);
arrData.Free;
Run Code Online (Sandbox Code Playgroud)
这个编译,乍一看,似乎运行良好。这是清除/处置亚历山大变体的正确方法吗?
Rem*_*eau 15
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 的错误使用现在将导致编译器错误。过去,错误的使用不会被捕获,从而导致困难的错误。请注意,虽然参数被声明为 const,但引用变量确实被修改了。
一开始就尝试Free()这样做是错误的。Variant这从来没有起作用,而且一开始就不应该出现在你的代码中。根据旧的定义,FreeAndNil()会调用TObject.Free(),Variant这是错误的。在您的新代码下,将进行编译,但会在运行时调用方法分派来调用Excel 对象上arrData.Free;不存在的方法,这将失败。Free()
因此,只需将其Free完全删除即可,它不属于这里。在所有 Delphi 版本中,手动将 a 重置为默认状态的正确解决方案Variant是分配Variants.Null或Variants.Unassigned给它,例如:
arrData := Null;
Run Code Online (Sandbox Code Playgroud)
arrData := Unassigned;
Run Code Online (Sandbox Code Playgroud)
这两个代码片段都是错误的。你不调用Free变体。您Free调用一个对象实例。只需删除该行即可。
| 归档时间: |
|
| 查看次数: |
513 次 |
| 最近记录: |