Comunidad Gambas-es
¿Alguien tiene un combobox que actualice la lista según se escribe? - 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: ¿Alguien tiene un combobox que actualice la lista según se escribe? (/thread-910.html)

Páginas: 1 2


¿Alguien tiene un combobox que actualice la lista según se escribe? - Shordi - 10-06-2022

Es decir un combobox que cuando se vaya tecleando la lista se desplace mientras haya coincidencia de lo tecleado con los items de la lista.

Me suena que el tema se trató hace tiempo pero no encuentro los hilos. Antes de ponerme a reinventar la rueda, si alguno lo tiene hecho, se agradecería una indicación.

Saludos


RE: ¿Alguien tiene un combobox que actualice la lista según se escribe? - tincho - 10-06-2022

En el foro viejo hay algo
https://foro.gambas-es.org/viewtopic.php?f=4&t=4871&highlight=combobox+mientras+escribe
https://foro.gambas-es.org/viewtopic.php?f=4&t=1441
Pero creo que lo que buscas esta en el foro francés:
https://gambas-fr.org/code-105-gbtextlist.html
[Imagen: WUbJ5nc.gif]
Luego, por otra parte, este tipo de solución va bien si tienes pocos datos que manejar, pero si tienes cientos o miles de ellos la cosa cambia y , en mi opinión, el combobox no resulta cómodo para la búsqueda de datos.
Por este motivo yo tome otro camino diferente para manejar los datos de las tablas foráneas, mostrando u ocultando un panel con la lista de opciones y el filtro, como se ve debajo en uno de mis programas.
[Imagen: hbopQPs.gif]


RE: ¿Alguien tiene un combobox que actualice la lista según se escribe? - Shordi - 10-06-2022

El controlillo del foro francés es el que más se ajusta a lo que busco. Gracias.

Pues he buscado en el foro antiguo antes de escribir este post y no he encontrado esas referencias... qué viejo me hago, señol, señol...

Saludos

De todas formas tiene el problema de "convivir" con el resto de controles en formularios o contenedores que usen el Arrangement....

Creo que es un problema insoluble per se.

Saludos.


RE: ¿Alguien tiene un combobox que actualice la lista según se escribe? - portaro - 10-06-2022

Y el codigo texto  de esto como seria ?


RE: ¿Alguien tiene un combobox que actualice la lista según se escribe? - Shordi - 11-06-2022

(10-06-2022, 19:18)portaro escribió: Y el codigo texto  de esto como seria ?

¿Te refieres a lo de Tincho? porque el otro lo tienes en los enlaces que hay más arriba.


RE: ¿Alguien tiene un combobox que actualice la lista según se escribe? - tincho - 11-06-2022

(10-06-2022, 19:18)portaro escribió: Y el codigo texto  de esto como seria ?

Busca en el proyecto la clase TextList. no lo pongo aquí porque es muy extenso.
Pero arranca así:
Código:
' Gambas class file

Export

Inherits UserControl

Public Const _Properties As String = "*,Text,List,Height_List,ShowsAllZero"
Public Const _Similar As String = "TextBox"
Private FormMere As Object
Private $txt As TextBox

Private $Lvw As ListView
Property Values As String[]
Private $iValues As New String[] ''Valeur a afficher
Property List As String[]
Private $iList As New String[]
Property Cle As String
Private $iCle As String ''Valeur a afficher
Property Text As String
Private $iText As String
Property Height_List As Float
Private $iHeight_List As Float

Event Change
Event Activate
Event KeyPress
Property ShowsAllZero As Boolean
Private $iShowsAllZero As Boolean

Private Function ShowsAllZero_Read() As Boolean

  Return $iShowsAllZero
End
' ... continua

(10-06-2022, 10:54)Shordi escribió: De todas formas tiene el problema de "convivir" con el resto de controles en formularios o contenedores que usen el Arrangement....

