powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / VirtualStringTree - ускорить перерисовку, избавившись от многократного OnChange
5 сообщений из 5, страница 1 из 1
VirtualStringTree - ускорить перерисовку, избавившись от многократного OnChange
    #39971845
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На событии OnChange висит процедура перечитывания нижней дочерней сетки (обычной DBGrid), зависящей от этого дерева.
Я заметил, что при формировании дерева на каждую запись дерева заново перечитывается нижняя сетка с данными. Если 100 элементов в дереве, то нижняя сетка перечитается 100 раз.
Возможно это связано с тем, что я поставил на события OnExpanded и OnCollapsed такой код:
Код: pascal
1.
2.
  Sender.FocusedNode := Node;
  Sender.Selected[Node] := true;


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

Можно ли применить что-то типа DisableControls / EnableControls, чтобы не срабатывало каждый раз OnChange на каждую запись, а только после полной перерисовки дерева?
...
Рейтинг: 0 / 0
VirtualStringTree - ускорить перерисовку, избавившись от многократного OnChange
    #39971854
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad,

BeginUpdate - EndUpdate
Virtual Treeview
...
Рейтинг: 0 / 0
VirtualStringTree - ускорить перерисовку, избавившись от многократного OnChange
    #39971860
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
svnvlad,

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

В онтаймере:
- стоптаймер
- активировать нижний грид
...
Рейтинг: 0 / 0
VirtualStringTree - ускорить перерисовку, избавившись от многократного OnChange
    #39971862
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45
svnvlad,

BeginUpdate - EndUpdate
Virtual Treeview

Это кстати там стоит, в процедуре заполнения дерева.
Но проблема в том, что я заполняю все ветки дерева данными сразу, даже те, которые закрыты. И для этого процедура заполнения дерева вызывается в OnInitNode. Соответственно, сколько дочерних веток, столько раз и вызывается процедура заполнения.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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;



Код: pascal
1.
2.
3.
4.
5.
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)
...
Рейтинг: 0 / 0
VirtualStringTree - ускорить перерисовку, избавившись от многократного OnChange
    #39975957
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
svnvlad
А то было по-дурацки. Нажимаешь плюсик, а потом еще отдельно нажать на саму ветку надо, чтобы курсор туда переместить. Вообще раздражает это дерево из-за таких вот многочисленных непродуманных вещей.

В проводнике так сделай и удивись. Далеко не всем нужно фокусировать узел при его раскрытии. Это даже более бесячее поведение
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / VirtualStringTree - ускорить перерисовку, избавившись от многократного OnChange
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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