FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
¿Cómo simular de "verdad" las teclas SHIFT+TAB?
Hola, me explico:
Tengo un simple TStringGrid, al iniciar está el foco en la primera celda, la fila 1, columna1, ya que la 0,0 es la del título y la de los datos del lado izquierdo. Si se pulsa la tecla TAB, el foco pasa a la siguiente, fila 1, columna 2. Si se repite la pulsación de TAB pasamos a fila 1, columna 3. Cuando se pulsa TAB en la última columan de la primera fila entonces el foco pasa a la primera celda de la segunda columna (2,1), y así sucesivamente hasta llegar a la última fila, columna. Una vez allí, si pulsamos TAB, el foco vuelve al principio, a la celda 1,1. Hasta aquí no he dicho nada que todos sepáis. Bien, si en lugar de pulsar TAB, decidimos pulsar SHIFT+TAB, el proceso es exactamente el mismo, pero al revés, marcha atrás, del final hacia el principio. Y siempre, en ambos casos, es una "rueda" sin fin. Bien, lo complicamos un poco, tengo un array bidimensional con las mismas celdas que tiene el Grid, básicamente se ve así:
Cada posición del array representa una celda del StringGrid anterior.
¿Qué hace esto?, fácil, si nos movemos a una celda de StringGrid y en el array aCeldas esa posición está a 'false', simula la tecla TAB y pasa a la siguiente posición. Todo este "invento" es para que sólo puedan ser editadas unas celdas y otras no, lo mismo existe otra forma mucho más cómoda de hacerlo, pero no se me ha ocurrido o, enfrascado en esto, se me olvidó. Bien, sigo, cambiamos los valores del array para probarlo:
Perfecto, si nos movemos con la tecla TAB o con la tecla SHIFT+TAB, funciona perfecto, tanto hacia delante como hacia atrás, se salta las celdas que en el array están a false y sólo se posiciona en las que están a true. Aunque cuando va hacia atrás no debería de funcionar, viendo el código del evento SelectCell se ve que debería de avanzar, no retroceder, cuando encuentre una posición con valor false , pero funciona perfecto. Bien, continuo, lo que quiero es que pulsando las teclas de flechas IZQUIERDA y DERECHA funcione exactamente igual que con las teclas TAB y SHIFT+TAB. He buscado por los foros y he encontrado diversas formas, pero ninguna de ellas funciona, eso me hace sospechar que no son de "verdad" simuladoras de la pulsación de esas teclas. Ahora sí, ya termino: ¿Cómo puedo simular de verdad las teclas SHIFT+TAB, para que el resultado sea exactamente igual que pulsando esas teclas?. ¡Ale!, se acabó el rollo |
#2
|
||||
|
||||
Cita:
Ahora bien, no especificas de qué manera estás intentando con las teclas IZQUIERDA y DERECHA. Porque "algo" tienes que hacer, puesto que las teclas de cursor no funcionan en el StringGrid exactamente igual que TAB y SHIFT+TAB (no avanzan ni retroceden de fila cuando se llega a un extremo). Pero, si usas el evento KeyDown o KeyUp, tendrás que anular (Key := 0) el comportamiento natural o tendrás un doble movimiento. Además, no te funcionaría el retroceso a menos que oprimas SHIFT+LEFT pues aquí lo que se supone que no funciona realmente no funcioona al no tener oprimida la tecla SHIFT. Yo más o menos lo he podido hacer mandando una doble simulación:
pero deja algo extraño al teclado pues no recibe el UP del SHIFT. Y si se lo añdo, entonces no funciona. Por otra parte, lo que quieres lograr, creo que yo no lo haría así. Para empezar, ¿has visto lo que sucede cuando intentas seleccionar una celda con el ratón? No he probado todavía, pero me parece que sería mejor intentar no simular esas teclas y manipular los valores de Col y Row en el evento KeyDown. // Saludos |
#3
|
||||
|
||||
Saludos. |
#4
|
||||
|
||||
A ver porque igual suelto una tontería (como casi siempre).
Uno de nuestros componentes (que no he hecho yo) está basado en el StringGrid y nosotros podemos darle propiedades para que se pueda editar o no. He estado echando un vistazo y veo que el que se pueda editar o no se decide en el evento OnSelectCell. En este evento creo que puedes comprobar si la columna en la que se encuentra se puede editar o no y devolver True o False según te interese. Igual esto te ayuda en vez de intentar controlar el tema del teclado porque si en vez de desplazarte con el teclado picas con el ratón en una celda que no quieres que se edite ¿qué haces?. Saludos Edito: Si que he soltado una tontería, no he leido bien el mensaje y entendía que preguntabas otra cosa, mis disculpas.
__________________
Be water my friend. Última edición por newtron fecha: 20-09-2011 a las 19:24:20. |
#5
|
||||
|
||||
Cita:
// Saludos |
#6
|
||||
|
||||
No vi que roman contestó mientras yo tecleaba y que apuntó algunas cosas de lo luego yo plasmé en mi código. Aclarar que las pruebas que he realizado no dejan "atontado al teclado" y funciona bien al seleccionar con el ratón y luego volver a "teclear".
Pruébalo a ver si te sirve. Saludos. |
#7
|
||||
|
||||
Cita:
// Saludos |
#8
|
||||
|
||||
Caramba, roman nos vamos pisando los mensajes, tampoco vi que respondias mientras ya estaba realizando otro comentario...
Saludos. |
#9
|
||||
|
||||
Je, je. Oye escafandra: algo no me funciona. Creí que sí, pero al poner tu código, el LEFT no me funciona cuando me cruzo con un cero. Por ello había quitado el UP del SHIFT, que es cuando se "atonta" el teclado. ¿Cambiaste algo en el SelectCell?
// Saludos |
#10
|
||||
|
||||
Para empezar, gracias a todos
Veamos, lo que estoy intentando conseguir es que sólamente puedan ser editables las celdas permitidas y además que el cursor ni siquiera pueda detenerse en las celdas no permitidas, de esa manera el usuario no tiene que estar con las teclas (o el ratón) moviéndose por las celdas, ya que él no sabe en cada caso cuales son las editables. Así que si moviéndose con las teclas IZQ y DER se posiciona automáticamente en las celdas válidas el trabajo es más cómodo, más intuitivo, más rápido y no hay equivocaciones. He probado el código que habéis puesto y el problema es que cuando va hacia atrás y se encuentra una celda no editable... ahí se queda. Sin embargo, pulsando Shift+Tab sí que se la salta y va a la anterior válida/editable. Es por lo que decía que debe de haber otra forma de simular de verdad esa tecla, el comportamiento no es exactamente igual. Voy a seguir haciendo unas pruebas, a ver... |
#11
|
||||
|
||||
Cita:
Y el problema es que ninguna solución que he encontrado simula de verdad la pulsación de las tecla shift+tab al mismo tiempo. He hecho otras pruebas y siempre acaban mal. Sin embargo si en ese punto le pulso a shift+tab continua perfectamente, o sea, hay que simular esas teclas de otra forma que las simule de verdad |
#12
|
||||
|
||||
Cita:
|
#13
|
||||
|
||||
Te he dejado en evidencia, ecfisa, jajaja... te he contestado a algo que has borrado porque ya lo había explicado antes, mientras tú contestabas
|
#14
|
||||
|
||||
Bueno pero, ¿has considerado lo que he dicho? Es decir, aún en el supuesto que logres, como dices, emular el TAB y SHIFT+TAB, ¿no notas que al usar el ratón la selección se comporta rara? En el evento SelectCell tú presupones que se genera por una navegación secuencial, siendo que no necesariamente es así.
// Saludos |
#15
|
||||
|
||||
Hola Casimiro.
Para impedir la edición se podría usar: En cuanto saltar las celdas, sigo en eso... Saludos.
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#16
|
||||
|
||||
Cita:
Saludos.
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#17
|
||||
|
||||
Cita:
Bueno, creo que voy a olvidar lo de las teclas, lo dejaré sólo que pueda ser editada/no editada y para diferenciarlas les cambiaré el color, por ejemplo. En fin, mi gozo en un pozo |
#18
|
||||
|
||||
A ver, prueba con esto:
GoingBackward y GoingForward son variables boolenas delcaradas en el formulario. En principio, con esto queda tal como quieres y se impide lo de la selección con el ratón (aunque no he hecho una prueba exhaustiva). Aún así, el resultado puede ser confuso para el usuario, sobre todo con las teclas de avanzar o retroceder página, pues el "ciclado" puede dejarlos en un lugar para nada esperado. ¡Ah! Me olvidaba: en el ejemplo, para simplificar, la verificación de si la celda es editable se hace contra el contenido en sí de la celda (0 o 1). // Saludos |
#19
|
||||
|
||||
Probando...
. |
#20
|
||||
|
||||
Pues el código que puse, en mi delphi 7 no hace cosas raras, no creo haber añadido nada mas que activar la tecla tab para que funcione como dice Casimiro.
Por si las moscas he realizado otra función para simular pulsaciones, mas acorde con el S.O. usando la API SendImput y que ya use en un ejemplo aquí para simular clicks de ratón.
Saludos. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Detectar pulsación de teclas Ctrl, Alt y Shift y teclas virtuales (de función,...) | rrf | Varios | 11 | 09-08-2017 13:24:21 |
El programa se queda "colgado" mientras copia y luego "despierta" | NeWsP | OOP | 5 | 10-03-2010 22:05:40 |
Como hacer que se vea "Si" en vez de "TRUE" en un DBGrid | lu9eui | C++ Builder | 2 | 07-08-2007 04:03:13 |
Necesito llamar a métodos de clases "hija" desde su clase "padre" | Flecha | OOP | 17 | 20-04-2007 00:03:53 |
|