Delphi: Shift-Up and Shift-Down in the Listview

后端 未结 2 569
逝去的感伤
逝去的感伤 2021-01-14 01:43

Is there a feature in the Listview control to shift items up and down?

2条回答
  •  臣服心动
    2021-01-14 02:35

    You have two options:

    • Delete them and then re-insert them at the new location.
    • Use a virtual list view and move them in your data structure.

    My routine for doing the first of these options is like this:

    procedure TBatchTaskList.MoveTasks(const Source: array of TListItem; Target: TListItem);
    var
      i, InsertIndex: Integer;
    begin
      Assert(IsMainThread);
      BeginUpdate;
      Try
        //work out where to move them
        if Assigned(Target) then begin
          InsertIndex := FListItems.IndexOf(Target);
        end else begin
          InsertIndex := FListItems.Count;
        end;
    
        //create new items for each moved task
        for i := 0 to high(Source) do begin
          SetListItemValues(
            FListItems.Insert(InsertIndex+i),
            TBatchTask(Source[i].Data)
          );
          Source[i].Data := nil;//handover ownership to the new item
        end;
    
        //set selection and focus item to give feedback about the move
        for i := 0 to high(Source) do begin
          FListItems[InsertIndex+i].Selected := Source[i].Selected;
        end;
        FBatchList.ItemFocused := FListItems[InsertIndex];
    
        //delete the duplicate source tasks
        for i := 0 to high(Source) do begin
          Source[i].Delete;
        end;
      Finally
        EndUpdate;
      End;
    end;
    

    The method SetListItemValues is used to populate the columns of the list view.

    This is a perfect example of why virtual controls are so great.

提交回复
热议问题