Delphi - 将赋值延迟到out参数

时间:2013-04-02 16:40:27

标签: delphi pointers rtti out

在Delphi中,假设我有一个带有(大大简化)签名的方法,如下所示:

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 ++中,您可以通过在'&amp;'前面添加一个参数作为'引用'。所以在C ++术语中,这可能大致定义为:

procedure abc( arg1 : TValue; &arg2 : TValue );

稍后,您可以参考&amp; arg2,并使用指针对象。但是在调用函数时,你只需说:

abc( somevar1, somevar2 );

somevar1按值传递,somevar2按引用传递。在函数内部,我可以将somevar2保存在引用var中,然后通过指针(如果它是一个字符串)通过说&amp; arg2ref ='abc'为它分配一个值。

我猜测在Delphi中有一种方法可以使用Variant作为oVar类型,或使用RTTI或其他方法。我还没有弄清楚这些神奇的组合。 (我只是不经常在Delphi中使用指针。)

也许我需要在oVar中保存一个原始指针以及类型(例如,oType),并通过指针输出一个值来保存属性的值?

我希望这里有人可能有一些明确的想法。

BTW,我正在使用Delphi XE3。

1 个答案:

答案 0 :(得分:3)

使用指针。它不必(实际上也不应该)是“原始”指针。使用类型指针PValue。将PValue传递给您的函数,然后将其存储在oVal中,您还应该声明一个PValue。使用@创建指针,使用^取消引用。

我不建议通过引用传递arg2。尽管您仍然可以使用@来获取指向传递给abc的原始变量的指针,但引用参数掩盖了变量需要无限期保持可用的事实。相反,将arg2声明为PValue,以便调用者更明显地涉及间接。

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

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