此代碼無法編譯(在 Delphi 7 和 Delphi XE2 上),并給出錯誤訊息“需要 E2036 變數”。但是如果我將“物件”更改為“記錄”,那么它在 Delphi XE2 上編譯得很好,因為它具有高級記錄。我想在 Delphi 版本之間撰寫可移植的代碼,并在 D7 上使用“物件”,在 XE2 上使用 IFDEF 使用“記錄”,但在這種情況下看起來不可能。我錯了,還是這是一個真正的編譯器錯誤?
type
TD = String;
TC = object
public
V: String;
function D: TD;
end;
TB = object
public
V: String;
function C: TC;
end;
TA = object
public
V: String;
function B: TB;
end;
function TC.D: TD; begin end;
function TB.C: TC; begin end;
function TA.B: TB; begin end;
procedure Test;
var
A: TA;
s: string;
begin
s := A.V; // Ok
s := A.B.V; // Ok
s := A.B.C.V; // "E2036 Variable required", the cursor is between "C" and "."
end;
感謝大家的快速回應。令人驚訝的是,幾分鐘后我找到了解決方法。“物件”必須至少有一個虛擬方法(并且它的大小不能為零,所以它必須有一個資料欄位,但它不必像“V:字串”那樣是托管型別)。如果定義了 HAS_ADVANCEDRECORD,這段丑陋的代碼可以在 Delphi 7 和 Delphi XE2 上編譯。
{.$define HAS_ADVANCEDRECORD}
type
TE = String;
TD = {$ifdef HAS_ADVANCEDRECORD}record{$else}object{$endif}
public
V: String;
function E: TE; {$ifndef HAS_ADVANCEDRECORD}virtual;{$endif}
end;
TC = {$ifdef HAS_ADVANCEDRECORD}record{$else}object{$endif}
public
V: String;
function D: TD; {$ifndef HAS_ADVANCEDRECORD}virtual;{$endif}
end;
TB = {$ifdef HAS_ADVANCEDRECORD}record{$else}object{$endif}
public
V: String;
function C: TC; {$ifndef HAS_ADVANCEDRECORD}virtual;{$endif}
end;
TA = {$ifdef HAS_ADVANCEDRECORD}record{$else}object{$endif}
public
V: String;
function B: TB; {$ifndef HAS_ADVANCEDRECORD}virtual;{$endif}
end;
function TD.E: TE; begin end;
function TC.D: TD; begin end;
function TB.C: TC; begin end;
function TA.B: TB; begin end;
procedure Test;
var
A: TA;
s: string;
begin
s := A.V; //* Ok
s := A.B.V; //* Ok
s := A.B.C.D.E; //* Solved: "E2036 Variable required"
end;
其實我想玩一個流暢的語法sql查詢構建器,高級記錄比TObject有優勢。也就是說,它們不需要終身管理。一個自然的解決方案是在這里使用介面,但我總是遇到麻煩。
我想,更值得提高我對介面的了解......
uj5u.com熱心網友回復:
這是一個錯誤。您可以提交錯誤報告,該報告至少可以記錄它。但是,我嚴重懷疑 Embarcadero 是否會投入更多資源來修復它,并且無論如何這都不會幫助您使用舊版本的 Delphi。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/357948.html
上一篇:從Json物件創建陣列
