Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Как узнать, по какой колонке был клик в TListView?

01.01.2007

Метод GetItemAt позволяет получить координаты ListItem, по которой был клик, но только для первой колонки TListView. Если нужно узнать по какому элементу из другой колонки кликнул пользователь, то прийдётся объявить новый метод в наследованном классе:

uses ComCtrls;

 
type
 
TListViewX = class(TListView)
 
public
   
function GetItemAtX(X, Y: integer; var Col: integer): TListItem;
 
end;
 
implementation
 
function TListViewX.GetItemAtX(X, Y: integer;
   
var Col: integer): TListItem;
var
  i
, n, RelativeX, ColStartX: Integer;
 
ListItem: TlistItem;
begin
 
Result := GetItemAt(X, Y);
 
if Result <> nil then begin
   
Col := 0; // Первая колонка
 
end else if (ViewStyle = vsReport)
     
and (TopItem <> nil) then begin
   
// Первая, попробуем найти строку
   
ListItem := GetItemAt(TopItem.Position.X, Y);
   
if ListItem <> nil then begin
     
// Теперь попробуем найти колонку
     
RelativeX := X-ListItem.Position.X-BorderWidth;
     
ColStartX := Columns[0].Width;
      n
:= Columns.Count - 1;
     
for i := 1 to n do begin
       
if RelativeX < ColStartX then break;
       
if RelativeX <= ColStartX +
           
StringWidth(ListItem.SubItems[i-1]) then
       
begin
         
Result := ListItem;
         
Col := i;
         
break;
       
end;//if
       
Inc(ColStartX, Columns[i].Width);
     
end;//for
   
end;//if
 
end;//if
end;

А вот так выглядит событие 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 <> nil then
   
ShowMessage('Column #' + IntToStr(col));
end;

Взято из https://forum.sources.ru


function acGetItemAt(lsv: TListView; X, Y: integer; var Col: integer): TListItem;
// Получение по координатам элемента, над которым пользователь щелкнул.
{  Пример использования:
procedure TForm1
.ListView1MouseDown(Sender: TObject;
 
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  col
: Integer;
  li
: TListItem;
begin
  li
:= acGetItemAt(ListView1, x, y, col);
 
if li <> nil then ShowMessage('Column #' + IntToStr(col));
end;
}
var
  i
, RelativeX, ColStartX: Integer;
 
ListItem: TlistItem;
  HTI
: TLVHitTestInfo;
begin
 
Result:= lsv.GetItemAt(X, Y);
 
if Result <> nil then begin
   
Col:= 0; // Первая колонка
 
end
 
else if (lsv.ViewStyle = vsReport) and (lsv.TopItem <> nil) then begin
    HTI
.pt.x:= X;
    HTI
.pt.y:= Y;
    lsv
.Perform(LVM_SUBITEMHITTEST, 0, Integer(@HTI));
   
Col:= HTI.iSubItem;
   
Result:= lsv.Items[HTI.iItem];
 
end;
end;

procedure TFormMain.Listview1ColumnClick(Sender: TObject; Column: TListColumn);
 
var
   
ColumnNr: Integer;
 
begin
   
ColumnNr := Listview1.Column[Column.Index].Index;
   
ShowMessage(IntToStr(ColumnNr));
 
end;

Взято с сайта: https://www.swissdelphicenter.ch