Eine gute Idee, Luckie. Drag&Drop ...

... immer schick. Das einzige Problem ist, dass dein Code für die Mehrfachauswahl in Listboxen geschrieben ist. (Denn, wenn "MultiSelect" FALSE ist, ist "SelCount" -laut Hilfe- immer -1.) Deswegen schlage ich als Erweiterung spontan (

) mal folgende private Universalfunktionen vor:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| procedure TForm1.LbOnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if(Sender is TListBox) then if(Button = mbLeft) then (Sender as TListBox).BeginDrag(false); end;
procedure TForm1.DragAccept(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin Accept := (Source is TListBox); end;
procedure TForm1.DragDropFunc(Sender, Source: TObject; X, Y: integer); var i : integer; begin if(Sender is TListBox) then with (Source as TListBox) do case MultiSelect of false: if(ItemIndex <> -1) then if((Sender as TListBox).Items.IndexOf(Items[ItemIndex]) = -1) then (Sender as TListBox).Items.Add(Items[ItemIndex]); true: if(SelCount > 0) then for i := 0 to Items.Count - 1 do if(Selected[i]) and ((Sender as TListBox).Items.IndexOf(Items[i]) = -1) then (Sender as TListBox).Items.Add(Items[i]); end; end; |
Damit lassen sich die Items jetzt problemlos zwischen beiden Listboxen austauschen. Vorausgesetzt sie stehen nicht schon in der Ziel-Listbox. Entweder wählt man diese Funktionen über den Objektinspektor aus, oder man macht es im "OnCreate" des Forms:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TForm1.FormCreate(Sender: TObject); begin ListBox1.OnMouseDown := LbOnMouseDown; ListBox1.OnDragOver := DragAccept; ListBox1.OnDragDrop := DragDropFunc;
ListBox2.OnMouseDown := LbOnMouseDown; ListBox2.OnDragOver := DragAccept; ListBox2.OnDragDrop := DragDropFunc; end; |