Comunidad Gambas-es
Mover item de un listbox arrastrando con el Mouse - Versión para impresión

+- Comunidad Gambas-es (https://gambas-es.org)
+-- Foro: Gambas (https://gambas-es.org/forum-3.html)
+--- Foro: General (https://gambas-es.org/forum-4.html)
+--- Tema: Mover item de un listbox arrastrando con el Mouse (/thread-1567.html)

Páginas: 1 2


Mover item de un listbox arrastrando con el Mouse - playmepe - 07-12-2023

Buen día a todos, en esta oportunidad recurro a Uds. para consultar lo siguiente; quisiera ordenar los archivos de un listbox con arrastrar y soltar con el mouse (así como drag & drop) pero en el mismo listbox, ya que así es más facil en mover el archivo seleccionado en el index que uno desea. Gracias de antemano a sus respuestas.


RE: Mover item de un listbox arrastrando con el Mouse - Shell - 07-12-2023

playmepe:

¿ Sabes que el listbox se puede ordenar automáticamente ?.  Pero no sé si eso te interesa.


RE: Mover item de un listbox arrastrando con el Mouse - vuott - 07-12-2023

(07-12-2023, 21:46)playmepe escribió: quisiera ordenar los archivos de un listbox con arrastrar y soltar con el mouse (así como drag & drop) pero en el mismo listbox, ya que así es más facil en mover el archivo seleccionado en el index que uno desea.

Un desafío muy interesante !


RE: Mover item de un listbox arrastrando con el Mouse - Shell - 08-12-2023

No hago uso de DragDrop, simplemente selecciono uno y luego el otro, luego estos dos item se intercambia. Smile

Código:
Private vip_linux As New String[]
Private cuentaindices As Integer = 0
Private primero As Integer = -1
Private segundo As Integer = -1

Public Sub Form_Open()

  vip_linux = ["Linux Torvalds",
    "Richard Stallman",
    "Andrew Morton",
    "Eric S Raymond",
    "Andrew Tridgell",
    "Mark Shuttleworth",
    "Marc Ewing",
    "Miguel de Icaza",
    "Michael Widenius",
    "Rasmus Lerdof"]

  ListBox1.List = vip_linux

End

Public Sub ListBox1_Select()

  If cuentaindices < 2 And primero = -1 Then
    primero = ListBox1.Index
    Inc cuentaindices
  Else If cuentaindices = 1 And segundo = -1 Then
    segundo = ListBox1.Index
    Inc cuentaindices
    Swap ListBox1[primero].Text, ListBox1[segundo].Text
    primero = -1
    segundo = -1
    cuentaindices = 0
  Endif

End

Saludos


RE: Mover item de un listbox arrastrando con el Mouse - vuott - 08-12-2023

...si quisiera utilizar los recursos del "Drag&Drop", propondría este código:
Código:
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
' Coge y arrastra el texto localizando la línea que lo contiene:
    .Drag(ListBox1.Text, "text/html")
  End With

End 


Public Sub ListBox1_Drop()

  Dim n As Byte

' Localiza el número de índice de la línea donde se va a liberar el texto tomado de la otra línea:
  n = Fix(Drag.Y / (ListBox1.ScrollH / ListBox1.Count))

' Asigna el texto contenido en la línea de liberación a la línea de recogida:
   ListBox1[ListBox1.Tag].Text = ListBox1[n].Text
   
' Suelta el texto de la frase de recogida:
  ListBox1[n].Text = Drag.Data
 
End

Si, pero, no te gusta el Drag&Drop, propondría este código:
Código:
Public Sub Form_Open()

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

End

Public Sub ListBox1_MouseUp()
 
  With ListBox1
    If Not IsNull(.Tag) Then 
'...Consul romano-gauditano, Shell, me dió la idea:
      Swap ListBox1[.Tag].Text, ListBox1[.Index].Text
      .Tag = Null
    Else
      .Tag = .Index
    Endif
  End With
 
End



RE: Mover item de un listbox arrastrando con el Mouse - playmepe - 08-12-2023

Gracias por sus respuestas, pero lo que quiero es manualmente ordenar la lista a mi gusto, no autómático, ni reemplazar. voy a tratar de jugar con sus ejemplos, a ver si me surge alguna idea. saludos


RE: Mover item de un listbox arrastrando con el Mouse - vuott - 08-12-2023

¿Quizá quieres conseguir un resultado como éste?
Código:
Public Sub Form_Open()

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

End

Public Sub ListBox1_MouseDrag()
  
  ListBox1.Drag(ListBox1.Text, "text/html")

End 


Public Sub ListBox1_Drop()

  Dim n, c As Byte
  Dim ss As String[]

  n = Fix(Drag.Y / (ListBox1.ScrollH / ListBox1.Count))
  ss = ListBox1.List

  ss.Add(Drag.Data, n)
  c = ListBox1.Index
  
  If ListBox1.Index > n Then c = ListBox1.Index + 1 
  ss.Remove(c, 1)
  ListBox1.List = ss

End



RE: Mover item de un listbox arrastrando con el Mouse - playmepe - 10-12-2023

Gracias voutt por su código, esa si me sirve. Gracias


RE: Mover item de un listbox arrastrando con el Mouse - Shell - 11-12-2023

Puede que la operación del Drag Drop no este "del todo" contemplada para realizarse sobre el mismo control.
En realidad no es algo raro de ver. Se suele hacer más entre dos controles.
 
(08-12-2023, 05:12)vuott escribió: n = Fix(Drag.Y / (ListBox1.ScrollH / ListBox1.Count))

Es algo rebuscada. Debería existir un método para esto. Es como si fuesen operaciones de dibujo.

Tengo pendiente leer por completo el post en la lista internacional sobre que no funciona el evento Mouse_Down() en Listbox.

Saludos


RE: Mover item de un listbox arrastrando con el Mouse - vuott - 11-12-2023

(11-12-2023, 15:15)Shell escribió: en la lista internacional sobre que no funciona el evento Mouse_Down() en Listbox.

Sobre ese tema corremos... un piadoso velo.
Bah....