在Delphi中,假設我有一個像這樣的(很簡單)簽名的方法:德爾福 - 推遲分配給OUT參數
procedure abc(const prop1:string; const arg1:TValue; const prop2:string;
out arg2:TValue);
我使用的是建立一個從TList <PPropValPair>的記錄是這樣提供的參數:
type
TPVPType = (ptIn, ptOut);
PPropValPair = ^TPropValPair;
TPropValPair = record
io : TPVPType;
prop : string; // property name
iVal : TValue; // input value
oVar : Variant; // <-- how to save for later use??? Variant? TValue?
end;
(在它的面前,這個例子看起來很傻再次,這是相當簡化的只是溝通的問題。)
在運行時,我想將所有輸入值ival(其中io = ptIn)填充到類中的每個公共屬性'prop'中,調用類方法,然後提取所有公共屬性'prop'的值(其中io = ptOut)轉換成oVar。
輸入側使用RTTI正常工作。
不過,我需要以某種方式保存參考OVAR輸出增值經銷商,所以我可以保存相關的屬性值的類方法被調用後。
我沒有直接給arg2分配任何東西。相反,我保存了對arg2的引用,並稍後間接分配值。
訣竅是......我不想要做的輸出參數的任何附加的註釋在ABC(...)。
在C++中,可以通過與「&」前面加上它聲明一個參數作爲「參考」。因此,在C++來說,這可能是一個粗略的定義:
procedure abc(arg1 : TValue; &arg2 : TValue);
後來,你可以參考& ARG2和它使用一個指向對象。但是在調用函數時,您只需說:
abc(somevar1, somevar2);
somevar1通過值傳遞,somevar2通過引用傳遞。在函數內部,我可以將somevar2保存在引用變量中,然後通過指針& arg2ref ='abc'通過指針(如果它是字符串)爲其賦值。
我猜想有一種方法可以在Delphi中做到這一點,無論是作爲oVar類型的變體,還是使用RTTI或其他。我還沒有弄清楚這些魔術的組合。 (我只是不經常在Delphi中使用指針)。
也許我需要將一個原始指針與類型(比如oType)一起保存到oVar中,並通過指針保存該屬性的值?
我希望有人在這裏可能有一些明確的想法。
順便說一句,我用Delphi XE3。
那麼簽名和調用與PValue是什麼樣子? 所有這些變量的範圍相對有限的 - 有時只是在過程中的幾行,有時十幾或二。我並不關心參考文獻的壽命,儘管它很好理解。 –
我不清楚在這種情況下使用@和^的位置。 –
最終目標分配通常看起來像這樣: ARG^.oVar:= aProp.GetValue(THISFORM); aProp是一個TValue。如果它是一個PValue,我怎麼把它變成oVar? –