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;
关键说明
- 坐标转换:
EventInfo.Location返回的是屏幕坐标,必须用ScreenToClient转换为ListView的客户端坐标,才能准确命中项的区域。 - 命中测试:
GetItemAt方法会直接返回坐标点所在的TListViewItem对象,不管当前选中状态如何,这是最可靠的定位方式。 - 空值判断:一定要判断
TargetItem是否为nil,避免手势滑到ListView空白区域时触发错误。 - 虚拟模式兼容:如果你的ListView开启了
OwnerData=True的虚拟模式,这个方法依然有效,GetItemAt会返回对应位置的虚拟项对象。
内容的提问来源于stack exchange,提问作者mesutuk
相关产品推荐
相关产品推荐

