如何检测TListView Group标题上的鼠标单击?

时间:2018-04-21 10:57:51

标签: listview delphi vcl delphi-10.1-berlin

我正在使用Delphi 10.1和VCL。如何检测点击或双击TListView中的组标题?不在列标题上。

2 个答案:

答案 0 :(得分:4)

对ListView进行子类化以捕获与点击相关的消息(WM_LBUTTON(DOWN|UP)WM_LBUTTONDBLCLK等),然后向ListView发送LVM_HITTEST消息,指定点击的客户端坐标。

根据文档,您必须将消息的wParam设置为-1才能获取组信息,这意味着您必须直接调用LVM_HITTEST发送SendMessage()消息,您可以不要使用ListView_HitTest()函数,它将wParam设置为0。

点击群组标题时,已填充的LVHITTESTINFO将启用LVHT_EX_GROUP_HEADER标记,iItem字段将成为群组索引。

答案 1 :(得分:0)

答案基于雷米(Remy)和维多利亚(Victoria)的评论,布米(Bummi)的旧答案位于https://www.entwickler-ecke.de/topic_ListViewEigenschaften+Delphi+vs+C+SubItems+auslesen_110307,0.html

该解决方案的评论很少:

  1. 子类是一个选项,但也可以通过Form的ListView1MouseDown事件来实现,这有点简单。
  2. tLVHitTestInfo和LVM_HITTEST在Winapi.CommCtrl中定义。

    Uses
      Winapi.CommCtrl; // For LVM_HITTEST
    
  3. LVHT_EX_GROUP_HEADER值应手动定义。我没有在任何Delphi单元中找到它。这是单击组标题的标识符。应该使用LVHitTestInfo.flags进行验证。对于Windows Vista及更高版本有效。

    const
      LVHT_EX_GROUP_HEADER = $10000000;
    
  4. LVHitTestInfo.iGroup不起作用!我不知道原因最初,我认为应该是Group索引。

该示例具有一个带有ListView的表单,其样式为ViewStyle = vsReport。鼠标单击组标题将调用带有组索引的消息对话框。这是详细的代码:

    Uses Winapi.CommCtrl;

    procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    const
      LVHT_EX_GROUP_HEADER = $10000000; // It is Valid for Windows Vista and above.
    var
      HTI: tLVHitTestInfo; // Defined on Winapi.CommCtrl
      nGroupInx: integer;
    begin
      HTI.pt     := point(X, Y); // Add cursor position
      nGroupInx  := SendMessage(ListView1.Handle, LVM_HITTEST, -1, LPARAM(@HTI)); // Return an Item
      if nGroupInx <> -1 then // Is an Item found?
        if (HTI.flags and LVHT_EX_GROUP_HEADER) = LVHT_EX_GROUP_HEADER then // Is it a Group Header?
            ShowMessage('Clicked Group header:' + ' ' + nGroupInx.ToString);
    end;