Si, este el el motivo por el que decidí usar el otro método que comente antes.


RE: ¿Alguien tiene un combobox que actualice la lista según se escribe? - Shordi - 11-06-2022

Basado en la idea de Vuott que enlazó Tincho más arriba, he hecho un pequeño control que hace la tarea, a saber: Un combobox que al teclear sobre él se va rellenando con la opción más aproximada de la lista.
Lo que no he podido resolver, y que creo que es imposible con gambas, es mantener el combobox desplegado y que la lista se reubique según se teclea. Es algo que excede el propio combobox, que reside en la librería gráfica qt o gtk, no en gambas.

De todas formas cumple su función. Lo tenéis aquí: https://gambas-es.org/showthread.php?tid=914

No lo he probado demasiado y no me llega a convencer demasiado... pero cumple con su función y no he visto cómo hacerlo mejor. Se aceptan mejoras, bugs y sugerencias.

Saludos.


RE: ¿Alguien tiene un combobox que actualice la lista según se escribe? - portaro - 11-06-2022

Si me referia al de Ticho. Gracias amigos por compartir.


RE: ¿Alguien tiene un combobox que actualice la lista según se escribe? - tincho - 11-06-2022

(11-06-2022, 12:59)portaro escribió: Si me referia al de Ticho. Gracias amigos por compartir.
Solo para aclarar, si te refieres a la clase gb.TextList, es de Bernard, un usuario del foro francés no mio. https://gambas-fr.org/code-105-gbtextlist.html


RE: ¿Alguien tiene un combobox que actualice la lista según se escribe? - Shell - 17-06-2022

Un ejemplo que encuentro es con una caja de texto y una lista. Angel
Permite la búsqueda desde una caja de texto o desde la propia lista usando el teclado.
Ya tiene unos cuantos años el código, por lo mejorable que pueda ser.

[Imagen: j4JSEP0.png]

En el caso de usar la caja de texto:

Código:
Public Sub txtNombre_KeyRelease()
 
  Dim x As Integer
 
  If Key.Code <> Key.BackSpace And lstLista.Count <> 0 Then       
    For x = 0 To lstLista.Count - 1     
      If InStr(Left(UCase(lstLista[x].Text), Len(txtNombre.Text)), UCase(txtNombre.Text)) <> 0 Then
        lstLista.Index = x          
        Return      
      Endif      
    Next
  Else
    If Len(txtNombre.Text) = 0 Then lstLista.Index = -1    
    Return
  Endif
 
End

Y usando la propia lista:

Código:
Public Sub lstLista_KeyRelease()
 
  Dim x As Integer
 
  'Si la lista contiene más de un elemento  
  If lstLista.Count > 1 Then                                                           
    'Si la tecla retroceso es pulsada
    Select Case (Key.Code)                                                             
      Case Key.BackSpace
        'Eliminamos una letra de la variable palabra
        palabra = Left(palabra, Len(palabra) - 1)                                      
      Case Else
        'Añadimos una letra a la variable palabra
        palabra &= Chr$(Key.Code)                                                      
    End Select
    'Mostramos en la etiqueta el contenido de la variable palabra
    lbpalabra.Text = palabra                                                           
    If Len(palabra) = 0 Then                                                           
      'Si la longitud de la palabra es 0, no selecciones ningún elemento.
      lstLista.Index = -1
      Return
    Endif
    For x = 0 To lstLista.Count - 1     
      'Si la subcadena se encuentra en la cadena
      If InStr(Left(UCase(lstLista[x].Text), Len(palabra)), UCase(palabra)) <> 0 Then  
        'Situate en el elemento x de la lista
        lstLista.Index = x                                                             
        Return      
      Endif      
    Next
  Else
    'Lista vacia
    Message.Info("No existen elementos en la lista")                                   
    Return
  Endif  
 
End

¿ Subo el ejemplo ?. Debería estar en el foro antiguo.

Saludos