Comunidad Gambas-es
ListBox. Buscar coincidencias - 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: ListBox. Buscar coincidencias (/thread-737.html)



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:

Código:
Public Const NUMDEELEMENTOS As Integer = 100
Public valores As String[]

Public Sub LlenadoDelista() As String[]

  Dim n As Integer
  Dim i As Integer
  Dim nom As String
  Dim acadenas As New String[]

  For i = 0 To NUMDEELEMENTOS
    For n = 0 To 2
      nom &= Chr(Rand(65, 90))
    Next
    nom &= Format(Rand(1, 100), "000")
    acadenas.Add(nom)
    nom = ""
  Next

  Return acadenas

End

Primer ejemplo. Busca y muestra una coincidencia.

[Imagen: 7dxuHqa.png]

Código:
Public Sub Form_Open()

  Me.Text = "Busqueda en ListBox"
  lstElementos.List = Comun.LlenadoDelista()
  lstElementos.Sorted = True
  Comun.valores = lstElementos.List
  txtEntrada.SetFocus()

End

Public Sub txtEntrada_Change()

  Dim x As Integer
  Dim coincidencia As Boolean

  txtEntrada.Text = UCase(txtEntrada.Text)
  lstElementos.List = Comun.valores

  If Not IsNull(txtEntrada.Text) Then
    While x < lstElementos.count And Not coincidencia
      If InStr(Trim(Left(lstElementos[x].Text, Len(txtEntrada.text))), Trim(txtEntrada.Text)) <> 0 Then
        lstElementos.Index = x
        coincidencia = True
      Endif
      If Not coincidencia Then x += 1
    Wend
  Endif

End

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.

Código:
Public Sub Form_Open()

  Me.Text = "Busqueda en ListBox"
  lstElementos.Sorted = True
  lstElementos.List = Comun.LlenadoDelista()
  Comun.valores = lstElementos.List
  txtEntrada.SetFocus()

End

Public Sub txtEntrada_Change()

  txtEntrada.Text = Trim(UCase(txtEntrada.Text))
  lstElementos.List = Comun.valores

  If Not IsNull(txtEntrada.text) Then lstElementos.Index = lstElementos.Find(txtEntrada.text & "*", gb.Like) 'No funciona siempre correctamente

End

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


Código:
Public Sub Form_Open()

  Me.Text = "Busqueda en ListBox"
  lstElementos.List = Comun.LlenadoDelista()
  lstElementos.Sorted = True
  Comun.valores = lstElementos.List
  txtEntrada.SetFocus()

End

Public Sub txtEntrada_Change()

  Dim x As Integer
  Dim listaencontrados As New String[]

  txtEntrada.Text = UCase(txtEntrada.Text)
  lstElementos.List = Comun.valores

  If Not IsNull(txtEntrada.text) Then
    If lstElementos.Count > 0 Then
      For x = 0 To lstElementos.Count - 1
        If InStr(Left(lstElementos[x].Text, Len(txtEntrada.Text)), txtEntrada.Text) > 0 Then
          lstElementos.Index = x
          listaencontrados.Add(lstElementos[lstElementos.Index].Text)
        Endif
      Next
      lstElementos.List = listaencontrados
    Else
      lstElementos.Index = -1
    Endif
  Endif

End

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

Saludos