如何在 Delphi FMX中确定列表视图上的哪个项目被滑动

ztigrdn8  于 2022-11-29  发布在  其他
关注(0)|答案(1)|浏览(141)

我想在 Delphi 11.1 Alexandra中左右滑动TListView对象中的一个项目。
我确实从标准手势中选择了左右手势,手势工作正常,但我无法确定到底是哪个项目滑动了。

procedure TTest.ListView1Gesture(Sender: TObject;
  const EventInfo: TGestureEventInfo; var Handled: Boolean);
begin
        Case EventInfo.GestureID of
             sgiLeft  :
                   begin
                       ListView1.Items.Delete(ListView1.Selected.Index);
                   end;
        End;
end;

我确实尝试过使用ListView1.Selected.Index,但不幸的是,它不稳定,因为有时手势出现在选择事件之前。
我也尝试过使用ListView1.ItemIndex,但没有机会。
请帮助,如果你有任何想法如何获得刷过的项目索引。
谢谢

bnl4lu3b

bnl4lu3b1#

感谢雷米的回答。请看我的方法如下

procedure TForm1.ListView1Gesture(Sender: TObject;
const EventInfo: TGestureEventInfo; var Handled: Boolean);
var
   R: TRectF;
   I: Integer;
   LStartItemIndex, LEndItemIndex : Integer;
begin    

     Case EventInfo.GestureID of
          sgiLeft  :
                    begin
                    //To find out the fist and the last item index of listview items on the screen
                    GetStartEndItemsIndex(ListView1, LStartItemIndex, LEndItemIndex);

                    //To idenfity the the item swiped to left 
                    for I := LStartItemIndex-1 to LEndItemIndex  do
                    begin
                          R := ListView1.GetItemRect(I);

                          if (R.Bottom > EventInfo.Location.Y) and (R.Top < EventInfo.Location.Y) then
                          begin
                              ListView1.Items.Delete(I); break;
                          end;
                    end;
end;

procedure TForm1.GetStartEndItemsIndex(const AListView : TListView; out AStartItemIndex : Integer; out AEndItemIndex : Integer);
var
   LViewportStart, LViewportEnd, LItemAbsEnd : Single;
   LItemIndex : Integer;
begin

   AStartItemIndex := -1;
   AEndItemIndex   := -1;

   LViewportStart := AListView.ScrollViewPos;
   LViewportEnd := AListView.Height + LViewportStart;

   for LItemIndex := 0 to AListView.Items.Count - 1 do
   begin
        LItemAbsEnd := AListView.GetItemRect(LItemIndex).Bottom + AListView.ScrollViewPos;
        if (AStartItemIndex < 0) and (LItemAbsEnd >= LViewportStart) then
        begin
           AStartItemIndex := LItemIndex;
        end;
        if (AStartItemIndex >= 0) and (AEndItemIndex < 0) and (LItemAbsEnd >= LViewportEnd) then
        begin
             AEndItemIndex := LItemIndex;
             Break;
        end;
    end;
    if (AEndItemIndex < 0) and (AListView.Items.Count > 0) then
    begin
       AEndItemIndex := AListView.Items.Count - 1;
    end;
 end;

相关问题