VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3472|回复: 11

请问 listview 怎么知道,鼠标点击的是哪一列?

[复制链接]

1

主题

6

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2020-1-30 11:00:01 | 显示全部楼层 |阅读模式
如题,谢谢!
回复

使用道具 举报

1

主题

6

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
 楼主| 发表于 2020-3-7 10:15:01 | 显示全部楼层
listview 是 vsReport 类型的
回复

使用道具 举报

0

主题

4

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-3-7 23:15:01 | 显示全部楼层
Column 的 Index 可以知道你点的是哪一个
回复

使用道具 举报

1

主题

6

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
 楼主| 发表于 2020-3-9 14:45:02 | 显示全部楼层
这要怎么用呢?

ListView.Column  ??

ListView.Selected.Column ??

还是在哪个事件里呢?

回复

使用道具 举报

1

主题

13

帖子

11.00

积分

新手上路

Rank: 1

积分
11.00
发表于 2020-3-10 19:00:01 | 显示全部楼层
看看老外写的。

Extended GetItemAt

This method (GetItemAt) only provides the information about which ListItem (if any) is located at the specified coordinates passed as parameters, but only works with the first column of the TListView. The rest are ignored. If we needed to know if the user clicked on an element in another column, we can declare a new method in a derived class:

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; // First column
  end else if (ViewStyle = vsReport)
      and (TopItem <> nil) then begin
    // First, let's try to find the row
    ListItem := GetItemAt(TopItem.Position.X, Y);
    if ListItem <> nil then begin
      // Now let's try to find the Column
      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;

Casting to the new class

We don't need to intall this new component and register it in the components palette as we explained in another article. Instead, any time we want to access this method, we can just cast the object (for example ListView1) to our new class. For example in a MouseDown event:

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;
回复

使用道具 举报

1

主题

6

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
 楼主| 发表于 2020-3-20 23:15:01 | 显示全部楼层
不太准,有的可以,有的不行啊

回复

使用道具 举报

1

主题

6

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
 楼主| 发表于 2020-3-25 13:45:01 | 显示全部楼层
大部份都是第0列

回复

使用道具 举报

1

主题

13

帖子

11.00

积分

新手上路

Rank: 1

积分
11.00
发表于 2020-4-14 06:45:01 | 显示全部楼层
修改了一下:
function TListViewX.GetItemAtX(X, Y: integer;
  var Col: integer): TListItem;
var
  i, n, RelativeX, ColStartX: Integer;
  ListItem: TlistItem;
  OldRowSelect:Boolean;
  Found:Boolean;
begin
  Result := GetItemAt(X, Y);
  if (not RowSelect) and (Result <> nil) then
  begin
    Col := 0; // First column
  end
  else if (ViewStyle = vsReport)
    and (TopItem <> nil) then
  begin
    // First, let's try to find the row
    //ListItem := GetItemAt(TopItem.Position.X, Y);

    //save rowselect setting
    OldRowSelect := RowSelect;
    RowSelect := True;
    ListItem := GetItemAt(X, Y);
    //Restore rowselect setting;
    RowSelect := OldRowSelect;

    if ListItem <> nil then
    begin
      // Now let's try to find the Column
      RelativeX := X - ListItem.Position.X - BorderWidth;
//      ColStartX := Columns[0].Width;
      ColStartX:=0;
      n := Columns.Count - 1;
      for i := 0 to n do
      begin
        if RelativeX < ColStartX + Columns[i].Width then
        begin
          Result:=ListItem;
          Col:=i;
          break;
        end;
{        if RelativeX <= ColStartX +
          StringWidth(ListItem.SubItems[i - 1]) then
        begin
          Result := ListItem;
          Col := i;
          break;
        end; //if}
        Inc(ColStartX, Columns[i].Width);
      end; //for
//      Col:=i;
    end; //if
  end; //if
end;
回复

使用道具 举报

0

主题

4

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-4-16 02:15:01 | 显示全部楼层
在Listview的 cloumnonclick事件里有cloumn 可以直接用的

你只要用它的cloumn.index就能知道点的是哪一个了
回复

使用道具 举报

0

主题

1

帖子

1.00

积分

新手上路

Rank: 1

积分
1.00
发表于 2020-4-17 13:11:46 | 显示全部楼层
listview.Selected 就可以了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表