Перемещение:
Код:
type
TLBMove = (mUp, mDown);
procedure ListBoxMoveItem(AListBox : TListBox; ADirection : TLBMove);
var
NewIdx : Integer;
begin
If ADirection = mUp
Then NewIdx := AListBox.ItemIndex - 1
Else NewIdx := AListBox.ItemIndex + 1;
If (NewIdx >= 0) And (NewIdx < AListBox.Items.Count) Then
Begin
AListBox.Items.Exchange(AListBox.ItemIndex,NewIdx);
AListBox.ItemIndex := NewIdx;
End;
end;
Перемещение мышом - используй внутренний Drag'n'drop. Соотв. надо реализовать обработчики нужных событий: OnDragDrop, DragOver.
В первом, по координатам вычисляется новый индекс итема, далее вызываешь Exchange. Во втором надо вернуть True, когда итем проносится над этим лист боксом.
И будет тебе счастье!