Um eine ListBox ohne Drag&Drop umsetzen zu können, muss man die drei Mouse-Events MouseUp, MouseMove und MouseDown der ListBox belegen und den folgenden Code verwenden:
Delphi-Quellcode:
procedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ListStartItem := ListBox1.ItemAtPos(Point(X, Y), True);
ListStopItem := ListStartItem;
ListDragging := (ListStartItem <> -1);
ListBox1.Cursor := crDrag;
end;
procedure TForm1.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var NeuesItem: Integer;
begin
if (not ListDragging) then exit;
// neues Element ueber Koordinate suchen
NeuesItem := ListBox1.ItemAtPos(Point(X, Y), True);
if (ListStopItem = -1) or (NeuesItem = -1) or (ListStopItem = NeuesItem) then
exit;
// Elemente austauschen
ListBox1.Items.Exchange(ListStopItem, NeuesItem);
ListBox1.ItemIndex := NeuesItem;
ListStopItem := NeuesItem;
end;
procedure TForm1.ListBox1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if (not ListDragging) then exit;
// Variablen zurücksetzen
NewsDragging := False;
lstNews.Cursor := crDefault;
// Testen, ob ein Austausch stattgefunden hat
if (ListStartItem = -1) or (ListStopItem = -1) or (ListStartItem = ListStopItem) then
exit;
// z. B. Meldung ausgeben
Showmessage('Bewegtes Element: ' + IntToStr(ListStartItem) + #13#10 + 'Neuer Index: ' + IntToStr(ListStopItem));
end;
Der Code funktioniert unter Delphi 2007, sollte aber auch mit früheren Delphi-Versionen funktionieren.