powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / VirtualStringTree - не могу понять, по какому принципу работает событие OnInitNode
8 сообщений из 8, страница 1 из 1
VirtualStringTree - не могу понять, по какому принципу работает событие OnInitNode
    #39972472
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть процедура заполнения одного уровня дерева, назовем ее
Код: 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.
procedure FillLevel(Parent: PVirtualNode);
var
  group: PGroup;
  n: PVirtualNode;
begin
  if Parent <> nil then // Это не корневая группа
      begin
        group := ATree.GetNodeData(Parent);
        ATree.DeleteChildren(Parent);
      end
  else
        group.id := 0;

  Q.SQL.Text := 'SELECT * FROM... WHERE up_id = ' + group.id;
  ....
  while not Q.EOF do
      begin
          n := ATree.AddChild(Parent);
          group := ATree.GetNodeData(n);
          group.id := Q.FieldByName('id').AsInteger;
          group.up_id := Q.FieldByName('up_id').AsInteger;
          group.name := Q.FieldByName('name').AsString;
          Q.Next;
      end;
end;


При первом вызове FillLevel происходит вызов InitNode для каждого узла первого видимого уровня.
В OnInitNode прописан вызов FillLevel(этой самой Node).
Код: pascal
1.
2.
3.
4.
5.
procedure GroupsTreeInitNode(Sender: TBaseVirtualTree;
  ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
begin
  FillLevel(Sender, Node);
end;


В дереве 5 уровней вложенности. Путем трассировки удалось выяснить следующее поведение:
На данный момент мы получаем заполненными первый видимый уровень и второй невидимый уровень. Ветки первого уровня отрисованы с "+" плюсиками. Однако это не значит, что заполнены остальные уровни. Заполнены только первый и второй.
Теперь щелкаем мышью по одной из веток первого уровня. Это приводит к вызову InitNode уже для дочерней невидимой ветки, и для всех ее подуровней на полную глубину. Хотя мы еще даже не открыли ветку, а просто поставили на нее курсор.
Так какова же логика вызова OnInitNode? В какой момент она вызывается?
...
Рейтинг: 0 / 0
VirtualStringTree - не могу понять, по какому принципу работает событие OnInitNode
    #39972482
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первый раз OnInitNode вызывается только для первого уровня, а при клике на ветку вдруг собирает ВСЕ ее дочерние ветки на полную глубину. В чем логика?
...
Рейтинг: 0 / 0
VirtualStringTree - не могу понять, по какому принципу работает событие OnInitNode
    #39972491
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad

Так какова же логика вызова OnInitNode? В какой момент она вызывается?

Вроде как очевидна. В момент инициализации ноды. В коде в вызвали ATree.AddChild - момент инициализации ноды наступил.
Обычно в этот момент назначают флаги уже созданной ноде. К примеру, можно не заполнять 2 уровень, а чтобы плюсик был, достаточно указать vsHasChildren.
...
Рейтинг: 0 / 0
VirtualStringTree - не могу понять, по какому принципу работает событие OnInitNode
    #39972494
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45
svnvlad

Так какова же логика вызова OnInitNode? В какой момент она вызывается?

Вроде как очевидна. В момент инициализации ноды. В коде в вызвали ATree.AddChild - момент инициализации ноды наступил.

Которой, той которая Child?
Но трассировка это не подтверждает. OnInitNode вызывается только для первого уровня. А для Child-ов не вызывается.
...
Рейтинг: 0 / 0
VirtualStringTree - не могу понять, по какому принципу работает событие OnInitNode
    #39972777
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45

К примеру, можно не заполнять 2 уровень, а чтобы плюсик был, достаточно указать vsHasChildren.

А заполнять в какой момент? OnExpanding?
...
Рейтинг: 0 / 0
VirtualStringTree - не могу понять, по какому принципу работает событие OnInitNode
    #39972991
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad
goldmi45

К примеру, можно не заполнять 2 уровень, а чтобы плюсик был, достаточно указать vsHasChildren.

А заполнять в какой момент? OnExpanding?

Да
...
Рейтинг: 0 / 0
VirtualStringTree - не могу понять, по какому принципу работает событие OnInitNode
    #39975779
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45
svnvlad
пропущено...

А заполнять в какой момент? OnExpanding?

Да

Сделал так, что процедура заполнения уровня ChangeQueryGroup(Aparent: PVirtualNode) заполняет уровень и назначает ноде статус vsHasChildren, если есть дочерние, а на событие OnInitChildren и на событие OnExpanding повесил процедуру заполнения нижнего уровня для данной родительской ветки ChangeQueryGroup(Node).
Теперь если нажимаю на плюсик - заполняется и открывается дочерний уровень. Но если нажимаю просто на ветку, дочерний уровень заполняется, но плюсик исчезает, и ветку невозможно открыть. Почему так?
...
Рейтинг: 0 / 0
VirtualStringTree - не могу понять, по какому принципу работает событие OnInitNode
    #39975782
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понял, кроме vsHasChildren надо еще указывать ChildCount.
Код: pascal
1.
2.
  Include(Node.States, vsHasChildren);
  Node.ChildCount := q.Q.FieldByName('c').AsInteger;
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / VirtualStringTree - не могу понять, по какому принципу работает событие OnInitNode
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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