Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Медленный VirtualTreeView (массовое переназначение родителей) / 8 сообщений из 8, страница 1 из 1
24.11.2017, 00:53:12
    #39558667
Кар-Кар
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленный VirtualTreeView (массовое переназначение родителей)
Могу скрывать родителя и все дочерние становятся прямым списком.
И обратно тоже:


Сделать прямым списком - быстро.
А вот обратно расфасовать по правильным родителям - долго.

Хотя я сохранил оригинального родителя:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
  TVirtualKind = (vkNode, vlLeaf);

type
  PVirtualData = ^TVirtualData;
  TVirtualData = record
    Top    : PVirtualNode;  //"бэкап" парента
    Kind   : TVirtualKind;
  end;

//Тут уже код перестройки дерева, либо с парентами либо без
var
Next : PVirtualNode;
Node : PVirtualNode;
begin
Tree.BeginUpdate;
Next := Tree.GetFirst;
while Assigned(Next) do
begin
  Node := Next;
  Next := Tree.GetNext(Next);
  with PVirtualData(Node.GetData)^ do
  case Kind of
  vkNode: Tree.IsVisible[Node] := vsNodes in FShow;
  vkLeaf:
    begin
      if vsNodes in FShow then
        Tree.NodeParent[Node] := Top else //PVirtualData(Node.GetData)^.Top
        Tree.NodeParent[Node] := Tree.RootNode;
    end;
  end;
end;
Tree.EndUpdate;
end;


~180 парентов с пока ещё ~70000 нодами вообщем, "возвращение" занимает 2-4 секунды. Возможно ускориться?
Там больше планируется...
...
Рейтинг: 0 / 0
24.11.2017, 01:53:12
    #39558676
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленный VirtualTreeView (массовое переназначение родителей)
Кар-Кар,

ты данные не в дереве храни. И просто перестраивай дерево с нуля, и все.
И дочерние узлы подгружай лишь в момент их разворачивания.
...
Рейтинг: 0 / 0
24.11.2017, 01:56:41
    #39558677
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленный VirtualTreeView (массовое переназначение родителей)
...можешь даже два окна деревьев завести, одно под другим, и переключаться между ними.
...
Рейтинг: 0 / 0
24.11.2017, 02:10:09
    #39558678
Кар-Кар
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленный VirtualTreeView (массовое переназначение родителей)
чччД,

Данные там просто интерфейс и пара dword-ов в оригинале(чтобы знать как рисовать, многотиповые ноды), это малозначительно.
Перестройка вот с нуля - она сбивает всё, т.е. ноды снова закрыты станут, скроллбокс на нулевой позиции и т.п. Хотел избежать.

чччДИ дочерние узлы подгружай лишь в момент их разворачивания.
Это событие есть? Посмотрю. Может даже попробую паренты менять прям в OnGetText только, в FShow у меня есть флаги как подразумевается показ дерева.
...
Рейтинг: 0 / 0
24.11.2017, 02:18:50
    #39558680
fd00ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленный VirtualTreeView (массовое переназначение родителей)
Кар-Кар, смотри потроха метода MoveTo. как минимум, попробуй развернуть обход дерева при перестройке
...
Рейтинг: 0 / 0
24.11.2017, 02:20:11
    #39558681
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленный VirtualTreeView (массовое переназначение родителей)
Кар-Кар,
1. событие есть.
2. перед перестраиванием в парент-чилд запомни, какой нод был текущим, вычисли его парента и тоже запомни. С нуля построй парент-уровень, найди нужный парент-узел, распахни его. Сработает событие см.выше, подгрузятся чилды этого парента. Среди чилдов найди свой узел. Выполни скролл чилд-узла в облвсть видимости окна.
3. запоминать все развернутые узлы не надо, юзеры не оценят. Более того, мы в итоге сдели так, чтобы была развернута лишь одна парент-ветка, просие сразу сворачиваются. Впрочем, дело ваше.
...
Рейтинг: 0 / 0
24.11.2017, 02:21:40
    #39558682
Кар-Кар
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленный VirtualTreeView (массовое переназначение родителей)
чччД...можешь даже два окна деревьев завести, одно под другим, и переключаться между ними.Вариант. Но пока не знаю, уровней планируется 4 или где-то так. Типа фильтр, в любой момент снимать галки и видеть скопом (в этот момент непервостепенно знать кто-кому принадлежит).
...
Рейтинг: 0 / 0
24.11.2017, 12:15:59
    #39558902
LSV
LSV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленный VirtualTreeView (массовое переназначение родителей)
Нужно иметь процедуру получения "пути" к корню от самого последнего листика (можно реализовать на уровне СУБД).
И процедуру позиционирования на листик по этому пути.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Медленный VirtualTreeView (массовое переназначение родителей) / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]