powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Virtual TreeView - есть ли нормальное полное описание его работы?
15 сообщений из 15, страница 1 из 1
Virtual TreeView - есть ли нормальное полное описание его работы?
    #39973251
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читаю вот здесь
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. Что же получается, он при поиске принудительно заполняет все ветки, нарушая свой же принцип?
...
Рейтинг: 0 / 0
Virtual TreeView - есть ли нормальное полное описание его работы?
    #39973256
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще есть "фишка" - если заполняешь дерево по правилам "on demand" - заполняешь дочерний уровень через событие OnInitNode, а в рекурсивном поиске делаешь принудительное заполнение дочерних веток перед поиском, то дочерние ветки дублируются. Если не делать принудительное заполнение, то поиск осуществляется не глубже 2-го уровня. Из-за непонятной хитрой логики работы OnInitNode. В том и коварность этого дерева, что на первый взгляд все работает. Глюки начинаешь замечать, когда уже пользователь по факту начинает серьезно использовать дерево, заполняя более глубокие уровни.
...
Рейтинг: 0 / 0
Virtual TreeView - есть ли нормальное полное описание его работы?
    #39973267
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел решение для рекурсивного поиска: чтобы поиск осуществлялся дальше 2й ветки, нужно делать фокусировку на текущей обрабатываемой ветке, тогда InitNode срабатывает на полную глубину всех вложенных веток, а если нет, то только на глубину второго уровня.
Код: 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.
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;
...
Рейтинг: 0 / 0
Virtual TreeView - есть ли нормальное полное описание его работы?
    #39973291
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
svnvlad
Но он не работает, потому что пытается нарушить основной принцип Virtual TreeView: тянуть по требованию...
...
В коде же предполагается, что дерево заполнено полностью.
...

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

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

Например, ищешь в СУБД , совсем просто. В качестве результата формируется путь к найденному элементу. Далее последовательно идешь по найденным элементам пути уже в визуальном дереве и отображаешь результат. Мгновенно.
...
Рейтинг: 0 / 0
Virtual TreeView - есть ли нормальное полное описание его работы?
    #39973296
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
svnvlad
Но он не работает, потому что пытается нарушить основной принцип Virtual TreeView: тянуть по требованию...
...
В коде же предполагается, что дерево заполнено полностью.
...

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

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

Опять же, сами создатели дерева предлагают искать по дереву с помощью встроенного события OnIncrementalSearch.
...
Рейтинг: 0 / 0
Virtual TreeView - есть ли нормальное полное описание его работы?
    #39973324
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad
это надо придумать механизм запоминания и разворачивания этого пути.

Механизм уже придуман и скорее всего реализован в СУБД.
Либо небольшая хранимка, которая по паренту лезет до верха выплевывая свой путь.
...
Рейтинг: 0 / 0
Virtual TreeView - есть ли нормальное полное описание его работы?
    #39973334
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
svnvlad
Где это сказано? Сколько ни искал, везде приводятся примеры поиска только внутри дерева.

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

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

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

Давай-давай, включаем моск. А то будешь, как один из местных товарищей, который для поддержки древовидной структуры создавал невидимый TTreeView.
...
Рейтинг: 0 / 0
Virtual TreeView - есть ли нормальное полное описание его работы?
    #39973335
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
svnvlad
мысль искать в базе, строить путь к ветке, и потом мгновенно открывать - была, но руки не дошли, это надо придумать механизм запоминания и разворачивания этого пути.
- ыыы...

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

Солнце ещё высоко!
...
Рейтинг: 0 / 0
Virtual TreeView - есть ли нормальное полное описание его работы?
    #39973377
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman
svnvlad
это надо придумать механизм запоминания и разворачивания этого пути.

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

У меня даже есть эта хранимка, правда не для id, а для sequence_number, чтобы из локальных номеров строить полные, типа 5.2.1. Осталось написать такую же процедуру для дерева, только наоборот.
...
Рейтинг: 0 / 0
Virtual TreeView - есть ли нормальное полное описание его работы?
    #39973378
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А может у них есть демки для TreeView? Подсказал бы кто, где их искать?
Вот в вышеприведенных примерах по ссылке для заполнения дерева вот такой код:
Код: pascal
1.
2.
3.
4.
5.
RootNode := VST.AddChild(VST.RootNode);
if not (vsInitialized in RootNode.States) then
   VST.ReinitNode(RootNode, False);
Data := VST.GetNodeData(RootNode);
...


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


Кто знает, зачем они пишут ReinitNode?
...
Рейтинг: 0 / 0
Virtual TreeView - есть ли нормальное полное описание его работы?
    #39973387
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос сформулируй, конкретный.

Разве это вопросы:
svnvladVirtual TreeView - есть ли нормальное полное описание его работы?
svnvlad
Что же получается

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

?

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

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

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

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

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

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


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

Для поиска данных в структуре эти самые данные в этой структуре должны присутствовать. Или загрузи эти данные заранее, или подгружай их по ходу поиска, или ищи их там, где они уже есть (в базе данных).
...
Рейтинг: 0 / 0
Virtual TreeView - есть ли нормальное полное описание его работы?
    #39973826
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
Вопрос сформулируй, конкретный.

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

?

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

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

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

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


Метод GetNext() выполняет обход с заходом в детей, т.е., "рекурсивно".
Прямо в этих методах проверяется, был ли инициализирован узел ранее - если не был, для узла вызывается процедура инициализации, InitNode/InitChildren.
Это настоящее открытие. Я писал рекурсивную процедуру, и перебирал GenNextSibling.
...
Рейтинг: 0 / 0
Virtual TreeView - есть ли нормальное полное описание его работы?
    #39973845
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
svnvlad
На сайте производителя не нашел.

https://github.com/TurboPack/VirtualTreeView - в папке Help - не?
...
Рейтинг: 0 / 0
Virtual TreeView - есть ли нормальное полное описание его работы?
    #39974309
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad,

Полное описание - это исходники.
А они идут в комплекте.
...
Рейтинг: 0 / 0
Virtual TreeView - есть ли нормальное полное описание его работы?
    #39975954
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ъъъъъ
svnvlad
На сайте производителя не нашел.

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

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

https://github.com/JAM-Software/Virtual-TreeView - официальный репо
https://github.com/JAM-Software/Virtual-TreeView/tree/master/Demos - демки
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Virtual TreeView - есть ли нормальное полное описание его работы?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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