TVirtualStringTree - оптимизация переменной высоты строки

В нашем приложении я перехожу от компонента TStringGrid к компоненту TVirtualStringTree. Отображается много данных (макс. 50000 строк и 5 столбцов). Один столбец содержит одну или несколько строк текста. Мне удалось реализовать многострочный функционал, используя DrawCell в сетке строк с оптимальной производительностью: мгновенная перерисовка всех строк (при изменении размера) и прокрутка без заминок (у меня есть список высот строк в памяти, который будет обновляться при необходимости перерисовки),

Передача этой многострочной функциональности в VirtualStringTree не так эффективна, как альтернатива stringgrid. Я пробовал многочисленные реализации, но пока не удалось. Это легко воспроизвести в демонстрационном приложении установочного пакета VirtualStringTree:

  1. В форме "MultilineDemo" установите значение "rootNodeCount" для VirtualStringTree равным 10.000.
  2. При запуске демонстрации выберите "Автоматически настраивать высоту узла в соответствии с текстом узла".

Первоначальная перерисовка / перерисовка займет много времени при использовании большого количества процессора. При каждом изменении размера переход на верх / низ вызывает одно и то же явление или даже вызывает исключение "переполнение стека" (но это еще одна проблема...). Метод OnMeasureItem называется слишком часто, как я его вижу (даже в событиях MouseMove).

Кто-нибудь имел эту проблему и сумел найти решение?

1 ответ

Это легко воспроизвести в демонстрационном приложении установочного пакета VirtualStringTree.

По крайней мере, эта проблема с производительностью легко решается путём обращения к ReinitNode() в BeginUpdate() а также EndUpdate():

 MLTree.BeginUpdate();
  try
    MLTree.ReinitNode(nil, True);
  finally
    MLTree.EndUpdate();
  end;

Я немного переделал пример проекта и Virtual Treeview сегодня, теперь он работает гораздо плавнее. Просто попробуйте последний исходный код из GitHub.

Другие вопросы по тегам