Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-07-2005
Avatar de Dexter182
Dexter182 Dexter182 is offline
Miembro
 
Registrado: jul 2005
Ubicación: Argentina
Posts: 95
Poder: 19
Dexter182 Va por buen camino
Unhappy Tecla presionada en un formulario

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.
Responder Con Cita
  #2  
Antiguo 13-07-2005
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 24
vtdeleon Va por buen camino
Saludos

Puedes usar el Componente ActionList de la paleta Standard
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!
Responder Con Cita
  #3  
Antiguo 13-07-2005
Avatar de Dexter182
Dexter182 Dexter182 is offline
Miembro
 
Registrado: jul 2005
Ubicación: Argentina
Posts: 95
Poder: 19
Dexter182 Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 13-07-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
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í:

Código Delphi [-]
 {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.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #5  
Antiguo 13-07-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Dexter182
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
Responder Con Cita
  #6  
Antiguo 15-07-2005
Avatar de Dexter182
Dexter182 Dexter182 is offline
Miembro
 
Registrado: jul 2005
Ubicación: Argentina
Posts: 95
Poder: 19
Dexter182 Va por buen camino
Smile Problema solucionado

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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 17:56:16.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi