Dit is een voorbeeld hoe je met behulp van drag and drop items in een TListBox of een TCheckListBox kunt verslepen. Handig als je de gebruiker de kans wilt geven om de volgorde van items te veranderen.
Als eerste definieren we een globale variable om te kunnen onthouden met welk item we begonnen zijn. Dit kan gerust een property van TForm worden.
SleepItem : integer;
Vervolgens definieren we 3 procedures voor de ListBox events "OnMouseDown", "OnDragDrop", "OnDragOver".
Bij het OnMouseDown event detecteren we dat de eindgebruiker de muisknop heeft ingedrukt (links of rechts), en dat een geschikt item versleept gaat worden waarvan we de index in de globale variabele opslaan voor later.
By het OnDragOver event kijken we of het item over een geschikt locatie staat (muis veranderd!) en kunnen we dus aangeven of we deze locatie accepteren.
Het onDragDrop handelt vervolgens het "ontvangen" van een item af en verplaatst het "SleepItem" naar de nieuwe locatie.
procedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
SleepItem := ListBox1.ItemAtPos(Point(X,Y), true);
if (SleepItem>-1) and (SleepItem<ListBox1.Count) then
ListBox1.BeginDrag(true)
else
begin
ListBox1.BeginDrag(False);
SleepItem:=-1;
end;
end;
procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer);
var ItemOnderMuis:integer;
begin
ItemOnderMuis := ListBox1.ItemAtPos(Point(X,Y), true);
if (ItemOnderMuis>-1) and (ItemOnderMuis<ListBox1.Count) and (SleepItem>-1) then
listShares.Items.Move(SleepItem,ItemOnderMuis);
end;
procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
var ItemOnderMuis:integer;
begin
if Sender=Source then
begin
ItemOnderMuis := ListBox1.ItemAtPos(Point(X,Y), true);
Accept:=(ItemOnderMuis>-1) and (ItemOnderMuis<ListBox1.Count);
end
else
Accept:=false;
end;