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

Откуда:
Сообщений: 2168
Есть процедура заполнения одного уровня дерева, назовем ее
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).
procedure GroupsTreeInitNode(Sender: TBaseVirtualTree;
  ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
begin
  FillLevel(Sender, Node);
end;

В дереве 5 уровней вложенности. Путем трассировки удалось выяснить следующее поведение:
На данный момент мы получаем заполненными первый видимый уровень и второй невидимый уровень. Ветки первого уровня отрисованы с "+" плюсиками. Однако это не значит, что заполнены остальные уровни. Заполнены только первый и второй.
Теперь щелкаем мышью по одной из веток первого уровня. Это приводит к вызову InitNode уже для дочерней невидимой ветки, и для всех ее подуровней на полную глубину. Хотя мы еще даже не открыли ветку, а просто поставили на нее курсор.
Так какова же логика вызова OnInitNode? В какой момент она вызывается?

Сообщение было отредактировано: 23 июн 20, 16:23
23 июн 20, 16:16    [22156119]     Ответить | Цитировать Сообщить модератору
 Re: VirtualStringTree - не могу понять, по какому принципу работает событие OnInitNode  [new]
svnvlad
Member

Откуда:
Сообщений: 2168
Первый раз OnInitNode вызывается только для первого уровня, а при клике на ветку вдруг собирает ВСЕ ее дочерние ветки на полную глубину. В чем логика?
23 июн 20, 16:27    [22156133]     Ответить | Цитировать Сообщить модератору
 Re: VirtualStringTree - не могу понять, по какому принципу работает событие OnInitNode  [new]
goldmi45
Member

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

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

Вроде как очевидна. В момент инициализации ноды. В коде в вызвали ATree.AddChild - момент инициализации ноды наступил.
Обычно в этот момент назначают флаги уже созданной ноде. К примеру, можно не заполнять 2 уровень, а чтобы плюсик был, достаточно указать vsHasChildren.
23 июн 20, 16:37    [22156143]     Ответить | Цитировать Сообщить модератору
 Re: VirtualStringTree - не могу понять, по какому принципу работает событие OnInitNode  [new]
svnvlad
Member

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

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

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

Которой, той которая Child?
Но трассировка это не подтверждает. OnInitNode вызывается только для первого уровня. А для Child-ов не вызывается.
23 июн 20, 16:46    [22156147]     Ответить | Цитировать Сообщить модератору
 Re: VirtualStringTree - не могу понять, по какому принципу работает событие OnInitNode  [new]
svnvlad
Member

Откуда:
Сообщений: 2168
goldmi45

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

А заполнять в какой момент? OnExpanding?
24 июн 20, 15:27    [22156598]     Ответить | Цитировать Сообщить модератору
 Re: VirtualStringTree - не могу понять, по какому принципу работает событие OnInitNode  [new]
goldmi45
Member

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

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

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

Да
25 июн 20, 08:31    [22156927]     Ответить | Цитировать Сообщить модератору
 Re: VirtualStringTree - не могу понять, по какому принципу работает событие OnInitNode  [new]
svnvlad
Member

Откуда:
Сообщений: 2168
goldmi45
svnvlad
пропущено...

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

Да

Сделал так, что процедура заполнения уровня ChangeQueryGroup(Aparent: PVirtualNode) заполняет уровень и назначает ноде статус vsHasChildren, если есть дочерние, а на событие OnInitChildren и на событие OnExpanding повесил процедуру заполнения нижнего уровня для данной родительской ветки ChangeQueryGroup(Node).
Теперь если нажимаю на плюсик - заполняется и открывается дочерний уровень. Но если нажимаю просто на ветку, дочерний уровень заполняется, но плюсик исчезает, и ветку невозможно открыть. Почему так?

Сообщение было отредактировано: 3 июл 20, 08:18
3 июл 20, 08:19    [22161386]     Ответить | Цитировать Сообщить модератору
 Re: VirtualStringTree - не могу понять, по какому принципу работает событие OnInitNode  [new]
svnvlad
Member

Откуда:
Сообщений: 2168
Понял, кроме vsHasChildren надо еще указывать ChildCount.
  Include(Node.States, vsHasChildren);
  Node.ChildCount := q.Q.FieldByName('c').AsInteger;
3 июл 20, 08:44    [22161394]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить