Delphi - 推迟对输出参数的赋值

标签 delphi pointers rtti out

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

procedure abc( const prop1:string; const arg1:TValue; const prop2:string; 
  out arg2:TValue );

我正在使用提供的参数构建这样的记录 TList:

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)填充到类中的每个公共(public)属性“prop”中,调用类方法,然后提取所有公共(public)属性“prop”的值'(其中 io=ptOut)到 oVar 中。

输入端使用 RTTI 工作正常。

但是,我需要以某种方式保存对 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。

最佳答案

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

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

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

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

关于Delphi - 推迟对输出参数的赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15769580/

相关文章:

delphi - 如何使用 TypInfo RTTI 方法为子属性项设置值?

delphi - 在没有焦点的情况下滚动 RichEdit

Delphi TWebBrowser 内存泄漏

android - FireDac Firebird 和 Android

C 根据带指针的字符串输入打印特定字符

c++ - 在C++中如何将shared_ptr变量push_back到shared_ptrs vector ?

android - Delphi - 如何初始化字符串的 TArray?

c - int *p = (int*) 60 是什么意思?

C++ 在运行时检查函数签名是否存在?

delphi - 如何在运行时设计器中隐藏继承的已发布属性?