【问题标题】:Recursive read of TCollectionTCollection 的递归读取
【发布时间】:2011-04-28 11:53:00
【问题描述】:

我不擅长递归,以前从未使用过它。我知道它的理论.. 没有帮助:)) 对于我的问题,我有一个包含 TCollection 和 TCollectionItem 等的 TCollection 结构。我必须编写一个递归函数来读取我所有的 TCollectionItems。 这是图形视图:

TCollection->TCollectionItem(s)->TCollection->TCollectionItem(s)

TCollection 下可以有 1 个甚至 2,3 个 TCollection,或者没有。

这里还有几个例子:

TCollection->TCollectionItem

TCollection->TCollectionItem->TCollection->TCollectionItem->TCollection->TCollectionItem

等等..

如果我描述的问题不好,请告诉我,我可能做过..如果有不清楚的地方,请询问:)

感谢支持!

【问题讨论】:

  • 方法原型迭代 TCollection ?
  • 如何知道一个 TCollectionItems 拥有一个 TCollection ?
  • TCollectionItems 拥有一个 TCollection,如果它的 Count 属性大于 0。
  • TCollectionItem 没有 Count 属性,即使有,如果 TCollectionItem 拥有自己的子 TCollection 对象,它也不会增加。
  • TCollection 有属性 Count,而不是 TCollectionItem

标签: c++ recursion tcollection tcollectionitem


【解决方案1】:

递归访问子 TCollection 对象的唯一方法是使用 VCL 的 RTTI 信息,而不知道拥有的 TCollectionItem 对象的类类型以便对它们进行类型转换。

在 XE 之前的 C++Builder 版本中,基于 VCL 的 RTTI 仅适用于 __published 属性。给定一个TCollectionItem(或任何通用TObject)对象指针,您可以使用TypInfo.hpp 中声明的GetPropList() 函数来检索该对象的已发布属性信息列表。然后,您可以遍历该列表,检查报告 TypeKind 值为tkClass 的任何属性。当您找到一个时,使用GetObjectProp() 函数检索该属性的TObject 指针值,然后使用dynamic_cast 确保它确实是一个TCollection 对象,然后再访问它的子TCollectionItem 对象。

在 C++Builder 2010 中,引入了一个新的增强型 RTTI 系统,在 Rtti.hpp 中声明,它为类的所有成员提供信息,包括未发布的属性和字段。使用此增强的 RTTI,子 TCollection 不再需要声明为 __published 属性。在此系统下,您将使用TRttiContext 类访问TRttiType 对象作为递归的起始TCollectionItem 对象,然后使用TRttiType::GetFields()TRttiType::GetProperties() 方法查找子TRttiFieldTRttiProperty报告 TypeKind 为 tkClass 的项目,然后使用 TRttiField::GetValue()TRttiProperty::GetValue() 方法获取 TObject 对象指针,该指针可以类型转换为带有 dynamic_castTCollection 指针。

【讨论】:

    【解决方案2】:

    您尚未指明 TCollection 方法的原型,以便枚举和读取您的 TCollectionItem 以及其他需要的详细信息。

    但是,这绝对可以通过:The Composite Design Pattern 解决。

    此模式的目的是遍历递归形式,并将对复合的调用转发到其复合体上,依此类推,直到到达叶子(在您的情况下 TCollectionItems 具有空的 TCollection)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      • 2016-03-07
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      • 2020-04-07
      相关资源
      最近更新 更多