Comunidad Gambas-es
eliminar varios items a la vez de un listbox - 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: eliminar varios items a la vez de un listbox (/thread-1541.html)



eliminar varios items a la vez de un listbox - playmepe - 15-11-2023

Buen día a todos, como sería el código para eliminar varios items a la vez de un listbox? gracias por sus comentarios.


RE: eliminar varios items a la vez de un listbox - Shell - 16-11-2023

Hola playmepe.

Creo que es una pregunta para el foro de General. Aunque veamos que el foro se llama Fragmentos de Códigos/Aplicaciones.
Que lo decida nuestro administrador.

A ver si esto te soluciona la duda. (Creo el ListBox desde código.)

Para ello uso un array donde almaceno el indice de los elementos seleccionados.
Y luego usando este array en orden inverso para el bucle for. Elimino los elementos
en el listbox desde el último elemento del listbox seleccionado hasta el primero.

¿ Y por que lo hago así ?.
¿ Qué les ocurre a los indice de un array cuando se elimina un elemento de su lista ?
Happy tiene indice 0, Bored tiene indice 1, Hungry tiene indice 2..

Si elimino "Bored" que tiene indice 1, ¿ qué palabra o cadena será insertada en el indice 1 ?.
Ahora imagina lo que es eliminar varios a la vez, todos los desplazamientos que van ocurriendo.

Código:
Private emotions As String[] = ["Happy", "Bored", "Hungry", "Thirsty", "Worried"]
Private alistbox As ListBox

Public Sub Form_Open()
 
  alistbox = New ListBox(Me) As "Handler"

  With alistbox
    .List = emotions
    .W = 200
    .H = 200
    .X = (Me.w - .w) / 2 'Centra el listbox en eje horizontal
    .y = (Me.h - .h) / 2  'Centra el listbox en eje vertical
    .Mode = Select.Multiple 'Para poder seleccionar más de un elemento en la lista
  End With

End

Public Sub Handler_KeyPress()

  Dim seleccionados As New Integer[]

  If Key.code = Key.Delete Then 'Si la tecla pulsada es suprimir
    For j As Integer = 0 To alistbox.Count - 1
      If alistbox[j].Selected Then seleccionados.Add(j)'Ponemos el indice del elemento seleccionado en el array de seleccionados
    Next

    'Eliminamos los elementos en la lista usando el array seleccionados en orden inverso
    For j As Integer = seleccionados.Count - 1 To 0 Step -1
      alistbox.Remove(seleccionados[j])
    Next
    
  Endif

End

Saludos


RE: eliminar varios items a la vez de un listbox - vuott - 17-11-2023

Consul Shell,
Confused quizás la segunda rutina puede acortarse:
Código:
Public Sub Handler_KeyPress()

  If Key.code = Key.Delete Then
    For j As Integer = 0 To alistbox.Count - 1
      If alistbox[j].Selected Then 
        alistbox.Remove(j)
        j -= 1
      Endif
    Next
  Endif

End



RE: eliminar varios items a la vez de un listbox - Shell - 17-11-2023

(17-11-2023, 18:31)vuott escribió: quizás la segunda rutina puede acortarse:

Ejem, ejeeem, ejeeem... Smile

Si, pero "esas maniobras" no deberían hacerse en un bucle. No son "bonitas!".  [Imagen: 0773I7Y.gif]

Ademas ten cuenta que playmepe está comenzando a conocer Gambas.


RE: eliminar varios items a la vez de un listbox - Shell - 20-11-2023

Que por cierto Vuott no me parece mal el código. Es solo que me parece raro que se retoque la variable de
control del bucle dentro del propio bucle. No es algo que se haga por costumbre.


RE: eliminar varios items a la vez de un listbox - vuott - 20-11-2023

(20-11-2023, 01:07)Shell escribió: No es algo que se haga por costumbre.
Consul,
que una acción no se realice por costumbre, no significa que no pueda realizarse.
Al fin y al cabo, la variable "j" es una... variable.
Esa operación se puede realizar incluso con los otros tipos de ciclo (While...Wend; Repeat...Until; etc..).

......a veces, las Puertas de Hércules de Cádiz pueden superarse, Consul ! Wink


RE: eliminar varios items a la vez de un listbox - Shell - 21-11-2023

(20-11-2023, 01:58)vuott escribió: Consul,
que una acción no se realice por costumbre, no significa que no pueda realizarse.
Al fin y al cabo, la variable "j" es una... variable.
Esa operación se puede realizar incluso con los otros tipos de ciclo (While...Wend; Repeat...Until; etc..).

Como "legatus" que eres, sabe que los bucles pueden ser "periculosum".
Te muestro un ejemplo de bucle.

"Abyssus Abyssum Invocat."
 
(20-11-2023, 01:58)vuott escribió: ......a veces, las Puertas de Hércules de Cádiz pueden superarse, Consul !
 
Cita:«... fue el mismo Hércules quien separó los dos montes unidos (Abila y Calpe) como una cordillera continua y así fue como al Océano, contenido antes por la mole de los montes, se le dio entrada a los lugares que ahora inunda: desde aquí el mar se difunde ya más extensamente y avanzando con gran fuerza recorta las tierras que retroceden y quedan bastante más alejadas.»
Pomponio Mela

[Imagen: iWPvSVU.jpg]