2

在 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 工作正常。

但是,我需要以某种方式将 REFERENCE 保存到 oVar 中的输出变量,以便在调用类方法后保存关联属性的值。

我没有直接为 arg2 分配任何东西。相反,我保存了对 arg2 的引用并稍后间接分配该值。

诀窍是......我不想对 abc(...) 中的输出参数做任何额外的注释。

在 C++ 中,您可以通过在参数前面加上“&”来将参数声明为“引用”。因此,在 C++ 术语中,这可能大致定义为:

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

稍后,您可以参考 &arg2 ,它使用指向对象的指针。但是在调用该函数时,您只需说:

abc( somevar1, somevar2 );

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

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

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

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

顺便说一句,我正在使用 Delphi XE3。

4

1 回答 1

3

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

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

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

// call
abc(..., @somevar2);
于 2013-04-02T16:55:07.307 回答