PDA

Ver la Versión Completa : Tecla presionada en un formulario


Dexter182
13-07-2005, 02:59:47
Quisiera preguntarles si alguien sabe como detectar que tecla fue presionada
en un formulario, pero en un evento cualquiera (no precisamente en Keypress, KeyUp, etc).
Necesitaría algo del estilo:
Si Tecla ESC = presionada entonces <sentencia>

Esto me ayudaría a solucionar un problema que tengo en un formulario, el cual paso a describir.
El formulario tiene su propiedad KeyPreview en TRUE.
Y en el evento KeyPress está puesto que si se presiona la tecla ESC se cierre el formulario.
A su vez, hay dos ComboBox: ComboBox_Seccion y ComboBox_Categoria.
Ambos tienen validaciones en el evento OnExit, los cuales tiran un mensaje de error en caso de que lo haya y vuelven el Focus al mismo ComboBox.
El problema aparece cuando se está posicionado sobre el ComboBox de Categoría, y en el está escrito algo que no es válido y se presiona ESC para salir del formulario.
Entonces al reabrir el formulario e intentar obligar a posicionar el Focus en el otro ComboBox me aparece el mensaje de validación del ComboBox_Categoria y además no me posiciona el Focus en el ComboBox_Seccion.
Bueno, espero que hayan entendido algo de lo que traté de explicar.
Les mando un saludo y desde ya agradezco las sugerencias que me puedan dar.

vtdeleon
13-07-2005, 03:05:01
Saludos

Puedes usar el Componente ActionList de la paleta Standard

Dexter182
13-07-2005, 17:12:10
Estuve observando lo del componente ActionList, pero no encontré la forma de que me fuera de utilidad.

Si me podés decir cómo usarlo o alguna otra alternativa te lo agradeceré.

Saludos.

dec
13-07-2005, 19:12:17
Hola,

A ver si esto puede serte de alguna utilidad. Dices que en el evento OnExit de los ComboBox validas que lo escrito en los mismos sea correcto, desde el punto de vista de la lógica de tu programa.

Utilizas el evento OnKeyPress del formulario para cerrar el mismo si el usuario pulsó la tecla Escape. Entonces, me pregunto, ¿no podrías hacer la comprobación del contenido de los ComboBox en una determinada función, de tal modo que, antes de que se cierre el formulario, puesto que el usuario pulse la tecla Escape, se comprobara lo escrito en los ComboBox?

Yo imagino algo así:


{Seudocódigo}

function TForm1.ComprobarOk : boolean;
begin
if (comboBox1 = '') or (comboBox2 = '') then
Result := false
else
Result := true;
end;

procedure TForm1.OnKeyPress(Key: Word);
begin
if (Key = Escape) then
begin
if ComprobarOk then
Close;
else
ShowMessage('Revisa los ComboBox');
end;
end;


Más o menos algo así, quiero decir. ¿Qué me dices? ¿me he perdido algo?

Por cierto, aprovechando la coyuntura: felicidades vtdeleon, por tu cumpleaños.

Nota: Se me ocurre antes de enviar este mensaje que tal vez pudieras realizar la comprobación de los datos en el evento "OnClose" u "OnCloseQuery" del formulario en cuestión.

Cualquier cosa que se te ocurra respecto de lo que he dicho no dejes de hacerla saber aquí mismo por ver si al cabo, estoy seguro, consigues solucionar el tema de alguna manera.

roman
13-07-2005, 23:04:23
y en el está escrito algo que no es válido y se presiona ESC para salir del formulario.
Entonces al reabrir el formulario e intentar obligar a posicionar el Focus en el otro ComboBox me aparece el mensaje de validación del ComboBox_Categoria y además no me posiciona el Focus en el ComboBox_Seccion.


Si el usuario presiona ESC es porque está cancelando la operación. Entonces lo lógico sería que en código cancelases también cualquier cosa que él haya puesto y dejar el formulario en su estado inicial. Esto lo harías en el evento OnCloseQuery examinando la propiedad ModalResult del formulario para ver que efectivamente es mrCancel.

¿Qué de dónde sacas lo de mrCancel?

En lugar de usar un evento como KeyPress para captar la tecla, lo más cómodo es que en tu formulario coloques dos botones: Aceptar y Cancelar. Al primero le asignas mrOk a su propiedad ModalResult y al segundo mrCancel. A éste último le pones en true su propiedad Cancel con lo cual, al oprimir ESC automáticamente se intentará cerrar el formulario (CloseQuery).

Por otra parte hazte esta pregunta:

¿Qué pasa si el usuario decide cancelar la operación pero en lugar de hacerlo con ESC lo hace oprimiendo el botón Cancelar?

El foco del teclado intenta pasar al botón generando el evento OnExit del combo y por tanto el error.

Por este tipo de razones, en mi opinión es muy incómodo para el usuario que las validaciones se hagan campo por campo. Yo mejor dejo todas en el evento OnCloseQuery.

// Saludos

Dexter182
15-07-2005, 03:33:16
Antes que nada debo agradecerles la enorme ayuda que me han brindado.

Las excelentes explicaciones que me proporcionaron han rendido sus frutos.

Me fue de muchísima utilidad lo del evento OnCloseQuery (el cual desconocía), y por sobre todo lo de la propiedad ModalResult.

Todo esto no solo me sirvió para solucionar este problema, si no que además me sirvió para aplicarlo en otras partes de mi programa.

No me queda nada más que decirles:

¡¡¡ Muchas gracias por su ayuda !!!.



Saludos.