Pagina1 van 1
Forum

Welkom bij de Tweaking4All gemeenschapsforums!
Voor je gaat deelnemen, bekijk de Forum Regels!

Specifieke onderwerpen: Start het onderwerp met de naam van het programma of systeem.
Bijvoorbeeld “MacOS X – Jouw vraag“, of bijvoorbeeld “MS Word – Jouw Tip of Truc“.

Merk op: Omschakelen naar een andere taal zal niet werken als je een post aan het lezen bent aangezien er waarschijnlijk geen vertaling beschikbaar is.



Deel:
Meldingen
Alles wissen

[Opgelost] Lazarus - How versleep je items in een ListBox met drag and drop?

2 Berichten
1 Gebruikers
0 Reactions
1,875 Bekeken
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2869
Topic starter  

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;    


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2869
Topic starter  

Om het aanklikken/selecteren van items mogelijk te houden, moet je DragMode:=dmAutomatic instellen voor de ListBox of CheckListBox.


   
BeantwoordenCiteren
Deel: