![]() |
Eliminar Pulsación tecla Supr
Hola a todos/as. Ya he planteado este asunto y he buscado en los foros pero no consigo solucionarlo. Se trata simplemente de eliminar la pulsación de la tecla Supr, ya que la utilizo en los maestros para eliminar registros. Tengo el siguiente código:
Código:
procedure TIndices.DBCtrlGrid1KeyDown(Sender: TObject; var Key: Word; Por favor, indicarme como conseguir que no surpima tras su captura. Gracias |
Me parece que el problema está en la llamada a inherited. La haces antes de cualquier cosa y por tanto siempre hace lo que normalmente hace. Llama a inherited únicamente cuando la tecla no sea VK_DELETE.
// Saludos |
Gracias Roman. Voy a probarlo.
|
Hola Roman, ya lo he probado y he puesto lo siguiente:
Código:
procedure TIndices.DBCtrlGrid1KeyDown(Sender: TObject; var Key: Word; |
Has puesto KeyPreview a True en el formulario?
Un Saludo. |
Sí Marcos, la verdad es que me está volvinedo loco el tema.
|
Una pregunta:
Releyendo tu mensaje anterior al respecto hablas de tener programadas muchas teclas en OnKeyDown, entre ellas la tecla Supr. ¿Cómo es esta programación? Lo pregunto porque normalmente para borrar el registro se requiere Ctrl-Supr y no sólo Supr de manera que no sé si en alguna parte, quizá en el formulario ancestro, esté de alguna forma interfiriendo el código. // Saludos |
Roman, utilizar solo la tecla Supr fué una imposición. Respecto a la programación en los ancestros, todos los maestros, heredan de un formulario que a parte de otras características estéticas tiene programado el evento OnKeyPress de la siguiente manera:
Código:
procedure TPapiFRM.FormKeyPress(Sender: TObject; var Key: Char); Gracias. |
Volvamos al comienzo:
Cita:
Por otra parte, ¿qué pasa si pones la propiedad AllowDelete del DBCtrlGrid en false? // Saludos |
Dentro del DBCtrlGrid existen, entre otros, componentes DBEdit. Si el usuario està posicionado en uno de ellos, cuando se teclea la tecla Supr, a parte del comportamiento programado, aplica la tecla suprimir al texto de ese componente, poniendo el registro en modo edición al verse modificado.
Si se dice "sí" al mensaje de borrado, una vez que ha borrado, afecta al registro anterior (si existe) y si se dice "no" al borrado, afecta al registro actual. Un saludo. |
Pero entonces ¡está claro! ¿no?. Tu estás inhibiendo la tecla para el DbCtrlGrid pero no para el DbEdit.
// Saludos |
Pero si el DBCtrlGrid es el contenedor del DBEdit y es el que tiene programado el tratamiento de la tecla, ¿no se debería poder eliminar la pulsación de la tecla tras tratarla el DBCtrlGrid, para que no le afecte a ningún componente mas?.
En caso de no poder eliminarse la pulsación, ¿que habría que programar todos los componentes susceptibles de verse modificados por la tecla Supr, para que la ignorasen?. Si es así, será un trabajo muy largo. |
Si seleccionas todos los controles en los que quieres ese comportamiento a la vez y pulsas en su evento OnKeyDown y los vinculas con el mismo evento del DbCtrlGrid con esta operación lo arreglas todo.
Un Saludo. |
Gracias Roman y Marcos, lo he probado y funciona, solo ocurre que realiza dos veces el tratamiento de la tecla (una en el DBCtrlGrid y otra en el DBEdit), pero lo solucionaré con una bandera o apuntando a un procedimiento global que ignore la tecla Supr en esos componentes.
De todas maneras, ¿no os resulta curioso que no sea posible decirle al sistema que se olvide de la pulsación de una tecla de forma genérica?. Gracias de nuevo a ambos. Un saludo. |
De forma genérica lo haría para todo el formulario entonces solamente habría que tratar el evento OnKeyDown del formulario no del DbCtrlGrid.
Un Saludo. |
Creo haber encontrado una posible solución:
Como ya sabemos, el código Código:
procedure TForm1.DBCtrlGrid1KeyDown(...); Intenta esto: Código:
procedure TForm1.DBCtrlGrid1KeyDown(...); // Saludos |
Otra posible solución, si hacemos lo comentado por Marcos de informar el mismo método OnKeyDown para todos los controles, sería el controlar el parámetro Sender
Código:
if Sender.ClassType = TDbEdit then |
Gracias a todos, voy a probar ambos métodos y os comentaré.
Por fin y con vuestros consejos, le veo resolución efectiva. |
Wop!
Este método lo acabo de comprobar y funciona. De todas maneras, es una manera más de hacer lo mismo. Sabemos que podemos programar el onKeyDown/Up del Form y poniendo KeyPreview = true, podemos controlar la pulsación de la tecla en cualquier control. Lo que sucede es que solamente queremos controlar el evento en aquellos controles que estén dentro del CtrlGrid. Bien, cuando creamos un control dentro de un TDBCrtlGrid, su Parent apunta a una istancia de la clase TDBCtrlPanel, en consecuancia podríamos aplicar la siguiente tecnica: Código:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; |
Estupendo, funciona perfectamente.
Muchas gracias de nuevo a todos. |
La franja horaria es GMT +2. Ahora son las 15:47:06. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi