Ver Mensaje Individual
  #2  
Antiguo 17-12-2014
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Reputación: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
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 ) 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".
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita