gpt4 book ai didi

delphi - 如何获取访问该 Variant 的 Delphi 6 索引属性的基础原始 Variant 值?

转载 作者:行者123 更新时间:2023-12-03 15:58:34 26 4
gpt4 key购买 nike

我有一个 Delphi 6 类对象,其中包含 30 个变体的数组,每个变体都通过不同的索引属性公开。例如:

property responseCode: integer
Index 7 read getIndexedProperty_integer write setIndexedProperty_integer;

我这样做是为了更轻松地使用变体数组(帮助 IDE 自动完成)并提供类型安全。它工作得很好,但现在我有一个皱纹。当构造包装它的类时,Variants 数组被初始化为 NULL,因此我可以判断是否曾经使用值实例化过特定变体。这样做的结果是,如果仅实例化某些变体(给定有效值),则当 Delphi 尝试将变体转换为由索引属性。

我宁愿不为每个索引属性声明一个“isValid”属性。我想知道是否有一种方法可以使用 TypeInfo 库来获取底层 Variant 的原始值,而不必直接访问索引属性,从而触发转换异常。然后我可以编写如下代码(使用上面的示例属性):

isValidProperty(responseCode);

如果responseCode 属性的Variant 不为NULL,则该函数将返回TRUE;如果为NULL,则该函数将返回FALSE。

我知道我可以遍历该类的 PPropList 属性列表并按名称访问属性,但随后我必须使用如下代码:

isValidProperty('responseCode');

并以字符串形式传递属性名称,而不是像上面第一个 isValidProperty() 那样直接传入属性。有办法做到这一点吗?

最佳答案

因此,您希望“获取基础 Variant 的原始值,而不必直接访问索引属性,从而触发转换异常”。只要您可以访问底层变体本身,就可以。您很可能需要更改容器类本身。

来自the Delphi XE2 help page on variant types :

The standard function VarType returns a variant's type code. The varTypeMask constant is a bit mask used to extract the code from VarType's return value, so that, for example,

VarType(V) and varTypeMask = varDouble

returns True if V contains a Double or an array of Double. (The mask simply hides the first bit, which indicates whether the variant holds an array.) The TVarData record type defined in the System unit can be used to typecast variants and gain access to their internal representation.

您应该能够结合使用此处提到的方法和记录来查找有关变体内部数据的任何信息,包括它是否为 NULL 变体,以及直接访问它。

(这个系统对我来说似乎有点狡猾的设计:它似乎不是一个非常类型安全的实现......请参阅上面我的评论。我认为基于您期望的值的实际类型的设计可能会更安全。但是,这会让你实现你的目标。)

关于delphi - 如何获取访问该 Variant 的 Delphi 6 索引属性的基础原始 Variant 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9028839/

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