Я даже не хочу представить медлительность этого решения.
========================================================

аю, что все, кто когда-либо использовал Delphi VirtualStringTree, согласятся, что это отличный элемент управления. Это «виртуальный» элемент управления (ваши данные должны храниться где-то еще), поэтому я подумал, какая структура данных лучше всего подходит для такой задачи? ИМО, что структура данных должна поддерживать иерархию, она должна быть быстрой и легко расширяемой. Самой простой реализацией было бы использование записи, и это то, что предлагает большая часть документации, которую можно найти. Но что, если вам нужно сделать быстрый поиск, подсчитать итоги и т. Д.? Какую структуру данных вы используете вместе с VirtualStringTree?

**EDIT1**Я использую Delphi 2010

Хорошо, я постараюсь рассказать подробнее о моих требованиях. Размер данных может быть очень переменным, от 1 до тысяч элементов. Каждый элемент может содержать несколько строк, целочисленных значений. Мне нужен произвольный доступ, мои данные могут меняться много раз за время существования приложения. Хорошая производительность очень желательна. Мне также нужно сохранить данные и перезагрузить.

**EDIT2**: Получил 1 ответ, поэтому я постараюсь прокомментировать свое мнение. Спасибо, Дорин за твой ответ, но я не думаю, что твоя структура очень удобна. 1) Это не касается иерархии. 2) Наличие отдельных TStringList или TList для каждого узла не очень эффективно для IMO. С этой реализацией я могу только искать данные текущего узла, но не могу эффективно искать во всем дереве.

Я думаю, что эта структура данных должна быть похожа на дерево. У него должны быть узлы с возможностью добавления потомков. Тогда я мог бы просто получить данные узла в событии OnInitNode, проверить, есть ли у моего узла некоторые дочерние элементы, установить флаг ivsHasChildren, если это так, то в событии OnInitChildren установить правильное количество дочерних элементов. Позже в событии OnGetText я мог просто получить необходимые данные из структуры моего узла и установить для него значение CellText на основе индекса столбца. Моя идея состоит в том, чтобы иметь отдельную структуру данных и выполнять все необходимые операции с ней без необходимости использовать VirtualStringTree. Надеюсь, кто-то понял мою точку зрения :).

**EDIT3**Я нашел довольно интересный модуль JclTrees, который на первый взгляд может быть использован для достижения того, что я ищу. Это принадлежит[JCL](http://wiki.delphi-jedi.org/index.php?title=JEDI_Code_Library) библиотека. Отсутствие достойной документации затрудняет быстрое изучение его функциональности. Я, вероятно, посмотрю глубже, когда у меня будет больше времени.

 потому что данные ответы не решили мои проблемы, я написал свою собственную древовидную структуру данных, которая имитирует TVirtualStringTree и обрабатывает все проблемы, которые я упомянул в своем вопросе. Теперь я могу по желанию использовать только свою структуру данных, и все изменения в ней будут автоматически обновлять VirtualStringTree. Я думаю, что я загружу исходный код где-то позже и выложу ссылку здесь. Спасибо за ответы на все вопросы.

РЕДАКТИРОВАТЬ: Я загрузил источник в код Google:[svTrees](https://code.google.com/p/sv-utils/source/browse/trunk/svTrees/src/svCollections.Trees.pas), Есть небольшая демонстрация, которая показывает, как это работает.



 что вы там вкладываете, я бы предложил создать xsd, описывающий нужную вам структуру, и использовать мастер привязки данных XML для создания кода Delphi, который вы можете использовать.

Эта схема

даст вам эти интерфейсы для работы в Delphi

![]()

Интересное решение, но я не большой поклонник TXMLDocument из-за его внешних зависимостей.



Я предлагаю использовать записи (я не уверен, в какой версии Delphi они добавили методы для записей, я перешел с D7 на D2010), чтобы вы могли получить что-то вроде:

если ваша версия Delphi не поддерживает записи с методами и вам действительно нужны методы для узлов, тогда вам придется использовать объекты для достижения этой цели, а также взглянуть на дженерики.

Поскольку вам нужно будет хранить только несколько тысяч предметов, я предлагаю использовать дженерики (имхо не нужно заново изобретать колесо), т.е.

Теперь я предполагаю, что вы хотели бы сохранить все элементы из виртуального дерева и загрузить их позже, вы можете сделать это, определив свою собственную файловую структуру, т.е.

теперь вам нужно реализовать загрузку и сохранение, я предлагаю сохранить и загрузить с помощью TFileStream - очень просто,

псевдокод, извините, не время для частичного кода: - \
а) сохранение контента:

сохранить количество элементов в переменной TMyFileHeader и записать его в файл

для каждого элемента в дереве сохраните список целых чисел, сохраните список строк

б) загрузка контента:

читать заголовок файла - чтобы вы знали, сколько элементов нужно прочитать из файла

сделать для индекса: = 0 до подсчета -1 прочитать элемент из файла

Обратите внимание: что вы можете сохранить список строк из каждого элемента непосредственно в текущую позицию в потоке файла, однако было бы целесообразно сохранить его напрямую, используя:

Я надеюсь, что это поможет, фактическая реализация кода зависит от вас, получайте удовольствие!

это не решает проблему иерархии