Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Virtual TreeView - есть ли нормальное полное описание его работы?  [new]
svnvlad
Member

Откуда:
Сообщений: 2168
Читаю вот здесь
http://delphigears.blogspot.com/2011/08/virtual-treeview.html
и здесь
https://www.kansoftware.ru/?tid=5261

Например есть код для рекурсивного поиска, который как бы должен работать
https://forum.vingrad.ru/forum/topic-355385.html

Но он не работает, потому что пытается нарушить основной принцип Virtual TreeView: тянуть по требованию, т.е. пока вложенные ветки не понадобились, никто не будет физически их создавать, они создаются в момент, когда пользователь потребовал эту ветку (кликнул мышью на плюсик, раскрывающий дочерний уровень).
В коде же предполагается, что дерево заполнено полностью.
Я конечно вышел из положения, нарушив основной принцип - процедуру заполнения дерева сделал рекурсивной, и она сразу полностью заполняет все ветки дерева, даже невидимые.
Но в дереве есть "родной" метод IncrementalSearch. Что же получается, он при поиске принудительно заполняет все ветки, нарушая свой же принцип?
25 июн 20, 17:03    [22157332]     Ответить | Цитировать Сообщить модератору
 Re: Virtual TreeView - есть ли нормальное полное описание его работы?  [new]
svnvlad
Member

Откуда:
Сообщений: 2168
Еще есть "фишка" - если заполняешь дерево по правилам "on demand" - заполняешь дочерний уровень через событие OnInitNode, а в рекурсивном поиске делаешь принудительное заполнение дочерних веток перед поиском, то дочерние ветки дублируются. Если не делать принудительное заполнение, то поиск осуществляется не глубже 2-го уровня. Из-за непонятной хитрой логики работы OnInitNode. В том и коварность этого дерева, что на первый взгляд все работает. Глюки начинаешь замечать, когда уже пользователь по факту начинает серьезно использовать дерево, заполняя более глубокие уровни.

К сообщению приложен файл. Размер - 9Kb


Сообщение было отредактировано: 25 июн 20, 17:10
25 июн 20, 17:08    [22157338]     Ответить | Цитировать Сообщить модератору
 Re: Virtual TreeView - есть ли нормальное полное описание его работы?  [new]
svnvlad
Member

Откуда:
Сообщений: 2168
Нашел решение для рекурсивного поиска: чтобы поиск осуществлялся дальше 2й ветки, нужно делать фокусировку на текущей обрабатываемой ветке, тогда InitNode срабатывает на полную глубину всех вложенных веток, а если нет, то только на глубину второго уровня.
function TfmTechnicProcess.FindNodeByGroupId(ANode: PVirtualNode;  AId: integer): PVirtualNode;
var
  NextNode: PVirtualNode;
  Group: PGroup;
begin
  Result := nil;
//  ChangeQueryGroup(ANode);  // <<==== ЭТО УБИРАЕМ (принудительное заполнение уровня), оставляем только в OnInitNode
  NextNode := ANode.FirstChild;
  if Assigned(NextNode) then
    repeat
      GroupsTree.FocusedNode := NextNode; // <<=========ВОТ ЭТА ЗАГВОЗДКА, без нее работает не далее 2 уровня

      Group := GroupsTree.GetNodeData(NextNode);
      if Assigned(Group) then
        if AId = Group.id then
          begin
            Result := NextNode;
            Exit;
          end;
      // Ищем в дочерних ветках
      Result := FindNodeByGroupId(NextNode, AId);
      if Result <> nil then // Нашли в дочерней
        begin
          GroupsTree.Expanded[NextNode] := true;
          break; // выходим
        end
      else
        NextNode := NextNode.NextSibling // Переходим на соседнюю ветку...
    until NextNode = nil;
end;


Сообщение было отредактировано: 25 июн 20, 17:23
25 июн 20, 17:24    [22157353]     Ответить | Цитировать Сообщить модератору
 Re: Virtual TreeView - есть ли нормальное полное описание его работы?  [new]
ъъъъъ
Member

Откуда:
Сообщений: 795
svnvlad
Но он не работает, потому что пытается нарушить основной принцип Virtual TreeView: тянуть по требованию...
...
В коде же предполагается, что дерево заполнено полностью.
...

Чудак-человек, явно сказано: делай так, ты же нет - "так я не делаю", ...и?

Ладно, открываю самую главную тайну №2.
+ Тайна №2

Храни содержимое дерева отдельно. И поиск выполняй в этом самом "отдельно".
В структуре памяти, в СУБД.
А TVirtualStringTree используй для отображения.

Например, ищешь в СУБД, совсем просто. В качестве результата формируется путь к найденному элементу. Далее последовательно идешь по найденным элементам пути уже в визуальном дереве и отображаешь результат. Мгновенно.
25 июн 20, 18:03    [22157385]     Ответить | Цитировать Сообщить модератору
 Re: Virtual TreeView - есть ли нормальное полное описание его работы?  [new]
svnvlad
Member

Откуда:
Сообщений: 2168
ъъъъъ
svnvlad
Но он не работает, потому что пытается нарушить основной принцип Virtual TreeView: тянуть по требованию...
...
В коде же предполагается, что дерево заполнено полностью.
...

Чудак-человек, явно сказано: делай так, ты же нет - "так я не делаю", ...и?

Где это сказано? Сколько ни искал, везде приводятся примеры поиска только внутри дерева.
А мысль искать в базе, строить путь к ветке, и потом мгновенно открывать - была, но руки не дошли, это надо придумать механизм запоминания и разворачивания этого пути.

Опять же, сами создатели дерева предлагают искать по дереву с помощью встроенного события OnIncrementalSearch.

Сообщение было отредактировано: 25 июн 20, 18:09
25 июн 20, 18:11    [22157391]     Ответить | Цитировать Сообщить модератору
 Re: Virtual TreeView - есть ли нормальное полное описание его работы?  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26656
svnvlad
это надо придумать механизм запоминания и разворачивания этого пути.

Механизм уже придуман и скорее всего реализован в СУБД.
Либо небольшая хранимка, которая по паренту лезет до верха выплевывая свой путь.
25 июн 20, 19:09    [22157429]     Ответить | Цитировать Сообщить модератору
 Re: Virtual TreeView - есть ли нормальное полное описание его работы?  [new]
ъъъъъ
Member

Откуда:
Сообщений: 795
svnvlad
Где это сказано? Сколько ни искал, везде приводятся примеры поиска только внутри дерева.

Ну вот я тебе прямо сейчас сказал. Лови момент.

Про тянуть, а не толкать - в доке сказано.
Если контекстных данных в дереве нет - какой в нем может быть поиск, до полной инициализации контекста?

И, даже если данные уже в дереве - поиск быстрый, но - последовательный. То есть, на больших объемах все равно лучше искать не в визуальном компоненте, а в структуре данных, которую этот компонент отображает.
А если знаешь путь - то поиск не последовательный, а "бинарный", то есть - быстрый даже на больших объемах.

Давай-давай, включаем моск. А то будешь, как один из местных товарищей, который для поддержки древовидной структуры создавал невидимый TTreeView.
25 июн 20, 19:58    [22157443]     Ответить | Цитировать Сообщить модератору
 Re: Virtual TreeView - есть ли нормальное полное описание его работы?  [new]
ъъъъъ
Member

Откуда:
Сообщений: 795
svnvlad
мысль искать в базе, строить путь к ветке, и потом мгновенно открывать - была, но руки не дошли, это надо придумать механизм запоминания и разворачивания этого пути.
- ыыы...

"Black Lives Matter"? Да шиш тебе!

Солнце ещё высоко!
25 июн 20, 20:00    [22157445]     Ответить | Цитировать Сообщить модератору
 Re: Virtual TreeView - есть ли нормальное полное описание его работы?  [new]
svnvlad
Member

Откуда:
Сообщений: 2168
wadman
svnvlad
это надо придумать механизм запоминания и разворачивания этого пути.

Механизм уже придуман и скорее всего реализован в СУБД.
Либо небольшая хранимка, которая по паренту лезет до верха выплевывая свой путь.

У меня даже есть эта хранимка, правда не для id, а для sequence_number, чтобы из локальных номеров строить полные, типа 5.2.1. Осталось написать такую же процедуру для дерева, только наоборот.

Сообщение было отредактировано: 25 июн 20, 23:42
25 июн 20, 23:44    [22157531]     Ответить | Цитировать Сообщить модератору
 Re: Virtual TreeView - есть ли нормальное полное описание его работы?  [new]
svnvlad
Member

Откуда:
Сообщений: 2168
А может у них есть демки для TreeView? Подсказал бы кто, где их искать?
Вот в вышеприведенных примерах по ссылке для заполнения дерева вот такой код:
RootNode := VST.AddChild(VST.RootNode);
if not (vsInitialized in RootNode.States) then
   VST.ReinitNode(RootNode, False);
Data := VST.GetNodeData(RootNode);
...

У меня же просто
n := ATree.AddChild(AParent);
group := ATree.GetNodeData(n);

Кто знает, зачем они пишут ReinitNode?

Сообщение было отредактировано: 25 июн 20, 23:49
25 июн 20, 23:50    [22157532]     Ответить | Цитировать Сообщить модератору
 Re: Virtual TreeView - есть ли нормальное полное описание его работы?  [new]
ъъъъъ
Member

Откуда:
Сообщений: 795
Вопрос сформулируй, конкретный.

Разве это вопросы:
svnvlad
Virtual TreeView - есть ли нормальное полное описание его работы?

svnvlad
Что же получается

svnvlad
непонятной хитрой логики работы

?

Пиши, подумав предварительно. Что это за странные утверждения, например:
svnvlad
Но в дереве есть "родной" метод IncrementalSearch.

- какой нафиг "метод"? При чем тут реализация поиска при вводе строки к твоей задаче?
Да, при поиске "по вводу" может принудительно инициализировать узлы, всё зависит от значения свойства IncrementalSearch.

svnvlad
создатели дерева предлагают искать по дереву с помощью встроенного события OnIncrementalSearch

С чего такой странный вывод?

Как будто бы ты не изучил демки и документацию, а сразу хочешь "нагнуть" VST под свое видение прекрасного. Но это конечно же не так.

...
"Рекурсивный" поиск по дереву реализуется парой методов: GetFirst и GetNext.
node := vst.GetFirst;
while assigned(node) do begin
  ... обработка
  node := vst.GetNext(node)  
end

Метод GetNext() выполняет обход с заходом в детей, т.е., "рекурсивно".
Прямо в этих методах проверяется, был ли инициализирован узел ранее - если не был, для узла вызывается процедура инициализации, InitNode/InitChildren. Если ты не написал обработчиков OnInitNode/OnInitChildren, или как-то ещё создал узел, но не инициализировав его - пиши жалобы в Спортлото: данных нет - что обрабатывать?

Для поиска данных в структуре эти самые данные в этой структуре должны присутствовать. Или загрузи эти данные заранее, или подгружай их по ходу поиска, или ищи их там, где они уже есть (в базе данных).
26 июн 20, 01:12    [22157544]     Ответить | Цитировать Сообщить модератору
 Re: Virtual TreeView - есть ли нормальное полное описание его работы?  [new]
svnvlad
Member

Откуда:
Сообщений: 2168
ъъъъъ
Вопрос сформулируй, конкретный.

Разве это вопросы:
svnvlad
Virtual TreeView - есть ли нормальное полное описание его работы?

?

Буквально то и спрашивал: где полная справка по компоненту? На сайте производителя не нашел.

Как будто бы ты не изучил демки и документацию, а сразу хочешь "нагнуть" VST под свое видение прекрасного. Но это конечно же не так.

Не изучил. Весь код, который есть, надерган из интернета и придуман самостоятельно. Где демки, вопрос сложный.

"Рекурсивный" поиск по дереву реализуется парой методов: GetFirst и GetNext.
node := vst.GetFirst;
while assigned(node) do begin
  ... обработка
  node := vst.GetNext(node)  
end

Метод GetNext() выполняет обход с заходом в детей, т.е., "рекурсивно".
Прямо в этих методах проверяется, был ли инициализирован узел ранее - если не был, для узла вызывается процедура инициализации, InitNode/InitChildren.

Это настоящее открытие. Я писал рекурсивную процедуру, и перебирал GenNextSibling.
27 июн 20, 22:43    [22158412]     Ответить | Цитировать Сообщить модератору
 Re: Virtual TreeView - есть ли нормальное полное описание его работы?  [new]
ъъъъъ
Member

Откуда:
Сообщений: 795
svnvlad
На сайте производителя не нашел.

https://github.com/TurboPack/VirtualTreeView - в папке Help - не?
28 июн 20, 00:07    [22158445]     Ответить | Цитировать Сообщить модератору
 Re: Virtual TreeView - есть ли нормальное полное описание его работы?  [new]
Cobalt747
Member

Откуда:
Сообщений: 2166
svnvlad,

Полное описание - это исходники.
А они идут в комплекте.
29 июн 20, 22:57    [22159302]     Ответить | Цитировать Сообщить модератору
 Re: Virtual TreeView - есть ли нормальное полное описание его работы?  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 319
ъъъъъ
svnvlad
На сайте производителя не нашел.

https://github.com/TurboPack/VirtualTreeView - в папке Help - не?

Не надо давать ссылки на форки

https://github.com/JAM-Software/Virtual-TreeView - официальный репо
https://github.com/JAM-Software/Virtual-TreeView/tree/master/Demos - демки
3 июл 20, 15:10    [22161688]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить