Comunidad Gambas-es
ListBox. Buscar coincidencias - Versión para impresión

+- Comunidad Gambas-es (https://gambas-es.org)
+-- Foro: Gambas (https://gambas-es.org/forumdisplay.php?fid=3)
+--- Foro: General (https://gambas-es.org/forumdisplay.php?fid=4)
+--- Tema: ListBox. Buscar coincidencias (/showthread.php?tid=737)



ListBox. Buscar coincidencias - Shell - 23-11-2021

Buenas!

Hice un ejemplo para buscar en el contol listbox.
He usado dos controles, una caja de texto y un listbox.
He creado tres ejemplos.

Código Común:

GAMBAS
  1. Public Const NUMDEELEMENTOS As Integer = 100
  2. Public valores As String[]
  3.  
  4. Public Sub LlenadoDelista() As String[]
  5.  
  6.   Dim nom As String
  7.   Dim acadenas As New String[]
  8.  
  9.   For i = 0 To NUMDEELEMENTOS
  10.     For n = 0 To 2
  11.       nom &= Chr(Rand(65, 90))
  12.     Next
  13.     nom &= Format(Rand(1, 100), "000")
  14.     acadenas.Add(nom)
  15.     nom = ""
  16.   Next
  17.  
  18.   Return acadenas
  19.  



Primer ejemplo. Busca y muestra una coincidencia.

[Imagen: 7dxuHqa.png]

GAMBAS
  1. Public Sub Form_Open()
  2.  
  3.   Me.Text = "Busqueda en ListBox"
  4.   lstElementos.List = Comun.LlenadoDelista()
  5.   lstElementos.Sorted = True
  6.   Comun.valores = lstElementos.List
  7.   txtEntrada.SetFocus()
  8.  
  9.  
  10. Public Sub txtEntrada_Change()
  11.  
  12.   Dim coincidencia As Boolean
  13.  
  14.   txtEntrada.Text = UCase(txtEntrada.Text)
  15.   lstElementos.List = Comun.valores
  16.  
  17.   If Not IsNull(txtEntrada.Text) Then
  18.     While x < lstElementos.count And Not coincidencia
  19.       If InStr(Trim(Left(lstElementos[x].Text, Len(txtEntrada.text))), Trim(txtEntrada.Text)) <> 0 Then
  20.         lstElementos.Index = x
  21.         coincidencia = True
  22.       Endif
  23.       If Not coincidencia Then x += 1
  24.     Wend
  25.  



Segundo Ejemplo. Busca y muestra una coincidencia.

Estoy interesado en este ya que usa una constante gb.like. El efecto cuando busca no siempre es correcto.
Imaginar que busco elementos que comienzan con la "z", pues hay veces que si hay más de una coincidencia, se salta el primero. Huh
El problema se encuentra en la constante que usa el método "find". O que no lo uso de una forma correcta.

[Imagen: U8d1Dwb.png]

Se ha saltado el primero.

GAMBAS
  1. Public Sub Form_Open()
  2.  
  3.   Me.Text = "Busqueda en ListBox"
  4.   lstElementos.Sorted = True
  5.   lstElementos.List = Comun.LlenadoDelista()
  6.   Comun.valores = lstElementos.List
  7.   txtEntrada.SetFocus()
  8.  
  9.  
  10. Public Sub txtEntrada_Change()
  11.  
  12.   txtEntrada.Text = Trim(UCase(txtEntrada.Text))
  13.   lstElementos.List = Comun.valores
  14.  
  15.   If Not IsNull(txtEntrada.text) Then lstElementos.Index = lstElementos.Find(txtEntrada.text & "*", gb.Like) 'No funciona siempre correctamente
  16.  



Tercer ejemplo, muestra todos los elementos que coinciden con el texto que busco.


GAMBAS
  1. Public Sub Form_Open()
  2.  
  3.   Me.Text = "Busqueda en ListBox"
  4.   lstElementos.List = Comun.LlenadoDelista()
  5.   lstElementos.Sorted = True
  6.   Comun.valores = lstElementos.List
  7.   txtEntrada.SetFocus()
  8.  
  9.  
  10. Public Sub txtEntrada_Change()
  11.  
  12.   Dim listaencontrados As New String[]
  13.  
  14.   txtEntrada.Text = UCase(txtEntrada.Text)
  15.   lstElementos.List = Comun.valores
  16.  
  17.   If Not IsNull(txtEntrada.text) Then
  18.     If lstElementos.Count > 0 Then
  19.       For x = 0 To lstElementos.Count - 1
  20.         If InStr(Left(lstElementos[x].Text, Len(txtEntrada.Text)), txtEntrada.Text) > 0 Then
  21.           lstElementos.Index = x
  22.           listaencontrados.Add(lstElementos[lstElementos.Index].Text)
  23.         Endif
  24.       Next
  25.       lstElementos.List = listaencontrados
  26.     Else
  27.       lstElementos.Index = -1
  28.     Endif
  29.  



Os subo el ejemplo. Tiene tres formularios, seleccionar uno de ellos y o bien ejecutarlo como correr esta clase ó como clase de inicio.

Saludos