代码之家  ›  专栏  ›  技术社区  ›  krizajb

收集的递归读取

  •  1
  • krizajb  · 技术社区  · 15 年前

    我不擅长递归,以前从没用过。我知道这个理论。。对于我的问题,我有一个包含TCollection和TCollectionItem等的TCollection结构。。我必须编写一个递归函数来读取我所有的TCollectionItems。

    收集->收集项->收集->收集项

    收集可以有1个甚至2,3个收集在他下面或没有。

    下面是几个例子:

    收集->收集项目

    等。。

    请告诉我,如果我把这个问题描述得不好,我可能是。。如果有不清楚的地方,请询问:)

    谢谢你的支持!

    2 回复  |  直到 14 年前
        1
  •  1
  •   Stephane Rolland    15 年前

    您还没有指出TCollection方法的原型,以便枚举和读取TCollectionItems以及其他所需的详细信息。

    然而,这一问题的解决方法是: The Composite Design Pattern .

        2
  •  1
  •   Remy Lebeau    15 年前

    递归访问子级的唯一方法 TCollection TCollectionItem 对象以便您可以对其进行类型转换,即使用VCL的RTTI信息。

    在XE之前的C++ Builder版本中,VCL的RTTI仅适用于 __published 财产。给予 收集项目 (或任何将军 TObject GetPropList() 在中声明的函数 TypInfo.hpp 检索该对象的已发布属性信息的列表。然后可以循环查看该列表,检查是否有任何属性报告TypeKind值为 tkClass . 当你找到一个,使用 GetObjectProp() 函数来检索该属性的 托宾 指针值,然后使用 dynamic_cast 以确保它真的是 收集 在访问其子对象之前 物体。

    Rtti.hpp ,它为类的所有成员提供信息,包括未发布的属性和字段。有了这个增强的RTTI,一个孩子 不需要声明为 __出版 财产了。在这个系统下,您可以使用 TRttiContext 类访问 TRttiType 收集项目 对象,然后使用 TRttiType::GetFields() TRttiType::GetProperties() 寻找孩子的方法 TRttiField TRttiProperty 报告类型为 TK类 TRttiField::GetValue() TRttiProperty::GetValue() 获取 托宾 收集 动态铸造 .

    推荐文章