gpt4 book ai didi

Delphi - 将分配延迟到输出参数

转载 作者:行者123 更新时间:2023-12-03 18:32:30 30 4
gpt4 key购买 nike

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

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

最佳答案

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

我不建议通过 arg2引用。虽然你仍然可以使用 @在它上面获得指向传递给 abc 的原始变量的指针,引用参数掩盖了变量需要无限期保持可用的事实。相反,声明 arg2PValue所以对调用者来说更明显的是涉及到间接性。

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

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

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

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com