Delphi: Shift-Up and Shift-Down in Listview

Is there a function in a Listview control to move items up and down?

+4
source share
2 answers

I didnโ€™t work very much with TListView (I mainly use database grids), I took your question as a chance to learn something. The result of this is the following code, it is more visually focused on David's answer. It has some limitations: it will only move the first selected item, and while it moves the item, the display for vsIcon and vsSmallIcon is strange after moving.

procedure TForm1.btnDownClick(Sender: TObject); var Index: integer; temp : TListItem; begin // use a button that cannot get focus, such as TSpeedButton if ListView1.Focused then if ListView1.SelCount>0 then begin Index := ListView1.Selected.Index; if Index<ListView1.Items.Count then begin temp := ListView1.Items.Insert(Index+2); temp.Assign(ListView1.Items.Item[Index]); ListView1.Items.Delete(Index); // fix display so moved item is selected/focused ListView1.Selected := temp; ListView1.ItemFocused := temp; end; end; end; procedure TForm1.btnUpClick(Sender: TObject); var Index: integer; temp : TListItem; begin // use a button that cannot get focus, such as TSpeedButton if ListView1.Focused then if ListView1.SelCount>0 then begin Index := ListView1.Selected.Index; if Index>0 then begin temp := ListView1.Items.Insert(Index-1); temp.Assign(ListView1.Items.Item[Index+1]); ListView1.Items.Delete(Index+1); // fix display so moved item is selected/focused ListView1.Selected := temp; ListView1.ItemFocused := temp; end; end; end; 
+4
source

You have two options:

  • Remove them, and then reinsert them in a new place.
  • Use the virtual list view and move them in your data structure.

My procedure for executing the first of these parameters looks 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 SetListItemValues method SetListItemValues used to populate the list columns.

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

+3
source

Source: https://habr.com/ru/post/1343520/


All Articles