Единственный способ рекурсивного доступа к дочерним TCollection
объектам, не зная типов классов владеющих TCollectionItem
объектов, чтобы вы могли их приводить, - использовать информацию RTTI VCL.
В версиях C ++ Builder до XE RTTI на основе VCL доступна только для __published
свойств. Имея указатель объекта TCollectionItem
(или любой общий TObject
), вы можете использовать функцию GetPropList()
, объявленную в TypInfo.hpp
, для получения списка информации об опубликованных свойствах этого объекта. Затем вы можете перебрать этот список, проверяя любые свойства, которые сообщают значение TypeKind tkClass
. Когда вы найдете его, используйте функцию GetObjectProp()
, чтобы получить значение указателя TObject
этого свойства, а затем используйте dynamic_cast
, чтобы убедиться, что это действительно объект TCollection
, прежде чем вы получите доступ к его дочерним объектам TCollectionItem
.
В C ++ Builder 2010 была представлена новая усовершенствованная система RTTI, объявленная в Rtti.hpp
, которая предоставляет информацию для всех членов класса, включая неопубликованные свойства и поля. Благодаря этому расширенному RTTI дочерний элемент TCollection
больше не нужно объявлять как свойство __published
. В этой системе вы будете использовать класс TRttiContext
для доступа к объекту TRttiType
для начального объекта TCollectionItem
вашей рекурсии, а затем использовать методы TRttiType::GetFields()
и TRttiType::GetProperties()
для поиска дочерних TRttiField
и TRttiProperty
элементы, которые сообщают TypeKind tkClass
, затем используют методы TRttiField::GetValue()
и TRttiProperty::GetValue()
, чтобы получить указатель объекта TObject
, который может быть приведен к типу к указателю TCollection
с dynamic_cast
.