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

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

uses ComCtrls;

{©Drkb v.3(2007): www.drkb.ru}

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 (Item <> nil) then begin

  // Первая, попробуем найти строку

  ListItem := GetItemAt(Item.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;


Взято из http://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.Item <> 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;

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

Отправить комментарий

Проверка
Антиспам проверка
Image CAPTCHA
...