| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Как древовидно визуализировать ArrayOfRecord в VT |
| Автор: Sheleh 21.4.2011, 18:38 | ||||||
Здравствуйте, помогите пожалуйста визуализировать линейную структуру Objects: array of Tobjects;:
В этой структуре иерархия объектов задается полями ID (собственный индекс) и ParentID (индекс родителя, которому принадлежит объект). Например:
На данный момент я заполняю VT по примеру обычным списком без иерархии
А как при заполнении зная индекс родителя ParentID сфокусировать родительский node по ID, что бы вставить от него Child Node. Надеюсь я ясно выразился ) За ранее спасибо! |
| Автор: cat512 21.4.2011, 21:37 | ||||
Пожалуйста, заранее.
Абсолютно не ясно. |
| Автор: Sheleh 22.4.2011, 08:33 | ||||
Ладно, попробую еще раз по порядку. Есть массив записей - Objects: array of Tobjects; Запись содержит текстовые поля: Tobjects = record ID, ParentID, Name, Num, Time: string; с примерно следующим содержанием: 1;0;Radius;R001;40648.1033536806 2;1;Tr;0116;40648.5782788079 3;1;Tr;0000;40648.5796839699 4;3;Dev;C;40648.5796839699 5;3;Dev;1;40648.5764067014 6;5;Sh;1;40648.5733965394 7;1;Tr;0091;40648.5737310995 Казалось бы простой масиив строк, но здесь есть ирархия. Каждая запись имеет собственный ID и ParentID - это ID родителя, к которому она относится. Для наглядности вот те же самые данные в древовидной форме.
как это можно древовидно отобразить в VT? |
| Автор: MetalFan 22.4.2011, 11:38 |
| Предлагаю сделать парсер с загрузкой данных в объектную структуру, а затем уже сделать отображение структуры в VT - как два байта переслать. Хотя конечно можно и сразу в VT грузить. Примерный алгоритм: 1. Читаем запись, разбираем поля, смотрим ParentID, 2. ищем нод в дереве с ID=ParentID 3. Если нашли, то добавляем ему ребенка с данными из п.1 4. Если не нашли, то или пропускаем, или добавляем в корень. Но лучше сделать загрузку объектной модели, которую затем отражать в VT используя все его прелести с OnInitNode/OnInitChildNodes |
| Автор: Sheleh 23.4.2011, 12:04 | ||
| MetalFan, я в этом новичок, в какую именно объектную структуру (TObjects?) можно это загрузить, и какие это даст плюсы, кроме простоты отображения в VT. Плюс моей структуры, как мне кажется, это простота доступа к каждому объекту по его ID в независимости в корне объект, или глубокой вложенности, безо всяких рекурсивных поисков. Да и вложенность в моем случае нужна больше для наглядности при отображении, в программе же это должно выглядеть как список объектов.
2. ищем нод в дереве с ID=ParentID - а в дереве ли мы ищем? Как искать в дереве VT, если в нем только поинтеры, там же нет ID? Перекурил всю статью, но так и не нашел, где в VT хранятся ноды, и как к ним обращаться по индексу. |
| Автор: cat512 24.4.2011, 03:33 | ||
| Эта задача формулируется просто - "Загрузить древовидную структуру данных в Тривью". Реализуется она с помощью алгоритма динамически расширяемого дерева. Строится рекур. функия типа
Ну а после, уже можно оптимизировать. Надеюсь, как адаптировать код к VirtualTreeView разберёшься сам |
| Автор: Sheleh 27.4.2011, 03:44 | ||
Всем спасибо, в итоге получилось следующее (код ниже). Для удобства реализации я добавил в свою запись два вара - ссылка на свой нод в VT, и таг, по которому определяется, была ли запись уже отображена в дереве.
Из недостатков - код зацикливается, если у объекта нет родителя. |