본문 바로가기

프로그래밍/Delphi

How to detect clicked item and column in TListView

How to detect clicked item and column in TListView

TListView에서 마우스가 클릭한 위치의 Item과 Cell Column을 인지하는 방법


Click된 컬럼은 Caption을 포함한 인덱스 값을 유지한다.

Item.Caption = column 0

Item.subitem[0] = column 1

Item.subitem[1] = column 2


TListView의 OnMouseDown 이벤트 핸들러를 이용할 수 있고 제공된 마우스 X,Y 좌표를 이용해 Item을 얻을 수 있고 SubItems의 각 CELL Width를 계산하여 클릭된 컬럼을 인지할 수 있다.


아래 사례는 "How to draw a checkbox to column in a TListView" 에 기술된 TListView의 특정 컬럼에 체크박스(TCheckBox)를 표시하는 예제와 더불어 사용자 Action에 의해 체크박스를 클릭하는 효과를 얻을 수 있다.


...
procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
   Item : TListItem;
   Column : Integer;
   W: Integer;
begin
   Item:= ListView1.GetItemAt(0, Y);
   if Assigned(Item) then
   begin
      W:= 0;
      Column := -1;
      repeat
         Inc(Column);
         Inc(W, ListView1.Columns[Column].Width);
      until X< W;

      if Column=2 then
      begin
        if Item.SubItems[1]='TRUE' then
          Item.SubItems[1] := 'FALSE'
        else
          Item.SubItems[1] := 'TRUE';
      end;

   end;
end;

...