Метод GetItemAt позволяет получить координаты ListItem, по которой был клик, но только для первой колонки TListView. Если нужно узнать по какому элементу из другой колонки кликнул пользователь, то прийдётся объявить новый метод в наследованном классе:
uses ComCtrls;
type
TListViewX = class(TListView)
publicfunction GetItemAtX(X, Y: integer; var Col: integer): TListItem;
end;
implementationfunction TListViewX.GetItemAtX(X, Y: integer;
var Col: integer): TListItem;
var
i, n, RelativeX, ColStartX: Integer;
ListItem: TlistItem;
begin
Result := GetItemAt(X, Y);
if Result <> nilthenbegin
Col := 0; // Первая колонкаendelseif (ViewStyle = vsReport)
and (TopItem <> nil) thenbegin// Первая, попробуем найти строку
ListItem := GetItemAt(TopItem.Position.X, Y);
if ListItem <> nilthenbegin// Теперь попробуем найти колонку
RelativeX := X - ListItem.Position.X - BorderWidth;
ColStartX := Columns[0].Width;
n := Columns.Count - 1;
for i := 1 to n dobeginif RelativeX < ColStartX then break;
if RelativeX <= ColStartX +
StringWidth(ListItem.SubItems[i - 1]) thenbegin
Result := ListItem;
Col := i;
break;
end; //if
Inc(ColStartX, Columns[i].Width);
end; //forend; //ifend; //ifend;
А вот так выглядит событие MouseDown:
procedure TForm1.ListView1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
col: integer;
li: TListItem;
begin
li := TListViewX(ListView1).GetItemAtX(x, y, col);
if li <> nilthen
ShowMessage('Column #' + IntToStr(col));
end;
Код, который вы предоставили, - это кастомное реализация компонента TListView в Delphi, добавляющая новый метод под названием GetItemAtX. Этот метод позволяет получить элемент на конкретной позиции (X, Y) и индексе столбца.
Цель этого метода - обрабатывать клики мыши на различных столбцах списка. Оригинальный метод GetItemAt возвращает только элемент на кликнутой позиции для первого столбца, но ваш кастомный код позволяет указать, какой столбец проверять.
В примере кода обработчик события MouseDown использует этот новый метод, чтобы получить элемент на кликнутой позиции и определить, какой столбец был кликнут. Затем он отображает сообщение с номером кликнутого столбца.
Следующий разбор того, как работает код:
Кастомный метод GetItemAtX вызывается с координатами X и Y клика мыши, а также переменной Col, которая хранит индекс столбца.
Если элемент на указанной позиции не null, то это означает, что клик был на первом столбце, поэтому метод возвращает элемент и устанавливает Col в 0 (первый столбец).
Если стиль просмотра - report-style и есть элементы в списке, метод пытается найти строку на верху кликнутой позиции.
Для каждого последующего столбца он проверяет, падает ли относительная координата X внутри границ ширины этого столбца. Если это так, то он устанавливает Col в текущий индекс столбца и выходит из цикла.
Кастомное реализация используется в обработчике события MouseDown, чтобы получить элемент на кликнутой позиции и определить, какой столбец был кликнут. Результат - сообщение с номером кликнутого столбца.
В целом, этот код предоставляет полезное расширение к оригинальному компоненту TListView, позволяя разработчикам легко определять, какой столбец был кликнут на контроле списка.
Получение координат клика в TListView позволяет узнать по какой колонке был выполнен клик, для этого можно объявить новый метод в наследованном классе TListView.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.