Обнаружение клика по заголовку группы в TListView в Delphi 10.1
При работе с компонентом TListView в Delphi 10.1 и использовании VCL, может возникнуть задача обнаружения клика или двойного клика по заголовку группы, а не по заголовку столбца. Для решения этой задачи можно использовать несколько подходов, но в данной статье мы рассмотрим метод подклассования компонента для перехвата сообщений, связанных с кликом.
Описание проблемы
Иногда разработчикам необходимо обнаружить клик или двойной клик по заголовку группы в TListView, чтобы выполнить определенные действия. Стандартные события, такие как NM_CLICK или NM_DBCLK, не генерируются при клике по заголовку группы, поэтому нужно использовать другой подход.
Решение проблемы
Подклассование TListView позволяет перехватить сообщения, связанные с кликом мыши, такие как WM_LBUTTONDOWN, WM_LBUTTONUP и WM_LBUTTONDBLCLK. После этого можно отправить сообщение LVM_HITTEST компоненту TListView, указав клиентские координаты клика. Это сообщение позволит определить, была ли кликнута именно группа.
Согласно документации, для получения информации о группе необходимо установить параметр wParam сообщения LVM_HITTEST в -1. Это означает, что для отправки сообщения нужно использовать функцию SendMessage(), а не ListView_HitTest(), которая по умолчанию устанавливает wParam в 0.
При клике на заголовок группы структура LVHITTESTINFO будет содержать флаг LVHT_EX_GROUP_HEADER, что указывает на клик по заголовку группы, а поле iItem будет содержать индекс группы.
Пример кода
Uses Winapi.CommCtrl;
procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
const
LVHT_EX_GROUP_HEADER = $10000000; // Для Windows Vista и выше.
var
HTI: tLVHitTestInfo; // Определено в Winapi.CommCtrl
nGroupInx: Integer;
begin
HTI.pt := Point(X, Y); // Добавление позиции курсора
nGroupInx := SendMessage(ListView1.Handle, LVM_HITTEST, -1, LPARAM(@HTI)); // Возвращает индекс элемента
if nGroupInx <> -1 then // Найден ли элемент?
if (HTI.flags and LVHT_EX_GROUP_HEADER) = LVHT_EX_GROUP_HEADER then // Это заголовок группы?
ShowMessage('Клик по заголовку группы: ' + nGroupInx.ToString);
end;
Важные замечания
Подклассование - это один из способов решения задачи, но также можно использовать событие ListView1MouseDown формы, что может быть проще.
Константа LVHT_EX_GROUP_HEADER должна быть определена вручную, так как она не присутствует в стандартных единицах Delphi. Эта константа используется для проверки флагов LVHitTestInfo.flags и является действительной для Windows Vista и выше.
Поле LVHitTestInfo.iGroup не работает корректно и, возможно, не отображает индекс группы. Это следует учитывать при использовании кода.
Используя приведенный пример, можно обнаружить клик по заголовку группы в TListView и выполнить необходимые действия, например, отобразить сообщение с индексом группы.
Вопрос связан с программированием компонента TListView в Delphi 10.1, где необходимо обнаружить клик по заголовку группы, а не столбца, и для этого используется подклассование компонента для перехвата соответствующих сообщений мыши.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.