Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Problema con shorcuts en frames dentro de pagecontrol (https://www.clubdelphi.com/foros/showthread.php?t=87337)

Caminante 16-12-2014 18:43:30

Problema con shorcuts en frames dentro de pagecontrol
 
Hola a todos espero les este yendo mejor que ami que ya no se como resolver esto.
Estoy pasando una aplicación de MDI a TDI utilizando frames dentro de un pagecontrol. Ya tengo programada esta parte y los frames se muestran correctamente dentro de su pestaña.
Peeeero me di cuenta de un pequeño detalle y es que en cada frame (todos heredan de un frame base) tengo varios botones y a estos les asigno una tecla rapida (por ejemplo &Salir para usar Alt + S).
El problema es que al usar la combinacion (Alt + S como en el ejemplo) se ejecuta la accion pero no para el frame de la pestaña actual. Igual pasa con las demas combinaciones para los frames que tienen la misma tecla asignada se ejecuta el codigo pero no del frame activo. Es como si en alguna parte el shortcut se fuera hacia el frame equivocado y la verdad no entiendo porque.
Espero haber sido claro (A veces ni yo me entiendo :D). Y me puedan ayudar a resolver este caso

Gracias por su atención...

Ñuño Martínez 17-12-2014 10:33:07

Puede que me equivoque, pero creo que los "short-cuts" se procesan según el orden de los componentes. Es decir, que va siguiendo la lista de componentes contenidos en el TForm (siendo el propio TForm el primero de ellos) hasta que que uno de ellos le dice que lo ha procesado.

Una solución: que los short-cuts sean gestionados por el TForm, no por los TFrames. Cuando el TForm recibe el evento, comprueba cuál es la página activa y llama al método correspondiente del TFrame que contenga.

Encontrar el TFrame correspondiente a la lengüeta no siempre es fácil. Yo uso el siguiente método en uno de mis proyectos secretos (a ver cuándo hablo de él :rolleyes:) que devuelve el TFrame correcto:
Código Delphi [-]
(* Devuelve el TFrame de la lengüeta indicada. *)
  FUNCTION TVntPrincipal.TomaFrameLengueta (CONST Lengueta: TTabSheet): TFrame;
  VAR
    Ndx: INTEGER;
  BEGIN
    FOR Ndx := Lengueta.ComponentCount - 1 DOWNTO 0 DO
      IF Lengueta.Components[Ndx] IS TFrame THEN
        EXIT (TFrame (Lengueta.Components[Ndx]));
    RAISE Exception.Create ('No encontró el TFrame de la lengüeta.')
  END;
Dos detalles:

Primero, que este código lo uso en Lazarus, puede que haya que cambiar algún detalle en Delphi.
Segundo, el RTTI ha de estar activo, evidentemente, para poder usar el operador "IS".

Caminante 17-12-2014 15:41:42

Hola y gracias por la idea voy a hacer algunas pruebas con ello.
AL final lo resolvi desctivando los shortcuts y activandolos solo para el frame activo.

Gracias por todo.


La franja horaria es GMT +2. Ahora son las 18:00:55.

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