在 Delphi 10.3 中,我撰寫了一些 Excel 自動化代碼。我使用了變體。例程完成后,我清除并釋放了 Variant 的 AndNil ......
VarClear(arrData);
FreeAndNil(arrData);
這編譯并運行良好。我剛剛升級到 D11,即 Alexandria。此代碼現在給出錯誤。... 不兼容的型別:TObject 和 Variant。
我將這部分代碼重寫為:
VarClear(arrData);
arrData.Free;
這編譯,乍一看,似乎運行良好。這是在亞歷山大清除/處理變種的正確方法嗎?
uj5u.com熱心網友回復:
這兩個代碼片段都是錯誤的。您不會呼叫Free變體。你呼叫Free一個物件實體。只需洗掉該行。
uj5u.com熱心網友回復:
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()a是錯誤的Variant。這也從來沒有作業過,并且應該永遠不會已經在你的代碼擺在首位。在舊的定義,FreeAndNil()會叫TObject.Free()上了Variant,這是不對的。在您的新代碼下,arrData.Free;將編譯,但將在運行時呼叫方法調度以呼叫Free()Excel 物件上不存在的方法,這將失敗。
所以,干脆去掉Free,它不屬于這里。在所有 Delphi 版本中,手動將 a 重置Variant為默認狀態的正確解決方案是分配Variants.Null或分配Variants.Unassigned給它,例如:
arrData := Null;
arrData := Unassigned;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/408508.html
標籤:
