Visual Basic - Busqueda sin botón

Life is soft - evento anual de software empresarial
 
Vista:
sin imagen de perfil
Val: 37
Ha disminuido 1 puesto en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Busqueda sin botón

Publicado por seba64 (26 intervenciones) el 21/10/2021 01:08:33
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?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 5
Ha aumentado su posición en 18 puestos en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Busqueda sin botón

Publicado por Rey (3 intervenciones) el 21/10/2021 03:21:03
Una vez trate de hacer algo similar y trajo confusión. Opte por hacer la busqueda cuando ENTER
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 355
Bronce
Ha mantenido su posición en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Busqueda sin botón

Publicado por raul (160 intervenciones) el 21/10/2021 19:00:55
Los textbox tienen la propiedad change, keypress, keyup. Sin necesidad de usar un timer para que verifique cada 200 ms si el texto a cambiado; por ejemplo supon que tenemos abierta la conexion a database en CNN, supon que el contenido de la caja de texto busca en el campo1

private sub BUSCAR()
dim RS as recordset, SQL as string: set RS = new recordset
SQL = "Select * from TABLA1 where campo1 like '" & text1.text & "'"
rs.open sql, cnn
'... Mecanismo para visualizar en un Listview o en un DATAGRID
end sub

private sub text1_KEYUP(....
call BUSCAR
end sub
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 37
Ha disminuido 1 puesto en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Busqueda sin botón

Publicado por seba64 (26 intervenciones) el 22/10/2021 22:37:33
El problema de lo que indicas, es que si el texto a buscar tiene un largo de 10, se harán 10 busquedas por cada letra que fue presionada. Esto provoca un atascadero que probablemente termine con la ejecución del programa. Quizás no leiste o no entendiste lo que escribí
" La idea es que el usuario escriba el texto a buscar y una vez que deje de escribir, se realizce la búsqueda de forma automática ".

En todo caso, lo solucioné después de escribir la pregunta, cuando me di cuenta que lo había planteado al revés.

Ya que en otros foros me dijeron que trataron de hacer lo mismo, pero no pudieron...

cada vez que cambie el contenido de la caja de texto, hay que guardar en una variable la hora actual + 1 segundo. En un control timer verificar si la hora actual es mayor a la hora de la variable y entonces hacer la busqueda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 355
Bronce
Ha mantenido su posición en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Busqueda sin botón

Publicado por raul (160 intervenciones) el 24/10/2021 06:11:01
En primer lugar nunca he visto que la estructura que te di se atasque por qué sea invocada 10++ veces. De hecho siempre ha Sido la base de mis programas.

Ahora que si no la sabes usar ese es otro problema y no tiene nada que ver con Vb6 si no con la falta de interpretación... Y por mucho que quiera no OS puedo ayudar... La ignorancia tiene cura, querer ser ciego no.

1- si declaras una variable a nivel de procedimiento, está variable estará viva mientras que dure el procedimiento. Ahora que con las conexiones cada búsqueda ocupa memoria virtual de la PC... Por lo que en estos casos me aseguro que la variable Recordset se destruya en el propio procedimiento y por ende liberamos la memoria.
2- dentro del procedimiento escribo el código para que el resultado de la búsqueda lo escriba en un listview (porque me gustan)
3- dentro de los parámetros de los procedimiento incluyo al listview.


Dicho de otra forma

Prívate sub buscar(SQL as string, lw as object)

Bajo estás condiciones cada vez que el usuario oprime una tecla invoca un nuevo procedimiento que apunta hacia una copia del listview que mágicamente no tiene nada que ver con el procedimiento anterior... Al final solo perdura la ultima búsqueda realizada. Básicamente usas el procedimiento como una plantilla, con la que creas 10 llamadas independientes pero que solo registras la última.


Pero bueno esto es lo que yo haría de forma civilizada. porque para averigüar con un TIMER cuando deja de escribir es simplemente imposible porque no todos tecleamos a la misma vez y si se trata de personas mayores tal vez en 5 segundos no encuentre una tecla...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 355
Bronce
Ha mantenido su posición en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Busqueda sin botón

Publicado por raul (160 intervenciones) el 25/10/2021 16:37:49
Public Sub LLENAR(SENTENCIA As String, OBJETO As Object) 'PARA CARGAR LISTA EN CASI CUALQUIER COSA
'On Local Error Resume Next
Dim RST As Recordset, N As Integer: Set RST = New Recordset
RST.Open SENTENCIA, DTE.Connection1, adOpenDynamic, adLockReadOnly
Select Case TypeName(OBJETO)
Case "ListBox", "ComboBox"
OBJETO.Clear
If RST.RecordCount > 0 Then
Do While Not RST.EOF
OBJETO.AddItem RTrim(RST.Fields(0).VALUE): RST.MoveNext
Loop
OBJETO.ListIndex = 0
End If
Case "ListView", "IListView"
OBJETO.ListItems.Clear
If RST.RecordCount > 0 Then
Do While Not RST.EOF
N = N + 1 ' para las facturas existe el campo exp que se debe valorar y luego continuar; si no se trata de ese poner el valor sea cual sea
OBJETO.ListItems.Add N, , IIf(RST.Fields(0).Type = 11, IIf(RST.Fields(0).VALUE = 0, "No", "Si"), RTrim(RST.Fields(0).VALUE))
For BUCLE = 1 To RST.Fields.Count - 1
OBJETO.ListItems.Item(N).SubItems(BUCLE) = IIf(RST.Fields(BUCLE).Type = 11, IIf(RST.Fields(BUCLE).VALUE = 0, "No", "Si"), RST.Fields(BUCLE).VALUE)
Next BUCLE
RST.MoveNext
Loop
End If
If OBJETO.ListItems.Count > 0 Then 'Auto seleccionar el primer registro
OBJETO.ListItems(1).Selected = True
End If
Case "LynxComboBox"
OBJETO.Clear
For BUCLE = 1 To RST.RecordCount
OBJETO.AddItem RST.Fields(0)
For N = 1 To RST.Fields.Count - 1
OBJETO.ItemText(OBJETO.NewIndex, N) = IIf(IsNull(RST.Fields(N).VALUE) = True, "", RST.Fields(N).VALUE)
Next N
RST.MoveNext
Next BUCLE
If OBJETO.ListCount > 0 Then
OBJETO.ListIndex = 0
End If
End Select
Set RST = Nothing
End Sub

'Supon que tienes un textbox llamado text1 y un listview denominado LW1
Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)
DIM SQL as string
SQL = "Select Campo1, campo2, campo3 from tabla1 where CAMPO_BUSQUEDA = '" & text1.text & "'"
CALL LLENAR(SQL, LW1)
End Sub


