Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TreeView - как получить список дочерних узлов 
:(
    Опции темы
Гость_Игорь
Дата 5.11.2005, 23:30 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











как получить сабж для заданного узла?
  Вверх
BreakPointMAN
Дата 6.11.2005, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: 6
Всего: 24



Воспользоваться свойствами Count и Item, которые есть у любого объекта типа TTreeNode*, то бишь узла. Пробежаться в цикле по ним, вот и все. Если нужно получить список всех дочерних узлов какого-то узла, их дочерних узлов и т.д. - то сделать это рекурсивно. Например, следующая функция подсчитывает, сколько ВСЕГО потомков у переданного в качестве параметра узла:
Код

int MyCount(TTreeNode* TN)
   {
    int count=TN->Count;
    for(int i=0; i<TN->Count; i++)
        count+=MyCount(TN->Item[i]);
    return count;
   }



--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
=Женек=
Дата 6.11.2005, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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. Я ни кого не хочу просить решать за меня задачу, но как бы вы написали такую функцию?

PM MAIL   Вверх
=Женек=
Дата 6.11.2005, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 548
Регистрация: 20.2.2005

Репутация: 1
Всего: 1



Другими словами - как бы получить ссылоку на самый-самый верхний виртуальный узел, содержащий все корневые узлы, чтобы потом их через Node->Item[i]....
PM MAIL   Вверх
BreakPointMAN
Дата 6.11.2005, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: 6
Всего: 24



А такой вариант не подойдет? -
Твои корневые узлы сместить на один уровень вниз, сделав их дочерними узлами некоторого настоящего корневого узла TTreeNode* Root. Тогда ты сможешь получить доступ к любому из этих (твоих бывших корневых) узлов , пользуясь свойством Item узла Root с некоторым индексом (максимальное значение которого на 1 меньше значения Count узла Root).

Это сообщение отредактировал(а) BreakPointMAN - 6.11.2005, 14:52


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
=Женек=
Дата 6.11.2005, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 548
Регистрация: 20.2.2005

Репутация: 1
Всего: 1



Кривоватое решение.

А я сделал вот так
Код


std::vector<AnsiString> RootList;
SearchNode=NewFilesTree->TopItem;

while (SearchNode)
{
 SearchNode=SearchNode->getNextSibling();
 RootList.push_back(SearchNode->Text);
}


PM MAIL   Вверх
=Женек=
Дата 6.11.2005, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 548
Регистрация: 20.2.2005

Репутация: 1
Всего: 1



Когда напишу функцию создания дерева по списку файлов обязательно здесь ее выложу. Думаю многим будет полезно.
PM MAIL   Вверх
Artemon
Дата 6.11.2005, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 7
Всего: 20



А как на счет такого:

Создаешь вектор указателей на узлы и заносиш их в вектор,

и если надо то обращаешься к вектору


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
=Женек=
Дата 7.11.2005, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 548
Регистрация: 20.2.2005

Репутация: 1
Всего: 1



Для чего? Вектор - массив. У нас уже есть невидимый массив - в теле класса TTreeView. Зачем параллельный массив нужен?
PM MAIL   Вверх
Artemon
Дата 7.11.2005, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 7
Всего: 20



Цитата

Другими словами - как бы получить ссылоку на самый-самый верхний виртуальный узел, содержащий все корневые узлы, чтобы потом их через Node->Item[i]....


Если в векторе будут содержаться только указатели на корневые узлы, то ты именно этого и добьёшься,

Node->Item[i] < =====> mas[i]

Это сообщение отредактировал(а) Artemon - 7.11.2005, 11:00


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
=Женек=
Дата 7.11.2005, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 548
Регистрация: 20.2.2005

Репутация: 1
Всего: 1



Artemon

представь себе - 50 000 файлов. И для каждого фала нужно осуществить перебор всех элементов дерева, число которых в зависимости от итерации будет от 0 до 50 000.

Внимательней надо читать, товарищ!

Я же написал про функцию getNextSibling() - с ней все гораздо быстрее.


PM MAIL   Вверх
Artemon
Дата 8.11.2005, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 7
Всего: 20



Да я ведь только альтернативу предлагаю, наше дело предложить ваше отказаться.


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
Vyacheslav
Дата 8.11.2005, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Цитата
Другими словами - как бы получить ссылоку на самый-самый верхний виртуальный узел, содержащий все корневые узлы, чтобы потом их через Node->Item[i]....

Я может чего и не понял, но это разве не подходит?
Код

    for (TTreeNode* i = TreeView1->Items->GetFirstNode(); i; i=i->getNextSibling() ) {
        ShowMessage(i->Text);
    }




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
BreakPointMAN
Дата 8.11.2005, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: 6
Всего: 24



Vyacheslav, см. пост #6, там как раз и используется метод getNextSibling().


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
Vyacheslav
Дата 8.11.2005, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Цитата(BreakPointMAN @ 8.11.2005, 12:48)
Vyacheslav, см. пост #6, там как раз и используется метод getNextSibling().

BreakPointMAN см. пост #6, smile
там как раз и используется TopItem

Разницу между TopItem и Items->GetFirstNode() надеюсь разъяснять не надо?


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0682 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.