如何在ListView的MouseDown事件中获取当前X,Y位置的Item?要求:
RowSelect := False;
Style := vsReport
第一列的宽度为0

解决方案 »

  1.   

    var
      a: TListItem; a := listView1.GetItemAt(X, Y);
      

  2.   

    因为第一列的宽度为0,不能用GetItemAt(X, Y)。
    这样判断:
    procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
      r: TRect;
      i, h: Integer;
    begin
      if ListView1.Items.Count = 0 then Exit;
      r := ListView1.Items[0].DisplayRect(drBounds);
      h := r.Bottom - r.Top;  // item高度
      for i := 0 to ListView1.Items.Count - 1 do begin
        if (Y >= ListView1.Items[i].Top) and
           (Y <= ListView1.Items[i].Top + h)
        then begin  // 取得item
          ShowMessage(ListView1.Items[i].Caption);
          Break;
        end;
      end;
    end;
      

  3.   

    to All
      Thanksto sysu(死树):
      Good. It's right