Using Delphi's drag and drop operations it is easy to implement rearranging multiple items in a TListView control.
Most MP3 (any multimedia) players allow arranging playlist using the technique provided below.
Drag and Drop Multiple Items Within a TListView
In the OnCreate event for the form, setup the ListView to allow multiple selection, change the view style to report, enable row selection and switch to automatic dragging.In the OnDragOver for ListView, accept only if items belong to the ListView from where they originated, that is Source = Sender.
In the OnDragDrop iterate through all the selected items and change their position.
//Form.OnCreate
procedure TListViewForm.FormCreate(Sender: TObject) ;
begin
ListView1.DragMode := dmAutomatic;
ListView1.RowSelect := true;
ListView1.MultiSelect := true;
ListView1.ViewStyle := vsReport;
end;
//ListView OnDragDrop
procedure TListViewForm.ListView1DragDrop(Sender, Source: TObject; X, Y: Integer) ;
var
currentItem, nextItem, dragItem, dropItem : TListItem;
begin
if Sender = Source then
begin
with TListView(Sender) do
begin
dropItem := GetItemAt(X, Y) ;
currentItem := Selected;
while currentItem <> nil do
begin
nextItem := GetNextItem(currentItem, SdAll, [IsSelected]) ;
if Assigned(dropItem) then
dragItem := Items.Insert(dropItem.Index)
else
dragItem := Items.Add;
dragItem.Assign(currentItem) ;
currentItem.Free;
currentItem := nextItem;
end;
end;
end;
end;
//ListView OnDragOver
procedure TListViewForm.ListView1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean) ;
begin
Accept := Sender = ListView1;
end;
Yes, that's it. The GetNextItem method returns the next selected item when the last parameter provided is IsSelected. The GetItemAt method returns the item where we want to drop all the selected ones.


