Метод 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 раздела Компоненты и Классы TListView может быть полезна для разработчиков на Delphi и FreePascal.
Комментарии и вопросы
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.