2013-04-02 22 views
2

在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。

回答

3

使用指針。它不必(也不應該)是一個「原始」指針。使用鍵入的指針,PValue。將PValue傳遞給您的函數,然後將其存儲在oVal中,您還應該聲明PValue。使用@來創建指針,並使用^來解除引用。

我不建議通過引用傳遞arg2。雖然你仍然可以使用它@獲取一個指針傳遞給abc原始變量,參考參數掩飾的變量需要保持可用無限期的事實。相反,將arg2聲明爲PValue,因此對於調用者來說,間接參與更爲明顯。

// declaration 
procedure abc(...; arg2: PValue); 

// call 
abc(..., @somevar2); 
+0

那麼簽名和調用與PValue是什麼樣子? 所有這些變量的範圍相對有限的 - 有時只是在過程中的幾行,有時十幾或二。我並不關心參考文獻的壽命,儘管它很好理解。 –

+0

我不清楚在這種情況下使用@和^的位置。 –

+0

最終目標分配通常看起來像這樣: ARG^.oVar:= aProp.GetValue(THISFORM); aProp是一個TValue。如果它是一個PValue,我怎麼把它變成oVar? –