'OBS: Este es parte de un codigo propio por ende existen comentarios y formatos que te pueden resultar incoherente solo es para que tengas una idea.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 37
Ha disminuido 1 puesto en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Busqueda sin botón

Publicado por seba64 (26 intervenciones) el 27/10/2021 16:26:17
Primero que nada, pido perdón por no explicarme bién

Cuando escribí busqueda sin botón en el título, me refería a tomar una acción de forma automática (automática a la vista del usario), cuando el usuario dejara de escribir. En el común de los casos el usuario debe llenar un campo y luego presionar un botón para que suceda algo.
Con lo del timer me refería a contar el tiempo transcurrido desde que el usuario dejó de escribir. Mi proposito era encontrar como medir ese tiempo para tomar una acción. En esto fallaba porque medía el tiempo en el ojeto timer y no en la función timer. Al reintentar con un poco de paciencia, escribí este código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub text1_Change()
    espera = Timer + 1
    Timer1.Interval = 100
End Sub
 
Private Sub Timer1_Timer()
    Debug.Print espera, Timer
    If espera = 0 Then Timer1.Interval = 0: Exit Sub
    If Timer > espera Then
        espera = 0
        realizarunaaccion
    End If
End Sub

Por supuesto esto requiere de un textbox y un timer.
(Probado en vb6 y vba)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 145
Ha aumentado 1 puesto en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Busqueda sin botón

Publicado por Sah1d Ra (191 intervenciones) el 28/10/2021 18:05:51
Hola!

Este tipo de línea cuando pasa de una instrucción la hago en dos.
1
IF eSperA = 0 TheN TimeR1.IntErvAl = 0: ExIt Sub

Creo que si no lo hiciera de esta manera el Exit Sub no lo realizaría.
1
2
3
4
IF eSpeRa = 0 THeN
 TimER1.IntErvAl = 0
 ExiT SUb
eND iF

Alguien que pueda confirmarme o negarme eso, saludos y felices líneas de programac10n.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar