Retroceso del cursor en un combobox

10/07/2006 - 00:19 por klomkbock | Informe spam
Hola de nuevo a todos, aqui vuelvo con otro problema, para no variar.

Tengo un combobox en cuyos eventos KeyDown y KeyUp he introducido un
codigo (sacado del foro y retocado un poco) que reconoce las pulsaciones
del teclado y las asigna a una variable(Pulsos) de tal forma que si se
pulsa una tecla (no todas, se establecen algunas excepciones), Pulsos = 1
y cada vez que se pulsa una tecla se añade una unidad a pulsos:
Pulsos=Pulsos + 1. La tecla de retroceso(vbKeyBack) resta 1 cada vez a
pulsos si este es mayor que cero. El proceso va bastante bien, y pulsos
sirve para definir el nº de caracteres de la izquierda del combobox, para
usarlo como criterio para filtrar los datos de una hoja, comparandolo con
los registros de una columna concreta y trasladando el contenido del rango
"A:D" de las filas que vayan coincidiendo segun se escribe, a un ListBox
de 4 columnas. Uff...

Todo va bastante bien, pero al pulsar el retroceso, aunque pulsos
disminuye y el filtro se readapta y hace, creo que bien, su trabajo, el
cursor no retrocede (ni el sombreado de seleccion), con lo que si
introduces otro caracter no lo asimila a la coincidencia que aparece en el
combobox, sino que lo inserta en medio de lo que haya en el combo y,
claro, normalmente ya no existe ninguna coincidencia que reflejar en el
listbox.

No se si me he explicado, pero creo que no soy capaz de aclararlo mucho
mas.

Los codigos/extractos son los siguientes:

Private Sub cmbCriterio_KeyDown(ByVal KeyCode As MSForms _
.ReturnInteger, ByVal Shift As Integer)
Application.ScreenUpdating = False
Select Case KeyCode
Case vbKeyReturn, vbKeyEscape
SendKeys "{Esc}"
Case 32 To 255
Pulsos = Pulsos + 1
End Select
Application.ScreenUpdating = True
End Sub

El codigo referido al retroceso (vbKeyBack) iba originalmente en otro Case
del procedimiento anterior, pero tras varias pruebas, y la verdad es que
ya no tengo muy claro porque, lo acabe cambiando a KeyBack, donde creo que
funciona mejor¿¿??:

Private Sub cmbCriterio_KeyUp(ByVal KeyCode As MSForms _
.ReturnInteger, ByVal Shift As Integer)
If Not Pulsos > 0 Then Exit Sub
If KeyCode = vbKeyBack Then
If Pulsos > 0 Then Pulsos = Pulsos - 1
End If
With cmbCriterio
.
End Sub

Bueno, espero que mas o menos me hayais entendido. Si me podeis echar una
mano de nuevo, os lo agradezco.

Un saludo y hasta pronto.
Ivan

Preguntas similare

Leer las respuestas

#6 Héctor Miguel
13/07/2006 - 07:13 | Informe spam
hola, Ivan !

La variable Pulsos si debe incrementarse con los 'teclazos', pues estos se manipulan en keyDown y no en change
lo que posiblemente no haga es reconocerlos en el text del combo hasta que algun caracter no cambia con respecto a la coincidencia.
No se si me he explicado, pero creo que por aqui pueden estar los tiros.
Voy a ponerme con ello a ver si hay suerte y soy capaz de analizarlo en condiciones.



[efectivamente]... cuando el codigo se utiliza en un combox con la caracteristica de 'autocompletar' habilitada...
se vuelve necesario cambiar el punto de vista desde el cual se realiza el 'monitoreo' de las teclas que se van 'pulsando' :))
lo que ya no me resulta muy claro, es si el 'patron' debe conservarse 'consistentemente' con las teclas pulsadas...
o... con los valores que se van 'autocompletando' mientras introduces caracteres en el combo -???-

[en via de mientras]... prueba con las siguientes 'adapaciones' para manejar el evento '_keydown' de un combobox...
[seguramente] habra otras posibilidades de 'condiciones de error' una vez corriendo pruebas 'en tiempo real' -?-

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

en el modulo de codigo del formulario ==Dim Pulsos As Byte, Patron As String
Private Sub ComboBox1_KeyDown( _
ByVal KeyCode As MSForms.ReturnInteger, _
ByVal Shift As Integer)
Select Case KeyCode
Case vbKeyReturn, vbKeyEscape: SendKeys "{Esc}"
Case vbKeyBack
If Pulsos > 0 And Len(ComboBox1) > Pulsos Then
ComboBox1 = Left(ComboBox1, Pulsos)
If Pulsos > 0 Then Pulsos = Pulsos - 1
End If
Case 32 To 255: Pulsos = Pulsos + 1
End Select
If Pulsos < 1 Then Patron = ""
If Pulsos > 0 Then Patron = _
IIf(Len(ComboBox1) > 0, Left(ComboBox1, Pulsos + (Pulsos > 1)), Chr(KeyCode))
If Pulsos > 1 Then Patron = Patron & _
IIf(KeyCode = vbKeyBack, Mid(ComboBox1, Pulsos, 1), Chr(KeyCode))
MsgBox Pulsos & vbCr & Patron
End Sub
Respuesta Responder a este mensaje
#7 klomkbock
13/07/2006 - 11:32 | Informe spam
Hola Hector Miguel, muchas gracias de nuevo.

Parece funcionar perfectamente, aunque todavia no le he aplicado ni la
restriccion de caracteres ni su uso como filtro para el listbox.

En cuanto esto ultimo, y aunque esta tarde espero poder ir probandolo,
¿seria mejor añadir el codigo que rellena el listbox dentro del mismo
evento keydown, dado que supongo que change seguira sin dispararse hasta
que haya un cambio en el combo?. Por cierto, disculpa el despiste, el
patron deberia corresponderse con lo tecleado y no con lo
'autocompletado', aunque evidentemente esto (lo autocompletado) formara
parte de la seleccion que lo tecleado va filtrando.

En cuanto a los caracteres mi intencion es restringirlo al minimo, pero
hay algunos que, si no imprescindibles, si seria bastante interesante que
los reconociera, como son los de puntuacion, interrogacion y exclamacion.
Sin embargo no consigo (a falta de volver a probar desde el principio) que
me reconozca el punto, la coma y no se si alguno mas. Con tu nuevo codigo
y manteniendolo tal como esta (todos los caracteres) al pulsar la tecla
punto me escribe 3/4 en vez del punto. ¿Podrias explicarme a que se debe
esto?

En cualquier caso muchas gracias, esto tiene muy buena pinta. Voy a
intentar deguazarlo para entender su funcionamiento.

Un saludo y hasta pronto
Ivan

PD: lo del msgbox la verdad es que es una maravilla, aunque de momento lo
he cambiado a un textbox provisional de cara a no interrumpir el trabajo
teniendo que aceptar. Si se me hubiera ocurrido antes (y mira que lo he
visto veces en numerosas de vuestras ayudas en el foro, asi como en la
ayuda en linea) seguramente no estaria tan desquiciado, y no lo digo por
este codigo en especial.
Respuesta Responder a este mensaje
#8 klomkbock
14/07/2006 - 03:35 | Informe spam
Hola Hector Miguel,

no se si seguiras con tiempo para dedicarle a este pesado hilo (pesado
ivan), pero si es asi me gustaria consultarte una curiosidad mas omenos
comentada en la respuesta anterior.

Ya he probado tu nuevo codigo y funciona de maravilla, incluso mas o menos
voy comprendiendolo, pero ocurre una cosa cuanto menos curiosa, que creo
que no se debe al codigo, sino mas bien a alguna caracteristica propia del
s.o. o de vba (vuelvo a repetir que lo mismo estoy diciendo una burrada,
pero es la intuicion que me da), o incluso a mi teclado.

Aunque corregirlo no estaria de mas, tampoco pasaria nada por que se
quedara asi, pues practicamente pasaria desapercibido e incluso se puede
avisar con una ayuda.

Pero no he podido resistirme a consultarlo/comentarlo, aunque solo sea
para saciar un poco mas mi curiosidad.

Se trata del punto (y creo que al menos tambien la coma).

Cuando tecleas por ejemplo "J. Luis" en el combo de marras, al teclear:

:=>> J -> Pulsos = 1 -> Patron = "J"

:=>> . (el punto) -> Pulsos = 1 -> Patron = "J"

aqui lo logico es que pulsos hubiera sido igual a 2 y patron igual a "J."
pero lo mas curioso es cuando tecleas el espacio, entonces:

=>> Pulsos = 3 -> Patron = "J. " (el espacio es de suponer)

de repente el pulso perdido y el punto escondido aparecen.

da la impresion de que aqui el punto tuviera un funcionamiento similar al
de las tildes de los acentos, que no se deja ver hasta que introduces el
siguiente caracter, que para mas inri en este caso es un espacio.

De momento para estas pruebas, los caracteres reconocidos por pulsos son
practicamente los del codigo original mas la coma y el punto:

Case 32, 44, 46, 48 To 57, 63, 65 To 90, 97 To 122

lo que ahora tengo sobre todo es curiosidad, pues aunque el filtro no se
actualiza hasta que se teclea el caracter posterior al punto, ya te digo
que esto no seria un gran problema.

Me ha parecido una rareza que no estaba de mas exponer en el foro, aunque
lo mismo es simplemente otra de mis meteduras de pata. (y otra escusa para
expandir mis onanistas hilos)

En cualquier caso muchas gracias
Un saludo y hasta pronto
Ivan
Respuesta Responder a este mensaje
#9 Héctor Miguel
14/07/2006 - 08:48 | Informe spam
hola, Ivan !

1) definitivamente, ocurren comportamientos [que parecieran] 'inadecuados/inesperados/...' cuando se combinan...
combos [con autocompletar] y sus eventos '_keydown' [etc.] para llevar 'la cuenta' de las pulsaciones del usuario [p.e.]
a) mientras el usuario esta pulsando las teclas, el contenido del combo NO se ha modificado [por lo tanto]...
b) es necesario 'atrapar' la tecla pulsada mediante el argumento 'KeyCode' del evento [PERO]...
c) algunos codigos [de caracteres] son interpretados [por vba] con un numero 'diferente' [p.e.]
el punto [46] 'pasa' a ser el signo ¾ [190] la coma [44] 'pasa' a ser el signo ¼ [188] etc. [ADEMAS]...
d) los caracteres 'extendidos' [como acentos, acentos circunflejos, acentos franceses, etc.]...
REQUIEREN de la pulsacion de dos teclas... lo que ocasionaria un 'doble-disparo' del evento [Y TODAVIA]...
e) faltaria 'considerar/evitar/anular/...' si se pulsan teclas como {mayus}, {ctrl}, {tab}, {del}, {Fx}, {flechas}, etc. :-((
[mejor ya no le seguimos en lo 'tocante' a este apartado] :))

2) si, al final de cuentas, lo que 'interesa' [como patron por teclas pulsadas] y NO lo que pudiera 'autocompletarse' en el combo...
[probablemente] resultaria mas 'conveniente'... 'regresar' al uso de textboxes en lugar de los combos -?-

3) si prefieres seguir por el camino de los combos... te paso un ejemplo de -solo- algunas 'prevenciones' de teclas 'extras'
ademas de que observe ciertas 'complicaciones' cuando se trata de modificar los codigos 'equivocados' en el mismo evento...
por lo que resulta mas adecuado 'separar' la actualizacion del 'patron' a un procedimiento que se llama al finalizar el evento ;)
y... el segundo procedimiento SOLAMENTE corrige lo concerniente al punto y a la coma [faltan los caracteres 'dobles'] :-(

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

en el modulo de codigo del formulario =Dim Pulsos As Byte, Patron As String
Private Sub ComboBox1_KeyDown( _
ByVal KeyCode As MSForms.ReturnInteger, _
ByVal Shift As Integer)
MsgBox KeyCode: Exit Sub
Select Case KeyCode
Case 9, 16 To 18, 20: Exit Sub
Case vbKeyReturn, vbKeyEscape: SendKeys "{Esc}"
Case vbKeyBack
If Pulsos > 0 And Len(ComboBox1) > Pulsos Then
ComboBox1 = Left(ComboBox1, Pulsos)
If Pulsos > 0 Then Pulsos = Pulsos - 1
End If
Case 32 To 255: Pulsos = Pulsos + 1
End Select
Define_patron KeyCode
End Sub
Private Sub Define_patron(ByVal Tecla As Integer)
If Pulsos < 1 Then Patron = ""
If Tecla = 190 Then Tecla = 46
If Tecla = 188 Then Tecla = 44
If Pulsos > 0 Then Patron = _
IIf(Len(ComboBox1) > 0, Left(ComboBox1, Pulsos + (Pulsos > 1)), Chr(Tecla))
If Pulsos > 1 Then Patron = Patron & _
IIf(Tecla = vbKeyBack, Mid(ComboBox1, Pulsos, 1), Chr(Tecla))
MsgBox Pulsos & vbCr & ">" & Patron & "<"
End Sub

__ la consulta original __
... una curiosidad mas o menos comentada en la respuesta anterior.
... ocurre una cosa cuanto menos curiosa, que creo que no se debe al codigo
... sino mas bien a alguna caracteristica propia del s.o. o de vba... o incluso a mi teclado.
... corregirlo no estaria de mas, tampoco pasaria nada por que se quedara asi
... practicamente pasaria desapercibido e incluso se puede avisar con una ayuda.
... consultarlo/comentarlo, aunque solo sea para saciar un poco mas mi curiosidad.
Se trata del punto (y creo que al menos tambien la coma).
Cuando tecleas por ejemplo "J. Luis" en el combo de marras, al teclear:
:=>> J -> Pulsos = 1 -> Patron = "J"
:=>> . (el punto) -> Pulsos = 1 -> Patron = "J"
aqui lo logico es que pulsos hubiera sido igual a 2 y patron igual a "J."
pero lo mas curioso es cuando tecleas el espacio, entonces:
=>> Pulsos = 3 -> Patron = "J. " (el espacio es de suponer)
de repente el pulso perdido y el punto escondido aparecen.
da la impresion de que aqui el punto tuviera un funcionamiento similar al de las tildes de los acentos
que no se deja ver hasta que introduces el siguiente caracter, que para mas inri en este caso es un espacio.
... para estas pruebas, los caracteres reconocidos por pulsos son practicamente los del codigo original mas la coma y el punto:
Case 32, 44, 46, 48 To 57, 63, 65 To 90, 97 To 122
... tengo... curiosidad, pues aunque el filtro no se actualiza hasta que se teclea el caracter posterior al punto
... Me ha parecido una rareza que no estaba de mas exponer en el foro
aunque lo mismo es simplemente otra de mis meteduras de pata.
Respuesta Responder a este mensaje
#10 klomkbock
14/07/2006 - 17:24 | Informe spam
Hola Hector Miguel, muchas gracias de nuevo por tu ayuda.

Ya intuia el mundo aparte de los eventos de teclado(y del resto), pero no
pensaba que pudiera llegar a ser un universo tan complejo. De todas formas
creo que merece la pena haberlo indagado, de cara a saber un poco donde se
pisa. Espero tener tiempo suficiente para ir estudiandolo poco a poco. De
momento empezare por tus comentarios y tu nuevo codigo, a ver lo que saco
en claro.

En cuanto a la aplicacion actual, probablemente tengas razon y acabe
usando un textbox, pero pense que daba bastante 'cuartel' el tener tambien
la opcion de elegir de la lista.

Quizas tambien podria poner (en el anterior codigo, mas que en este), algo
parecido a :

Case else
MsgBox("Teclea el siguiente caracter para continuar la busqueda")

Aunque me imagino que no escaparia a algun posible error con determinadas
teclas.

Bueno, ya veremos en que derroteros acabo naufragando. En cualquier caso
me alegro de los frutos de este hilo y espero no haberte aburrido
demasiado con mi labia.

Y muchas gracias de nuevo, a ti y a todo el foro, por estar ahi.

Un saludo y hasta pronto
Ivan
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida