![]() |
|
|
![]()
|
|
| Гость_Игорь |
|
|||
|
Unregistered |
как получить сабж для заданного узла?
|
|||
|
||||
| BreakPointMAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 6 Всего: 24 |
Воспользоваться свойствами Count и Item, которые есть у любого объекта типа TTreeNode*, то бишь узла. Пробежаться в цикле по ним, вот и все. Если нужно получить список всех дочерних узлов какого-то узла, их дочерних узлов и т.д. - то сделать это рекурсивно. Например, следующая функция подсчитывает, сколько ВСЕГО потомков у переданного в качестве параметра узла:
-------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
|||
|
||||
| =Женек= |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 548 Регистрация: 20.2.2005 Репутация: 1 Всего: 1 |
О! А я тоже с деревом работаю. А как то же самое сделать для корневых узлов?
У меня есть огромный список строк типа ftp://192.168.51.250/PRILOG/AVR Tools/aStudio4b401.exe И я хочу их этого списка построить дерево - то есть строка разбивается по слешам, и каждый элемент сравнивается с деревом - если в данном узле есть такое имя, то добавление идет в него, если нет, то создается новый узел. Тут на форуме писали уже про списко корневых узлов - мол надо пробежаться по всеу дереву и если Level=0 то значит корень. Однкао представьте себе как обрабатывать такий список если в нем десятки тысяч строк? Короче из вышеописанной строки получен массив AnsiString [0]=192.168.51.250?, [1]=PRILOG, [2]=AVR Tools, [3] aStudio.exe. Я ни кого не хочу просить решать за меня задачу, но как бы вы написали такую функцию? |
|||
|
||||
| =Женек= |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 548 Регистрация: 20.2.2005 Репутация: 1 Всего: 1 |
Другими словами - как бы получить ссылоку на самый-самый верхний виртуальный узел, содержащий все корневые узлы, чтобы потом их через Node->Item[i]....
|
|||
|
||||
| BreakPointMAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 6 Всего: 24 |
А такой вариант не подойдет? -
Твои корневые узлы сместить на один уровень вниз, сделав их дочерними узлами некоторого настоящего корневого узла TTreeNode* Root. Тогда ты сможешь получить доступ к любому из этих (твоих бывших корневых) узлов , пользуясь свойством Item узла Root с некоторым индексом (максимальное значение которого на 1 меньше значения Count узла Root). Это сообщение отредактировал(а) BreakPointMAN - 6.11.2005, 14:52 -------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
|||
|
||||
| =Женек= |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 548 Регистрация: 20.2.2005 Репутация: 1 Всего: 1 |
Кривоватое решение.
А я сделал вот так
|
|||
|
||||
| =Женек= |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 548 Регистрация: 20.2.2005 Репутация: 1 Всего: 1 |
Когда напишу функцию создания дерева по списку файлов обязательно здесь ее выложу. Думаю многим будет полезно.
|
|||
|
||||
| Artemon |
|
|||
|
а ты мне нравишься ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1771 Регистрация: 24.2.2004 Где: Челябинск Репутация: 7 Всего: 20 |
А как на счет такого:
Создаешь вектор указателей на узлы и заносиш их в вектор, и если надо то обращаешься к вектору -------------------- Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru |
|||
|
||||
| =Женек= |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 548 Регистрация: 20.2.2005 Репутация: 1 Всего: 1 |
Для чего? Вектор - массив. У нас уже есть невидимый массив - в теле класса TTreeView. Зачем параллельный массив нужен?
|
|||
|
||||
| Artemon |
|
|||
|
а ты мне нравишься ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1771 Регистрация: 24.2.2004 Где: Челябинск Репутация: 7 Всего: 20 |
Если в векторе будут содержаться только указатели на корневые узлы, то ты именно этого и добьёшься, Node->Item[i] < =====> mas[i] Это сообщение отредактировал(а) Artemon - 7.11.2005, 11:00 -------------------- Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru |
|||
|
||||
| =Женек= |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 548 Регистрация: 20.2.2005 Репутация: 1 Всего: 1 |
Artemon
представь себе - 50 000 файлов. И для каждого фала нужно осуществить перебор всех элементов дерева, число которых в зависимости от итерации будет от 0 до 50 000. Внимательней надо читать, товарищ! Я же написал про функцию getNextSibling() - с ней все гораздо быстрее. |
|||
|
||||
| Artemon |
|
|||
|
а ты мне нравишься ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1771 Регистрация: 24.2.2004 Где: Челябинск Репутация: 7 Всего: 20 |
Да я ведь только альтернативу предлагаю, наше дело предложить ваше отказаться.
-------------------- Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru |
|||
|
||||
| Vyacheslav |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Я может чего и не понял, но это разве не подходит?
-------------------- С уважением, Вячеслав Ермолаев |
||||
|
|||||
| BreakPointMAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 6 Всего: 24 |
Vyacheslav, см. пост #6, там как раз и используется метод getNextSibling().
-------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
BreakPointMAN см. пост #6, там как раз и используется TopItem Разницу между TopItem и Items->GetFirstNode() надеюсь разъяснять не надо? -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Это во-первых.
Во-вторых. Имеем первоначальную инициализацию итератора, условие выхода и переход на следующую итерацию. Чем это реализуется в С++. Правильно циклом for(;;),использование котрого предпочтительнее других. В-третьих, см пост #6. Даже при частном случае, когда использование TopItem даст правильный результат, все равно имеется ошибка. Ни при каких условиях самая первая нода не попадет в вектор. Ну а если не вдаваться в эти "мелочи", то конечно мой код повторяет код поста #6 -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| BreakPointMAN |
|
||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 6 Всего: 24 |
Ну почему же? Можно и так:
А так попадет. Хотя, с for'ом, конечно, покомпактнее... -------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
||||||||
|
|||||||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |