Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problemas con KeyDown (https://www.clubdelphi.com/foros/showthread.php?t=17214)

senpiterno 29-12-2004 06:11:11

Problemas con KeyDown
 
Hola amigos
Mi problema es el siguiente, estoy desarrollando una aplicacion que ademas de ejecutar acciones pecionando los botones de un toolbar, tambien ejecuta acciones asociadas a precionar una tecla determinada, por ejemplo F2:Ingresa, F3:modifica, F4:elimina, etc, dichas teclas las capturo en el evento keydown del Form el cual tiene activada la propieda KeyPreview:=True, para que los eventos de teclado sean capturados primero por el Form y despues por los controles del formulario. El problema es que por ejemplo al precionar al mismo tiempo F3 y F4, se ejecutan las dos acciones asociadas a cada tecla y al mismo tiempo, cada vez que se captura una tecla en el evento y que corresponde a una accion reconocida por el sistema se ejecuta el codigo correspondiente y asigno la variable key del evento a 0 (cero), para que la tecla deje de procesarse, pero como dije anteriormente si preciono 2 teclas asociadas a acciones reconocidas por el sistema, se ejecutan las 2 al mismo tiempo, como si el evento se llamara en paralelo por cada precion de una tecla, sin importar si otra tecla se esta procesando en el evento.
Existe alguna forma de que aunque se precionen 2 teclas al mismo tiempo el procesamiento o captura de la precion de dichas teclas sea efectuado no en paralelo, es decir que si preciono F3 y F4 al mismo tiempo, primero se capture la precion de una y despues de la otra, para de esta forma no sufrir problemas de colision en el codigo.

Cualquier ayuda es bien recibida

Saludos....

Lepe 29-12-2004 11:27:37

Código Delphi [-]
begin
if Ejecutando then Exit;
try
   Ejecutando := True;
//   todo el keyDown
finally 
  Ejecutando := False;
end;
end; // Keydown;

Esto no soluciona del todo tu problema, ya que no da preferencia a una acción sobre otra... no sé si me explico.

Otra Opción sería crear una propiedad del tipo Modo = (Modificando, Insertando, Eliminando, NoDefinido) para saber la accion en curso.

Si necesitas preferencia de una accion sobre otra, puedes hacerlo asï:
Modo = set of (Modificando, Insertando, Eliminando, NoDefinido)

en el evento OnKeyDown, asignas a Modo la acción segun la tecla pulsada. Si pulsas 2 teclas a la vez, Modo tendría los dos valores.
en el evento OnKeyUp chequeas los estados que estan activos y solo tomas el que tiene más prioridad. Algo así como:
Código Delphi [-]
begin OnKeyUp
  if (Modificando in Modo) and (Eliminando in Modo) then
       Procedimiento de Modificar; // damos prioridad a Modificar sobre Eliminar
  else....



Espero te sirva.


La franja horaria es GMT +2. Ahora son las 23:54:22.

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