TVirtualStringTree - оптимизация переменной высоты строки
В нашем приложении я перехожу от компонента TStringGrid к компоненту TVirtualStringTree. Отображается много данных (макс. 50000 строк и 5 столбцов). Один столбец содержит одну или несколько строк текста. Мне удалось реализовать многострочный функционал, используя DrawCell в сетке строк с оптимальной производительностью: мгновенная перерисовка всех строк (при изменении размера) и прокрутка без заминок (у меня есть список высот строк в памяти, который будет обновляться при необходимости перерисовки),
Передача этой многострочной функциональности в VirtualStringTree не так эффективна, как альтернатива stringgrid. Я пробовал многочисленные реализации, но пока не удалось. Это легко воспроизвести в демонстрационном приложении установочного пакета VirtualStringTree:
- В форме "MultilineDemo" установите значение "rootNodeCount" для VirtualStringTree равным 10.000.
- При запуске демонстрации выберите "Автоматически настраивать высоту узла в соответствии с текстом узла".
Первоначальная перерисовка / перерисовка займет много времени при использовании большого количества процессора. При каждом изменении размера переход на верх / низ вызывает одно и то же явление или даже вызывает исключение "переполнение стека" (но это еще одна проблема...). Метод OnMeasureItem называется слишком часто, как я его вижу (даже в событиях MouseMove).
Кто-нибудь имел эту проблему и сумел найти решение?
1 ответ
Это легко воспроизвести в демонстрационном приложении установочного пакета VirtualStringTree.
По крайней мере, эта проблема с производительностью легко решается путём обращения к ReinitNode()
в BeginUpdate()
а также EndUpdate()
:
MLTree.BeginUpdate();
try
MLTree.ReinitNode(nil, True);
finally
MLTree.EndUpdate();
end;
Я немного переделал пример проекта и Virtual Treeview сегодня, теперь он работает гораздо плавнее. Просто попробуйте последний исходный код из GitHub.