![]() |
|
| Правила Форума редакция от 22.06.2020 |
|
|||||||
|
|
Окажите посильную поддержку, мы очень надеемся на вас. Реквизиты для переводов ниже. |
|
![]() |
|
|
Опции темы | Опции просмотра |
Language
|
|
|
#1
|
|
Неактивный пользователь
Пол:
Регистрация: 19.06.2008
Сообщений: 95
Репутация: 1
|
Доброго времени суток.
Подскажите, кто знает. Строю дерево с помощью MemTableEh + DbGridEh классическим способом. Т.е. ADOQuery + DataSetDriverEh (дерево "константное", т.е. все модификации данных через базу) + MemTableEh + DataSouerce + DBGridEh. Все стандартным способом как по мануалу. Все работает отлично. НО!!! Дерево оказалось с 18к узлов. И дерево строится под минуту. Насколько я понимаю - для построения используется ресурс локальной машины, т.е. на более слабом ПК это будет еще дольше. Кто знает варианты ускорения данной цепочки. Есть вариант - руками через TreeView (подгружать дочерние узлы в момент раскрытия), но потеряются фильтры, сортировки такие удобные в гриде. Кто что посоветует? |
|
|
|
| Реклама: |
|
|
#2
|
|
Новичок
Пол:
Регистрация: 15.10.2013
Сообщений: 9
Репутация: 0
|
Вечер добрый.
Ну вроде деревья все так и подгружают - TTreeView, VirtualTreeView. Зачем все 18к узлов вываливать? Я по работе пытался сразу около 3,5к вывалить, с загрузкой объектов в Node.Data... тормозило. Потом покурили форумы, продумали... а зачем юзеру столько и сразу?! |
|
|
|
|
|
#3
|
|
Неактивный пользователь
Пол:
Регистрация: 19.06.2008
Сообщений: 95
Репутация: 1
|
для того что бы Search делать по дереву, сортировку и т.д.
Дерево представляется из себя - дерево таможенных кодов. Соотв. нужно или переписывать поиск стандартный, или грузить целиком |
|
|
|
|
|
#4
|
|
Новичок
Пол:
Регистрация: 15.10.2013
Сообщений: 9
Репутация: 0
|
Сколько уровней имеет дерево (более 2-х)? Вы сразу все узлы открываете?
|
|
|
|
|
|
#5
|
|
Неактивный пользователь
Пол:
Регистрация: 19.06.2008
Сообщений: 95
Репутация: 1
|
Кол-во узлов динамическое. Т.е. все зависит от данных, сейчас вложенность для некоторых веток до 5-ти, но в теории может быть любая.
Открываю не все узлы. В теории можно было бы рисовать только родительские, и на onExpand дорисовывать дочерние, но тогда не будет работать поиск родной. А делать поиск отдельно и дорисовывать найденные узлы - не очень хочется |
|
|
|
|
|
#6
|
|
Новичок
Пол:
Регистрация: 15.10.2013
Сообщений: 9
Репутация: 0
|
Попробовал загрузить 10к... действительно долго, 1к грузится быстро.
Что сразу приходит на ум - разбить на отдельные справочники, если это возможно. Добавить в БД еще одно поле - код справочника и пронумеровать корневые узлы, потом в селекте выбирать нужные справочники. |
|
|
|
|
|
#7
|
|
Неактивный пользователь
Пол:
Регистрация: 19.06.2008
Сообщений: 95
Репутация: 1
|
проблема, как я понимаю, не в селекте, а в отрисовке дерева в DBGridEh
потому как селекты и все дела проходят быстро, а вот на "onDrawTree" у грида идет задержка |
|
|
|
|
|
#8
|
|
Новичок
Пол:
Регистрация: 15.10.2013
Сообщений: 9
Репутация: 0
|
сделал тест: разбил весь процесс загрузки на 3 этапа.
1 - выполнял селект, 2 - делал MemTableEh.LoadFromDataSet(...), 3- подключал к DBGridEh DataSource, у MemTableEh - FetchAllOnOpen выставлял в False результат: самое долгое, это MemTableEh.LoadFromDataSet(...), остальное пулей! MemTableEh пытается у себя дерево строить, что и занимает время на больших объемах |
|
|
|
|
|
#9
|
|
Неактивный пользователь
Пол:
Регистрация: 19.06.2008
Сообщений: 95
Репутация: 1
|
хм. я тестился не так. Я делал memtable open - это отрабатывало влет.
а вот когда я открывал форму и Grid'а отрисовывал данные - тогда основная задержка и шла |
|
|
|
|
|
#10
|
|
Новичок
Пол:
Регистрация: 15.10.2013
Сообщений: 9
Репутация: 0
|
а в memtable данные у вас как попадают?
поля там уже определены и Вы по ADOQuery бегаете и добавляете записи? |
|
|
|
|
|
#11
|
|
Неактивный пользователь
Пол:
Регистрация: 19.06.2008
Сообщений: 95
Репутация: 1
|
через классическую связку AdoQuery+dataprovider+memtableeh+dbgrideh
поля уже определены, т.е. таблица чисто вытягивает данные из запроса сама. соотв ключи для дерева тоже предзабиты |
|
|
|
|
|
#12
|
|
Новичок
Пол:
Регистрация: 15.10.2013
Сообщений: 9
Репутация: 0
|
Можно еще вариант попробовать...
У memtableeh свойство TreeList.Active делаете False, а после загрузки записей меняете это свойство на True, должно немного быстрее быть, т.к. данные в memtableeh уже есть |
|
|
|
|
|
#13
|
|
Неактивный пользователь
Пол:
Регистрация: 19.06.2008
Сообщений: 95
Репутация: 1
|
ок. спасибо, проверю
|
|
|
|
|
|
#14
|
|
Новичок
Пол:
Регистрация: 15.10.2013
Сообщений: 9
Репутация: 0
|
Конечно, на мой взгляд, правильнее было порезать на более мелкие фрагменты дерево )) и загружать разными справочниками.
|
|
|
|
![]() |
Похожие темы
|
||||
| Тема | Автор | Раздел | Ответов | Последнее сообщение |
| TreeView (MemTableEh + DBGridEh) | Litvinenko_A | Delphi | 0 | 29.02.2016 15:09 |
| DBGridEh и OnMouseWheel | Mironico | Delphi | 2 | 19.08.2010 07:02 |
| C++Builder6 DBGRIDEH как установить фокус на любую ячейку GRID | vereshak | Borland C++ Builder | 3 | 03.08.2010 20:05 |
| ADOQuery + DBGridEh | Litvinenko_A | Delphi | 8 | 01.12.2009 14:48 |
| как представить информацию, кроме как в виде бинарного дерева? | Tuco | Скорая помощь | 2 | 16.03.2009 15:05 |
|
|