busqueda automática mientras se escribe

Iniciado por seba64, 21 Octubre 2021, 01:16 AM

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

seba64

Tengo un text donde el usuario debe ingresar un texto a buscar. Uso timer, el objeto no la función, haciendo que cada vez que el text cambie el intervalo del timer cambie a 2000 milisegundos. pero esto no ocurre. La idea es que el usuario escriba el texto a buscar y una vez que deje de escribir, se realizce la busqueda de forma automática sin que haya la necesidad de un botón para hacerlo. ¿Alguna idea de como hacer esto?

Serapis

En principio el problema es saber 'cuando el usuario deja de escribir', precisamente para eso se usa un botón 'aceptar'. Así el usuario indica explícitamente que ha temrinado con la entrada de datos.

No obstante siendo es la opción obvia hay otras cuando se quiere alguna otra cosa como es tu caso.
Una de ellas es usar el evento validating, no el de change...
El evento validating, sucede cuando se pulsa otro control, es decir cuando el foco del cursor se intenta dirigir a otra parte, antes de que se abandone el foco de dicho objeto (al caso supongo un textbox), salta dicho evento...  requiere eso sí que el usuario realice alguna acción de pulsar en otra parte, si simplemente no hace nada, pues el evento no salta.
Pero en realidad el evento validating, suele usar para garantizar que los datos introducidos reúnen el formato requerido (cuando es el caso).

Es entonces cuando tiene sentido usar un timer...
El timer lo activas en primer lugar cuando el control gana el foco, y lo actualizas (reset el timer a 0) cada vez que sucede un evento change (sucede con cada carácter añadido o eliminado), entonces si tras reactivarse el timer, el lapso se consume (pongamos 1-2sg. es cuando resulta pertienente hacer la búsqueda con los caracteres que contiene el textbox...


Básicamente es este pseudocódigo.

sub form_load ...
   timer.interval = 1500   ' debes probar con varios valores de intéralo, hasta que estés satisfecho con la espera.
   timer.enabled = false   ' salvo que sea el único control en el form que entonces ganará el foco sí o si.
fin sub

sub textbox_gotfocus ...
    timer.enabled = true
fin sub

sub textbox_change ...
   timer.enabled = true
fin sub

Sub timer_Tick() ...
    timer.Enabled = False
    call BuscarLoQueSea
fin sub

EdePC

Cita de: seba64 en 21 Octubre 2021, 01:16 AM
Tengo un text donde el usuario debe ingresar un texto a buscar. Uso timer, el objeto no la función, haciendo que cada vez que el text cambie el intervalo del timer cambie a 2000 milisegundos. pero esto no ocurre. La idea es que el usuario escriba el texto a buscar y una vez que deje de escribir, se realizce la busqueda de forma automática sin que haya la necesidad de un botón para hacerlo. ¿Alguna idea de como hacer esto?

A mí me vale con esto, a no ser que no esté entendiendo bien tu pregunta:

Código (vb) [Seleccionar]
Private Sub Text1_Change()
  Me.Timer1.Enabled = False
  Me.Timer1.Interval = 2000
  Me.Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
  Call MsgBox("Han pasado 2 segundos")
  Me.Timer1.Enabled = False
End Sub


Cada vez que se modifique el contenido del TextBox ya sea porque se pulsó una tecla para escribir algo o se pegó algo o se borró algo se desactiva el Timer, se establece en 2 segundos, u se vuelve a activar, de esta manera se puede reiniciar el contador correctamente.