Wie es möglich ist, alle selektierten Einträge einer ListBox mit der Maus zu verschieben, zeigt
bitsetter in
diesem Beitrag. Dies funktioniert mit und ohne aktiviertem
MultiSelect.
Hierfür muss
DragMode auf
dmAutomatic stehen.
Delphi-Quellcode:
procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState;
var Accept: Boolean);
var
verschieben, ItemPos, i: integer;
begin
Accept := false;
if not (Source
is TListBox)
then
Exit;
if (Source
as TListBox).MultiSelect
then
begin
if (Source
as TListBox).SelCount < 0
then
Exit;
end else begin
if ((Source
as TListBox).ItemIndex < 0)
then
Exit;
end;
with Source
as TListBox
do
begin
ItemPos := ItemAtPos(point(x,y), true);
if (ItemPos < 0)
or (ItemPos >= Items.Count)
then
Exit;
if Selected[ItemPos]
then
ItemIndex := ItemPos;
verschieben := ItemIndex - ItemPos;
if verschieben <> 0
then
begin
if verschieben > 0
then
i := 0
else
i := pred(Items.Count);
while (i >= 0)
and (i < Items.Count)
do
begin
if Selected[i]
then
begin
if (i-verschieben >= 0)
and (i-verschieben < Items.Count)
then
begin
Items.Move(i, i-verschieben);
Selected[i]:=false;
Selected[i-verschieben]:=true;
end else begin
break;
end;
// if
end;
// if
if verschieben > 0
then
inc(i)
else
dec(i);
end;
// while
end;
// if
end;
// with
Accept := true;
end;
Edit: Chakotays Ergänzung hinzugefügt.