You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi 11.1 Alexandra中如何确定TListView被左右滑动的列表项?

解决Delphi 11.1 TListView滑动手势无法定位目标项的问题

这个问题我之前也碰到过——依赖Selected.Index或ItemIndex确实不稳定,因为手势事件的触发时机往往早于ListView的选中状态更新。解决的核心思路是直接通过手势发生的坐标来定位对应的列表项,完全绕开选中状态的依赖。

具体实现代码

procedure TTest.ListView1Gesture(Sender: TObject; const EventInfo: TGestureEventInfo; var Handled: Boolean);
var
  ClientPos: TPoint;
  TargetItem: TListViewItem;
begin
  Case EventInfo.GestureID of
    sgiLeft : begin
      // 将手势的屏幕坐标转换为ListView的客户端坐标系
      ClientPos := ListView1.ScreenToClient(Point(EventInfo.Location.X, EventInfo.Location.Y));
      // 根据坐标命中对应的列表项
      TargetItem := ListView1.GetItemAt(ClientPos.X, ClientPos.Y);
      
      if Assigned(TargetItem) then
      begin
        // 执行你需要的操作,比如删除该项
        ListView1.Items.Delete(TargetItem.Index);
        Handled := True; // 标记手势已被处理,避免后续默认逻辑干扰
      end;
    end;
    sgiRight: begin
      // 这里可以添加右滑对应的业务逻辑
      Handled := True;
    end;
  End;
end;

关键说明

  1. 坐标转换:EventInfo.Location返回的是屏幕坐标,必须用ScreenToClient转换为ListView的客户端坐标,才能准确命中项的区域。
  2. 命中测试:GetItemAt方法会直接返回坐标点所在的TListViewItem对象,不管当前选中状态如何,这是最可靠的定位方式。
  3. 空值判断:一定要判断TargetItem是否为nil,避免手势滑到ListView空白区域时触发错误。
  4. 虚拟模式兼容:如果你的ListView开启了OwnerData=True的虚拟模式,这个方法依然有效,GetItemAt会返回对应位置的虚拟项对象。

内容的提问来源于stack exchange,提问作者mesutuk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 18:42:33