Interscambiare la posizione del contenuto degli item di una ListBox mediante trascinamento con il mouse

Da Gambas-it.org - Wikipedia.

Per spostare il testo da una riga a un'altra mediante trascinamento con il mouse, vi sono almeno un paio di modalità.

Usare il Drag&Drop

Useremo in questo caso le risorse del Drag&Drop.

Public Sub Form_Open()

 With ListBox1
   .Drop = True
   .List = ["aaaa", "bbbb", "cccc", "dddd", "eeee"]
 End With

End


Public Sub ListBox1_MouseDrag()

 With ListBox1
   .Tag = .Index
' Preleva e trascina il testo individuando la riga che lo contiene:
   .Drag(ListBox1.Text, "text/html")
 End With

End 


Public Sub ListBox1_Drop()

 Dim b As Byte

' Individua il numero d'indice della riga, ove si deve rilasciare il testo prelevato dall'altra riga:
 b = Fix(Drag.Y / (ListBox1.ScrollH / ListBox1.Count)) [nota 1]

' Assegna alla riga del prelievo il testo contenuto nella riga del rilascio:
 ListBox1[ListBox1.Tag].Text = ListBox1[b].Text

' Rilascia nella riga il testo della riga del prelievo:
 ListBox1[b].Text = Drag.Data

End

Si potrebbe anche parzialmente usare il Drag&Drop, modificando la routine "ListBox1_Drop()" con l'uso della funzione Swap:

Public Sub ListBox1_Drop()

 Swap ListBox1[ListBox1.Tag].Text, ListBox1[Fix(Drag.Y / (ListBox1.ScrollH / ListBox1.Count))].Text

End


Senza utilizzare il Drag&Drop

Public Sub Form_Open()

 ListBox1.List = ["aaaa", "bbbb", "cccc", "dddd", "eeee"]

End


Public Sub ListBox1_MouseUp()

 With ListBox1
   If Not IsNull(.Tag) Then 
     Swap ListBox1[.Tag].Text, ListBox1[.Index].Text
     .Tag = Null
   Else
     .Tag = .Index
   Endif
 End With

End


Note

[1] Vedere questa pagina: Individuare il numero d'indice della riga di una ListBox sulla quale si è cliccato con il mouse