Проблема выделения ячеек в VirtualTreeView с несколькими столбцами и использованием стилей Windows Explorer
Введение
При работе с компонентом VirtualTreeView в среде разработки Delphi часто возникают вопросы, связанные с его внешним видом и функциональностью. Одной из таких проблем является некорректное отображение выделения ячеек при использовании нескольких столбцов и стилей Windows Explorer.
Описание проблемы
Пользователь столкнулся с проблемой, когда при использовании опции toUseExplorerTheme для создания приятного выделенного прямоугольника для VirtualStringTree, вертикальные границы выделения не отображались для внутренних ячеек столбцов, а также отсутствовали закругленные углы. Выделение корректно отображалось только для крайних ячеек. Проблема наблюдалась в Delphi 7 и XE2, и, вероятно, присутствует в других версиях среды разработки.
Пример кода для воспроизведения проблемы
Для воспроизведения проблемы необходимо добавить TVirtualStringTree на форму, показать заголовки, добавить несколько столбцов в заголовки, активировать опции toGridExtensions (MiscOptions), toUseExplorerTheme (PaintOptions), toExtendedFocus (SelectionOptions) и запустить программу. При клике на любую ячейку проблема станет очевидной.
Возможное решение
Пользователь предположил, что это может быть баг, и предложил решение, заключающееся в изменении кода метода PrepareCell класса TBaseVirtualTree. В коде процедуры DrawBackground необходимо изменить логику вызова DrawThemeBackground, чтобы корректно отображать выделение независимо от настроек toGridExtensions и toFullRowSelect.
Исправленный код
procedure DrawBackground(State: Integer);
begin
// Проверка условий для корректного отображения выделения
if not (toFullRowSelect in FOptions.FSelectionOptions) or (toGridExtensions in FOptions.FMiscOptions) then
DrawThemeBackground(Theme, PaintInfo.Canvas.Handle, TVP_TREEITEM, State, InnerRect, nil)
else
DrawThemeBackground(Theme, PaintInfo.Canvas.Handle, TVP_TREEITEM, State, RowRect, nil);
end;
Аналогичные изменения необходимо применить и в процедуре DrawThemedFocusRect.
Результаты
После внесения изменений в код, выделение в VirtualTreeView с несколькими столбцами и использованием стилей Windows Explorer будет отображаться корректно.
Заключение
Проблема выделения ячеек в виртуальном дереве с несколькими столбцами и стилями Windows Explorer является актуальной для разработчиков, использующих VirtualTreeView в своих проектах на Delphi. Предложенное решение позволяет устранить некорректное отображение выделения, сохранив при этом функциональность опции toGridExtensions. Пользователь также отметил, что проблема была задокументирована в виде Issue 376 и исправлена в ревизии r587, рекомендуется обновиться до этой версии для получения рабочего решения.
Проблема заключается в некорректном отображении выделения ячеек в VirtualTreeView с несколькими столбцами при использовании стилей Windows Explorer в среде разработки Delphi.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS