[ТЕМА ЗАКРЫТА]
Опции темы
22.08.2007 18:28  
Петя
Всем известный шаблон классификатора супермага содержит следующую информацию
Id Tree Name

Например

1 1. Мясо
2 1.1. Говядина
3 1.2. Свинина

Пытаюсь реализовать классификатор компонентом TreeView в Делфи.
Пока получилось только упрощенным двойным перебором, работает при
1000 ветках примерно секунд 5-7, если веток 10000-15000 работает долго.
Интересно какие алгоритмы могут предложить участники форума.
Возможно предварительно загрузить в файл... Или как то рекурсивно
подойти...
 
23.08.2007 13:18  
dmware
Цитата:
Сообщение от Петя
Всем известный шаблон классификатора супермага содержит следующую информацию
Id Tree Name

Например

1 1. Мясо
2 1.1. Говядина
3 1.2. Свинина

Пытаюсь реализовать классификатор компонентом TreeView в Делфи.
Пока получилось только упрощенным двойным перебором, работает при
1000 ветках примерно секунд 5-7, если веток 10000-15000 работает долго.
Интересно какие алгоритмы могут предложить участники форума.
Возможно предварительно загрузить в файл... Или как то рекурсивно
подойти...
А разве это настолько существенный момент?
Можно создавать форму при запуске приложения, заполняя при этом TreeView (один единственный раз).
Еще... Не видел кода... поэтому все-таки посоветую: отключи автообновление при заполнении дерева. .Items.BeginUpdate()/.Items.EndUpdate()

Просто интересно: "Упрощенный двойной перебор" - это как?
 
23.08.2007 15:20  
YuraZ
Я бы предложил использовать TVirtualTreeView от Mike Lischke (. Попробуй просто добавить 10000 записей в стандартный TreeView и ты поймешь почему у тебя тормоза - это сам TreeView тормозит.
Ну а по алгоритму - подгружай только те строки классификатора, которые видны в данный момент на экране. Т.е. первоначально отбираешь все группы первого уровня. В момент разворачивания одной из них, подтягиваешь из базы группы расположенные в ней и отображаешь. При сворачивании группы - удаляешь вложенные подгруппы.
 
23.08.2007 15:38  
dmware
Цитата:
Сообщение от YuraZ
Я бы предложил использовать TVirtualTreeView от Mike Lischke (. Попробуй просто добавить 10000 записей в стандартный TreeView и ты поймешь почему у тебя тормоза - это сам TreeView тормозит.
Хотелось бы еще раз заострить внимание на следующем (возможно дело именно в этом)
Если попробовать поступить так:
Код:
TreeView.Items.Add(nil, [Наименование узла])
будет добавлен очередной элемент, после чего автоматически будет выполнена перерисовка.
Чтобы запретить компоненту перерисовываться вплоть до добавления последнего элемента используются упомянутые мною методы BeginUpdate() (До того, как элементы начнут добавляться) и EndUpdate() (После того, как процедура будет завершена)
Таким образом, "тормоза" должны будут стать менее очевидными, ведь мы избавляем компонент от необходимости перерисовки такое количество раз, сколько элементов к нему добавляем.
Конечно же, самую важную роль играет еще и сам алгоритм, по которому будут извлечены/добавлены элементы...
 
23.08.2007 15:46  
YuraZ
Цитата:
Сообщение от dmware
Хотелось бы еще раз заострить внимание на следующем (возможно дело именно в этом)
Если попробовать поступить так:
Код:
TreeView.Items.Add(nil, [Наименование узла])
будет добавлен очередной элемент, после чего автоматически будет выполнена перерисовка.
Чтобы запретить компоненту перерисовываться вплоть до добавления последнего элемента используются упомянутые мною методы BeginUpdate() (До того, как элементы начнут добавляться) и EndUpdate() (После того, как процедура будет завершена)
Таким образом, "тормоза" должны будут стать менее очевидными, ведь мы избавляем компонент от необходимости перерисовки такое количество раз, сколько элементов к нему добавляем.
Конечно же, самую важную роль играет еще и сам алгоритм, по которому будут извлечены/добавлены элементы...
Это понятно. Но уже давным давно выяснено, что основная проблема TreeView в том, что он не предназначен для отображения большого кол-ва узлов - тормозит дико. Я в свое время с этим столкнулся. Добавил в классификатор для теста 10.000 записей и ошалел. После перехода на указанный ранее VirtualTreeView скорость заполнения 10.000 записей ~1 секунда.
 
23.08.2007 15:52  
Петя
Цитата:
подгружай только те строки классификатора, которые видны в данный момент на экране. Т.е. первоначально отбираешь все группы первого уровня. В момент разворачивания одной из них, подтягиваешь из базы группы расположенные в ней и отображаешь. При сворачивании группы - удаляешь вложенные подгруппы.
Гениально, спасибо за идею
 
23.08.2007 15:54  
dmware
Цитата:
Сообщение от YuraZ
Это понятно. Но уже давным давно выяснено, что основная проблема TreeView в том, что он не предназначен для отображения большого кол-ва узлов - тормозит дико. Я в свое время с этим столкнулся. Добавил в классификатор для теста 10.000 записей и ошалел. После перехода на указанный ранее VirtualTreeView скорость заполнения 10.000 записей ~1 секунда.
Интересно. Нужно будет посмотреть в свободное время.
 
23.08.2007 15:54  
Петя
Цитата:
Можно создавать форму при запуске приложения, заполняя при этом TreeView (один единственный раз).
А если другой пользователь после загрузки TreeView
скажем удалил ветку,
а мы будем пользоваться "старым" TreeView
 
23.08.2007 15:59  
Петя
Цитата:
Просто интересно: "Упрощенный двойной перебор" - это как?
Возможно неправильно выразился, т е алг со сложностью n^2,
взяли первый просмотрели все,
взяли второй просмотрели все,
..
"упрощенный" - я имел в виду, что просматривать все не надо, ветки отсортированны специальным образом, что после первого мы практически сразу находим то что нужно
 
23.08.2007 16:07  
Петя
Цитата:
Я бы предложил использовать TVirtualTreeView от Mike Lischke (.
Сори, где там чего скачивать чего то не найду
 
 


Опции темы



Часовой пояс GMT +3, время: 13:39.

Все в прочитанное - Календарь - RSS - - Карта - Вверх 👫 Яндекс.Метрика
Форум сделан на основе vBulletin®
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd. Перевод: zCarot и OlegON
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.