Как сделать TListBox в Delphi так, чтобы пользователи могли менять порядок элементов с помощью мыши?

Вроде так

procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
accept:=true;
end;

procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer);
var Pos: TPoint;
begin
Pos.X:=X;
Pos.Y:=Y;
ListBox1.Items.Move(ListBox1.ItemIndex,ListBox1.ItemAtPos(Pos, true));
end;

надо еще: DragMode :=dmAutomatic;
ну и конечно надо проверки на собственный объект делать.

(c) Leg

А еще неплохо-бы показывать, куда вставляется строчка, и не давать уносить далеко...

implementation
{$R *.DFM}
uses CommCtrl;

procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept:=(Sender=Source);
with Sender as TListBox do DrawInsert(Parent.Handle,Handle, ItemAtPos(Point(X,Y), True));
end;

procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
with (Sender as TListBox) do begin
Items.Move(ItemIndex, ItemAtPos(Point(X,Y), True));
Parent.Refresh;
end;
ClipCursor(nil);
end;

procedure TForm1.ListBox1StartDrag(Sender: TObject; var DragObject: TDragObject);
var R:TRect;
begin
R:=(Sender as TControl).ClientRect;
with (Sender as TControl).ClientOrigin do OffsetRect(R,x,y);
ClipCursor(@R);
end;
procedure TForm1.ListBox1EndDrag(Sender, Target: TObject; X, Y: Integer);
begin
ClipCursor(nil);
end;


(c) Nashev

TopList Rambler's Top100