Mover al siguiente elemento igual en un listbox

Iniciado por RiasChan, 14 Abril 2018, 03:31 AM

0 Miembros y 1 Visitante están viendo este tema.

RiasChan

Tengo este codigo robado de por ahí...  ;D que hace lo que quiero casi a la perfeccion.

LO que hace, a medida q voy escribiendo me va  encontrando las coincidencias en eel list box, en el orden q sea, cuantas entradas sean, sin importar orden ni mayusculas ni minusculas (es realmente muy bueno) Pero tiene un detalle que me gustaria solucionar.

Me gustaria q cada vez q aprieto el enter, o sea el la key13 del evento keypress del textbox, la seleccion se desplaze hacia la siguiente coincidencia, que no se quede siempre en la misma. Que tendria que agregarla al codigo? Saludos!!

Function ListIsIn(lst As ListBox, zString As String) As Boolean
    On Error Resume Next
   
    For i = 0 To lst.ListCount
        If InStr(UCase$(lst.List(i)), UCase$(zString)) Then ListIsIn = True: lst.ListIndex = i: GoTo grr
        i = i + 1
    Next i
    ListIsIn = False
grr:
End Function

Private Sub Command1_Click()
    Me.Caption = ListIsIn(List1, Text1.Text)
End Sub

Private Sub Form_Load()
    List1.AddItem "MÉXICO" & " Pepe "
    List1.AddItem "VENEZUELA" & "Jose"
    List1.AddItem "ARGENTINA"
    List1.AddItem "ESPAÑA"
    List1.AddItem "GUATEMALA"
    List1.AddItem "ARGENTINA"
    List1.AddItem "CHILE"
End Sub

Private Sub Text1_Change()
   Label1.Caption = ListIsIn(List1, Text1.Text)
End Sub

Private Sub Text1_KeyPress(KeyAscii As Integer)


If KeyAscii = 13 Then

End If

End Sub




de Yapa pregutno, q modificacion le hago para hacer esto mismo en un listvew?


Serapis

#1
Modificando algo tu propio código... pero mejor copia todo y pégalo (antes comenta todo ese código que tienes)


Código (vb) [Seleccionar]

Private s_IndexActual  As Long



Private Sub BuscarPatron(ByRef lst As ListBox, ByRef Patron As String)
   ' almacenamos el índice obtenido en una variable a nivel de módulo.
   ' la búsqueda comenzará un índice más alla del actual...
   ' convertimos patrona  amayúsculas antes de enviarlo a la función, así el bucle no necesita hacerlo en cada iteración.
   s_IndexActual = IndexEnLista(lst, UCase$(Patron))
   ' Si se halló, se hace ese ítem actual, si no;
   '     se deselecciona (indice= -1), y en la próxima búsqueda comenzaría en: -1 + 1 = 0
   lst.ListIndex = s_IndexActual
   
   Me.Caption = "Indice: " & CStr(s_IndexActual)
End Sub

Private Function IndexEnLista(ByRef lst As ListBox, ByRef Patron As String) As Long
   Dim k As Long
   
   On Error Resume Next
   
   ' Busca desde siguiente al actual hasta el final
   For k = (s_IndexActual + 1) To lst.ListCount
       If InStr(UCase$(lst.List(k)), Patron) Then
           IndexEnLista = k
           Exit Function
       End If
   Next
   ' y si no se hallo en ese tramo, busca desde el comienzo hasta el actual.
   For k = 0 To s_IndexActual
       If InStr(UCase$(lst.List(k)), Patron) Then
           IndexEnLista = k
           Exit Function
       End If
   Next
   
   ' Si no se encuentra de ninguna manera, deselecciona la lista (valor -1)
   IndexEnLista = -1
End Function

Private Sub Command1_Click()
   Call BuscarPatron(List1, Text1.Text)
End Sub

Private Sub Form_Load()
   List1.AddItem "MÉXICO" & " Pepe "
   List1.AddItem "VENEZUELA" & " Jose"
   List1.AddItem "ARGENTINA"
   List1.AddItem "ESPAÑA"
   List1.AddItem "GUATEMALA"
   List1.AddItem "ARGENTINA"
   List1.AddItem "CHILE"
End Sub

Private Sub Text1_Change()
   Call BuscarPatron(List1, Text1.Text)
    'list1.text contiene el valor del ítem actualmente seleccionado, sin necesidad de saber su índice.
   Label1.Caption = List1.Text
End Sub

En realidad, la búsqueda es sobre si "Contiene...", y quizás sería preferible que la función se limitara a "SiEmpiezaCon...", Tampoco es adecuado que solo con una letra, deba buscarse en el listado, quizás debiera exigirse un mínimo de dos... pero bueno ambas cosas ya debes valorarlo tú.

Para un listivew, depende de lo que quieras hacer... no cambia básicamente nada, (aparte del objeto en sí), o cambia todo, en cualquier caso el control Listview, dispone del método "FindItem", que permite buscar un texto completo o parcial, escribe el nombre del método y pulsa "F1" (Ayuda), lee y mira los ejemplos...

...antes intenta adaptar la solución que te dí al listview, si te satisfe, listo, si no, vuelve a preguntar pero más especificamente con lo que necesitas, ya que ese control es mucho más que un simple Listbox...




p.d.: Olvidaba lo de la tecla enter...

Para probarlo ,escribe 'e' y pulsa sucesivamente la tecla enter, como excepto Méjico ( en la É tildada), tienen una 'e', recorrerá todos losítems y volverá al inicio...
Código (vb) [Seleccionar]
Private Sub Text1_KeyPress(KeyAscii As Integer)
    If (Len(Text1.Text) > 0) Then
        If KeyAscii = vbKeyReturn Then
            Call BuscarPatron(List1, Text1.Text)
        End If
    End If
End Sub

RiasChan

#2
Gracias, era lo que buscaba, lo unico que a medida q vas escribiendo va saltando entre los resulados hasta que se queda en uno, pero es un detalle. gracias!!

pd: Para mutear el BIP por cada vez que salta a un resultado?  :rolleyes:

Keyascii = 0

Listo perddon :  :xD


Olvidalo, esta perfecto! Me salvaste!

RiasChan

Una pregunta... con definir en la funcion as ListView en vez de ListBox, alcanza para que todo esto sea aplicado a un Listview?

Serapis

No.

Listview es mucho más complejo... de entrada sus elementos permanecen en la colección ListItems, luego la cantidad listcount, no es una propiedad al mismo nivel jerárquico... de hecho ni siquiera es una propiedad en listview:
Listbox1.Listcount
Listview1.ListItems.Count
...
Listbox.AddItem ("texto")
Listview1.ListItems.Add (,, "texto")

Hay que adaptarlo y para ello debes conocer en cierta profundidad el control. Si no lo conoces no tiene sentido usarlo, no es conforme usar cosas sin saber que se hace, jugando a 'rpobar a ver que pasa'...

USA la AYUDA, es muy completa, allí se describe a fondo cada control incluyendo el listview, tienes acceso a sus propiedades, métodos, eventos y con ejemplos de cada uno...

RiasChan

si es un bodrio, lo conzoco, lo uso, el otro dia deje de copiarlo y pegarlo y prendi ver como funciona y mas o menos vi, primero se añaden la columnas desde un while y dsp item a item, desde otro lado. Pero preguntaba si para llamar a una busqueda bastaba con modificar un poco ese codigo, se ve q habra q remodificar todo para un listview, gracias por la ayuda, me re salvaste hace un rato con eso del orden