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
Цитата:
Петя Всем известный шаблон классификатора супермага содержит следующую информацию
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
Я бы предложил использовать TVirtualTreeView от Mike Lischke (. Попробуй просто добавить 10000 записей в стандартный TreeView и ты поймешь почему у тебя тормоза - это сам TreeView тормозит.
Ну а по алгоритму - подгружай только те строки классификатора, которые видны в данный момент на экране. Т.е. первоначально отбираешь все группы первого уровня. В момент разворачивания одной из них, подтягиваешь из базы группы расположенные в ней и отображаешь. При сворачивании группы - удаляешь вложенные подгруппы.
23.08.2007 15:38
Цитата:
YuraZ Я бы предложил использовать TVirtualTreeView от Mike Lischke (. Попробуй просто добавить 10000 записей в стандартный TreeView и ты поймешь почему у тебя тормоза - это сам TreeView тормозит.
Хотелось бы еще раз заострить внимание на следующем (возможно дело именно в этом)
Если попробовать поступить так:
Код:
TreeView.Items.Add(nil, [Наименование узла])
будет добавлен очередной элемент, после чего автоматически будет выполнена перерисовка.
Чтобы запретить компоненту перерисовываться вплоть до добавления последнего элемента используются упомянутые мною методы BeginUpdate() (До того, как элементы начнут добавляться) и EndUpdate() (После того, как процедура будет завершена)
Таким образом, "тормоза" должны будут стать менее очевидными, ведь мы избавляем компонент от необходимости перерисовки такое количество раз, сколько элементов к нему добавляем.
Конечно же, самую важную роль играет еще и сам алгоритм, по которому будут извлечены/добавлены элементы...
23.08.2007 15:46
Цитата:
dmware Хотелось бы еще раз заострить внимание на следующем (возможно дело именно в этом)
Если попробовать поступить так:
Код:
TreeView.Items.Add(nil, [Наименование узла])
будет добавлен очередной элемент, после чего автоматически будет выполнена перерисовка.
Чтобы запретить компоненту перерисовываться вплоть до добавления последнего элемента используются упомянутые мною методы BeginUpdate() (До того, как элементы начнут добавляться) и EndUpdate() (После того, как процедура будет завершена)
Таким образом, "тормоза" должны будут стать менее очевидными, ведь мы избавляем компонент от необходимости перерисовки такое количество раз, сколько элементов к нему добавляем.
Конечно же, самую важную роль играет еще и сам алгоритм, по которому будут извлечены/добавлены элементы...
Это понятно. Но уже давным давно выяснено, что основная проблема TreeView в том, что он не предназначен для отображения большого кол-ва узлов - тормозит дико. Я в свое время с этим столкнулся. Добавил в классификатор для теста 10.000 записей и ошалел. После перехода на указанный ранее VirtualTreeView скорость заполнения 10.000 записей ~1 секунда.
23.08.2007 15:52
Цитата:
подгружай только те строки классификатора, которые видны в данный момент на экране. Т.е. первоначально отбираешь все группы первого уровня. В момент разворачивания одной из них, подтягиваешь из базы группы расположенные в ней и отображаешь. При сворачивании группы - удаляешь вложенные подгруппы.
Гениально, спасибо за идею
23.08.2007 15:54
Цитата:
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, время: 17:23.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.