Ir al contenido


Foto

[RESUELTO] Falla al captar tecla de función


  • Por favor identifícate para responder
16 respuestas en este tema

#1 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 21 enero 2011 - 05:16

Hola chicos y chicas de la comunidad !!!

Aquí ando con una preguntilla que me trae dando vueltas y vueltas...

Tengo un formulario donde se encuentra un ActionList, en él hay dos acciones que requieren ser llamadas con el mismo ShortCut F3 dependiendo de qué control esté activo al momento de presionar la tecla. Si se encuentra dentro de un TFrame llama la Acción 1 en caso contrario manda llamar a la Acción 2...

Yo quise controlarlo de la siguiente manera en el OnKeyDown de la forma...



delphi
  1. if (bEnGrid) and (Key = VK_F3) then
  2.   begin
  3.     acLocalizaExecute(Self);
  4.   end;
  5.  
  6.   if (not bEnGrid) and (Key = VK_F3) then
  7.   begin
  8.     acFBCatalogoExecute(Self);
  9.   end;



... Donde bEnGrid es una variable booleana que me dice si el el F3 se invoca desde un Frame o no...

El caso es que no me detecta la pulsación de la tecla F3 por lo que no ejecuta ninguna de las dos acciones, intenté poniendo un breakpoint en la primera condición para saber qué valor estaba tomando la variable bEnGrid pero como comento, nunca entra a la condición por más que presiono la tecla F3  8o|  :....

Por dónde ando mal ?  :embarrassed:

Gracias y Saludox ! :)
  • 0

#2 Héctor Randolph

Héctor Randolph

    501st Legion

  • Moderadores
  • PipPipPip
  • 664 mensajes
  • LocationMéxico

Escrito 21 enero 2011 - 05:39

Prueba con la propiedad KeyPreview de la forma. Debe estar en True si quieres que capture los eventos del teclado.

Saludos
  • 0

#3 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 21 enero 2011 - 05:53

Gracias por responder amigo Hector (y)... te comento que la propiedad está en True tal y como lo mencionas y otras teclas si me las capta (inclusive otras de función)... Pero con el F3 se niega rotundamente...

8o|  :

Saludox ! :)
  • 0

#4 razadi

razadi

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 681 mensajes
  • LocationMéxico D.F.

Escrito 21 enero 2011 - 06:35

Hola Fena,

mmm, quien habrá programado eso???, pero habría forma de ver más el código? es decir con lo que pones no sé si podría ayudarte...


*-) *-) *-) *-) *-)

saludos
  • 0

#5 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 21 enero 2011 - 07:06

¿Y ya revisaste bien el ActionList y su asocio con el form?... yo diría que omitiste algo, solo supongo


Saludos!
  • 0

#6 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 21 enero 2011 - 07:28

Revisa si tienes algo en los eventos OnUpdate de las Acciones.
Prueba algo así como: que depronto no deje activar la acción.



delphi
  1. if Key = VK_F3 then
  2.   begin
  3.     ShowMessage('algo');
  4.   end;



y por último ensaya con otro teclado.

Saludos
  • 0

#7 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 21 enero 2011 - 09:19

No sabría decir mucho sobre el problema... más considerando que los compañeros han aportado algunas pistas que podrían conducir a la solución.

Viendo tu código yo diría que puede escribirse de éste modo:



delphi
  1. if (Key = VK_F3)
  2.   then if bEnGrid
  3.             then Hacer1
  4.             else Hacer2;



Saludos,

  • 0

#8 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 22 enero 2011 - 02:21

Puede ser un problema del ActionList, aunque por código controles cuando llamas a uno o a otro procedimiento, puede darte un error  interno en le componente y no hacer la respectiva llamada, te recomiendo elimines los ShortCut F3 y apliques el mismo código que ya tienes, ya que aunque en el ActioList no este las llamadas si están los procedimientos.
  • 0

#9 andres1569

andres1569

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 431 mensajes

Escrito 22 enero 2011 - 05:58

Hola Fenareth,

Si tienes cualquier componente TAction asociado a un ShortCut y dicha acción está habilitada (Enabled = True) y tiene asociada un evento en OnExecute, éste se ejecutará con preferencia sobre el evento KeyDown del formulario, aunque éste tenga a True la propiedad KeyPreview.

Alguna vez me he encontrado conflictos de este tipo, en que quiero tener en el mismo formulario dos acciones con el mismo ShortCut asociado y que se ejecute una u otra según el control activo, y la forma de solucionarlo es programar el evento OnUpdate de cada acción, habilitando o deshabilitando cada acción según convenga. En tu caso sería algo así:



delphi
  1. procedure TForm1.acLocalizaExecute(Sender: TObject);
  2. begin
  3.   // Lo que sea
  4. end;
  5.  
  6. procedure TForm1.acLocalizaUpdate(Sender: TObject);
  7. begin
  8.   acLocaliza.Enabled := ActiveControl = EditLocaliza;
  9. end;
  10.  
  11. procedure TForm1.acFBCatalogoExecute(Sender: TObject);
  12. begin
  13.   // Lo que sea
  14. end;
  15.  
  16. procedure TForm1.acFBCatalogoUpdate(Sender: TObject);
  17. begin
  18.   acFBCatalogo.Enabled := ActiveControl = EditFBCatalogo;
  19. end;


De todas formas, me extraña que no te lance nada cuando ejecutas F3, ya que al menos, aunque no se dispare el evento OnKeyDown del formulario, sí debería dispararse el Execute de una de las dos acciones.

Otra cosa, probándolo ahora he tenido algunos resultados anárquicos que tienen que ver con la frecuencia con que se llama a los eventos OnUpdate de cada acción. En realidad dichos eventos se deberían llamar cada vez que ocurre algo en el formulario, una pulsación de teclado, un click del ratón ... etc, actualizando el estado de las acciones, pero no siempre sucede así (supongo que hay algo mal por ahí dentro). Para mayor seguridad, yo dejaría ambas acciones deshabilitadas desde diseño y habilitaría cada acción "a mano", cada vez que entras al control deseado:



delphi
  1. procedure TForm1.EditLocalizaEnter(Sender: TObject);
  2. begin
  3.   acLocaliza.Enabled := Sender = EditLocaliza;
  4.   acFBCatalogo.Enabled := Sender = EditFBCatalogo;
  5. end;
  6.  
  7. procedure TForm1.EditLocalizaExit(Sender: TObject);
  8. begin
  9.   acLocaliza.Enabled := FALSE;
  10.   acFBCatalogo.Enabled := FALSE;
  11. end;


En este ejemplo, puedes hacer que ambos controles (supongo que son Edits), compartan sus eventos OnEnter y OnExit, que ya se encargan de habilitar/deshabilitar la acción correspondiente.

Saludos

  • 0

#10 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 24 enero 2011 - 04:11

Chicos gracias a todos por contestar, he estado haciendo pruebas con todos sus consejos, pero aún sigo dónde mismo... :(

Hice un proyecto aparte para generar las pruebas que me comentó andres1569 con este codigo...



delphi
  1. procedure TForm4.acAccion1Execute(Sender: TObject);
  2. begin
  3.   ShowMessage('El focus está en el Edit1 !!!');
  4. end;
  5.  
  6. procedure TForm4.acAccion2Execute(Sender: TObject);
  7. begin
  8.   ShowMessage('El focus está en el Edit2 !!!');
  9. end;
  10.  
  11. procedure TForm4.Edit1Enter(Sender: TObject);
  12. begin
  13.     acAccion1.Enabled := Sender = Edit1;
  14.     acAccion2.Enabled := Sender = Edit2;
  15. end;
  16.  
  17. procedure TForm4.Edit1Exit(Sender: TObject);
  18. begin
  19.     acAccion1.Enabled := False;
  20.     acAccion2.Enabled := False;
  21. end;
  22.  
  23. procedure TForm4.Edit2Enter(Sender: TObject);
  24. begin
  25.     acAccion1.Enabled := Sender = Edit1;
  26.     acAccion2.Enabled := Sender = Edit2;
  27. end;
  28.  
  29. procedure TForm4.Edit2Exit(Sender: TObject);
  30. begin
  31.     acAccion1.Enabled := False;
  32.     acAccion2.Enabled := False;



En el Form4 tengo un TActionList con 2 Acciones (acAccion1 y acAccion2) ambas con el mismo ShortCut (F3) y ambas con el Enabled en False, además de dos Edits que se supone deberían controlar las acciones...

El resultado ?... Cuando en mi TActionList está colocada primero la acAccion1 y estoy dentro de Edit1 al presionar F3 se ejecuta la acción sin problemas. Pero si me coloco en el Edit2 el F3 no manda llamar acción alguna...

En cambio si coloco en el TActionList primero la acAccion2 y estoy dentro de Edit2 al presionar F3 se ejecuta la acción, pero si entro al Edit1 no responde el F3...

8o|  :  (li)

Alguna luz nueva sobre el asunto ? :(

Muy agradecida...

Saludox ! :)
  • 0

#11 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 24 enero 2011 - 04:59

Prueba con este código:


delphi
  1. procedure TForm4.acAccion1Execute(Sender: TObject);
  2. begin
  3.   ShowMessage('El focus está en el Edit1 !!!');
  4. end;
  5.  
  6. procedure TForm4.acAccion2Execute(Sender: TObject);
  7. begin
  8.   ShowMessage('El focus está en el Edit2 !!!');
  9. end;
  10.  
  11. procedure TForm4.EditEnter(Sender: TObject);
  12. begin
  13.   if Sender = Edit1 then acAccion1.ShortCut := VK_F3
  14.   else acAccion1.ShortCut := 0;
  15.   if Sender = Edit2 then acAccion2.ShortCut := VK_F3
  16.   else acAccion2.ShortCut := 0;
  17. end;



Lo eventos OnEnter de los dos Edit apuntan al mismo. No necesitas nada mas.

El problema es que no puedes tener dos ShorCut iguales para dos acciones distintas...


Saludos.
  • 0

#12 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 24 enero 2011 - 05:25

:|

Queeeeeee tal !!!!!

Tan sencillo como eso amigo escafandra  *-)  (y)... nada complicado pero nada me quitaba de la cabeza el hecho de que se podía controlar dos shortcut iguales en dos acciones diferentes  :D

Gracias a todos !!!!!!!!! (pero qué buena comunidad !!!!  (b))

Saludox ! :)

P.D. Que algún administrador ponga ésto como resuelto, yo tengo mucho trabajo  *-)  :D  :p
  • 0

#13 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 24 enero 2011 - 05:30

...Que algún administrador ponga ésto como resuelto, yo tengo mucho trabajo  *-) :D :p

Pues en ese caso yo no puedo... No soy administrador... :p :D :D (b)

Saludos.
  • 0

#14 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 24 enero 2011 - 05:34

...Que algún administrador ponga ésto como resuelto, yo tengo mucho trabajo  *-) :D :p

Pues en ese caso yo no puedo... No soy administrador... :p :D :D (b)

Saludos.


Creo que si puedes... pero bueno, lo haré yo  *-)


Saludos!
  • 0

#15 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 24 enero 2011 - 05:47

Jajajajajaja, gracias chicos por la ayuda !!!

Yo quería poner a trabajar a Egostar pero se salió por la tangente  ^o|  :p

:undecided:

Gracias de nuevo  :D  *-)  (y)
  • 0

#16 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 24 enero 2011 - 05:50

Ah caray, creo que llegue tarde, que bueno que siempre hay alguien que sale en auxilio de las damas en conflictos :D :D :D

Salud OS
  • 0

#17 andres1569

andres1569

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 431 mensajes

Escrito 25 enero 2011 - 09:41

El problema es que no puedes tener dos ShorCut iguales para dos acciones distintas...


Pues sí que llevas razón  (y) , estaba convencido de que se podía, ahora entiendo los problemas que me daba y que le echaba la culpa al método Update del TAction. Mirando la VCL veo que se recorren todas la acciones del ActionList y se coge la primera acción cuyo ShortCut coincide con el tecleado por el usuario, aunque dicha acción esté deshabilitada y no haga nada de provecho ^o|

Saludos
  • 0




IP.Board spam blocked by CleanTalk.