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

Откуда:
Сообщений: 2168
На событии OnChange висит процедура перечитывания нижней дочерней сетки (обычной DBGrid), зависящей от этого дерева.
Я заметил, что при формировании дерева на каждую запись дерева заново перечитывается нижняя сетка с данными. Если 100 элементов в дереве, то нижняя сетка перечитается 100 раз.
Возможно это связано с тем, что я поставил на события OnExpanded и OnCollapsed такой код:
  Sender.FocusedNode := Node;
  Sender.Selected[Node] := true;

Чтобы объединить действие раскрытия ветки с действием фокусировки на этой ветке. А то было по-дурацки. Нажимаешь плюсик, а потом еще отдельно нажать на саму ветку надо, чтобы курсор туда переместить. Вообще раздражает это дерево из-за таких вот многочисленных непродуманных вещей. Ладно, теперь у меня при открытии ветки курсор всегда бегает за мышью - где щелкаю, туда и встает. Но OnChange вызывается каждый раз.

Можно ли применить что-то типа DisableControls / EnableControls, чтобы не срабатывало каждый раз OnChange на каждую запись, а только после полной перерисовки дерева?
22 июн 20, 14:20    [22155162]     Ответить | Цитировать Сообщить модератору
 Re: VirtualStringTree - ускорить перерисовку, избавившись от многократного OnChange  [new]
goldmi45
Member

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

BeginUpdate - EndUpdate
Virtual Treeview
22 июн 20, 14:32    [22155172]     Ответить | Цитировать Сообщить модератору
 Re: VirtualStringTree - ускорить перерисовку, избавившись от многократного OnChange  [new]
ъъъъъ
Member

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

повесь код влияния на нижний грид не в ончанже, а в таймере (на 0.3 сек). А в ончанже:
стоптаймер
старттаймер

В онтаймере:
- стоптаймер
- активировать нижний грид
22 июн 20, 14:40    [22155180]     Ответить | Цитировать Сообщить модератору
 Re: VirtualStringTree - ускорить перерисовку, избавившись от многократного OnChange  [new]
svnvlad
Member

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

BeginUpdate - EndUpdate
Virtual Treeview

Это кстати там стоит, в процедуре заполнения дерева.
Но проблема в том, что я заполняю все ветки дерева данными сразу, даже те, которые закрыты. И для этого процедура заполнения дерева вызывается в OnInitNode. Соответственно, сколько дочерних веток, столько раз и вызывается процедура заполнения.
procedure TfmRepairObject.ChangeQueryPrvGroup(ATree: TBaseVirtualTree; Parent: PVirtualNode);
var
  group: PGroup;
  n: PVirtualNode;
  c: string;
  q: TBISMySQLQuery;
begin
  try
    ATree.BeginUpdate;
..................
..................
  finally
    ATree.EndUpdate;
    ATree.FocusedNode := ATree.GetFirst;
    ATree.Selected[ATree.FocusedNode] := true;
  end;
end;


procedure TfmRepairObject.GroupsTreePrvPInitNode(Sender: TBaseVirtualTree;
  ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
begin
  ChangeQueryPrvGroup(Sender, Node);
end;


А полностью дерево заполняется (а не по мере необходимости) - для того, чтобы можно было осуществить такое поведение:
Когда мы сфокусированы на родительской ветке, то в нижней дочерней сетке отображаются все данные этой ветки и все данные ее дочерних веток. А при фокусировке на дочерней ветке в нижней сетке уже отфильтровываются лишние записи, остаются только относящиеся к сфокусированной ветке и ее дочерних, и так далее.

В нижней сетке это осуществляется таким образом: дерево прочитывается рекурсивно от текущей ветки вниз и составляется список id веток через запятую, а потом в нижней сетке в запрос подставляется как WHERE group_id IN (1,2,3,4,5)
22 июн 20, 14:47    [22155182]     Ответить | Цитировать Сообщить модератору
 Re: VirtualStringTree - ускорить перерисовку, избавившись от многократного OnChange  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 319
svnvlad
А то было по-дурацки. Нажимаешь плюсик, а потом еще отдельно нажать на саму ветку надо, чтобы курсор туда переместить. Вообще раздражает это дерево из-за таких вот многочисленных непродуманных вещей.

В проводнике так сделай и удивись. Далеко не всем нужно фокусировать узел при его раскрытии. Это даже более бесячее поведение
3 июл 20, 15:18    [22161692]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить