Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-09-2004
Avatar de wonder boy
wonder boy wonder boy is offline
Miembro
 
Registrado: mar 2004
Ubicación: Argentina
Posts: 50
Poder: 21
wonder boy Va por buen camino
Capturar tecla en formulario hijo

Hola amigos, tengo una aplicacion que usa un formulario principal (no MDI pero parecido) y varios formularios que a medida que el usuario desea van siendo llamados desde el principal, estos formularios "hijos" tienen cada uno su evento keypressed o keydown los cuales no corresponden ni con el principal ni con los otros formularios, la cuestion es la siguiente, si yo presiono una tecla el formulario "hijo" no me toma el control de la tecla, o sea que no va ni al keypress ni al keydown del hijo sino al del padre o principal, como hago para que me tome el hijo y no el padre

pd: para que uno sea hijo del otro lo que hago es decirle que
frmHijo.parent := frmPadre;

pd2: lo pongo aca tambien pues es similar, si esta mal mil disculpas. Tengo que hacer varias teclas rapidas, con & o sea, si mi boton se llama Agregar, sera en realidad agregar, entonces pulsando Alt + A se ejecuta el boton, hasta ahi todo bien, pero despues me di cuenta que si presiono A solamente tambien me lo toma, como hago para que me lo tome solo si es A sin tener que entrar en el tema de los Keypress y Keydowns??

dedse ya muchas gracias
Responder Con Cita
  #2  
Antiguo 27-09-2004
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Para que el formulario hijo tome todas las pulsaciones de teclas, antes que los controles que hay en él, pon a true su propiedad KeyPreview.

Las teclas que lleven el & no tienes que ponerlas en el codigo de KeyDown, solo con ponerles el "&" ya estas diciendo que al presionar ALT+<letra> quieres que se ejecute ese botón, o lo que sea.

Recuerda que si a un Label le pones el &, y especificas un control en la propiedad FocusControl, al presionar ALT+<letra> te presentará el foco en dicho control.

Saludos
Responder Con Cita
  #3  
Antiguo 27-09-2004
Avatar de wonder boy
wonder boy wonder boy is offline
Miembro
 
Registrado: mar 2004
Ubicación: Argentina
Posts: 50
Poder: 21
wonder boy Va por buen camino
MI PROBLEMA NO ES EL KEYPREVIEW hay que leer bien los mensajes y no contestar por compromiso!!!!!, igualmente gracias !!!!!


Mi problema es que no me toma las teclas en el formulario hijo y si en el formulario padre, no es una herencia es un formulario hijo en el cual como digo en el mensaje principal esta hecho de la siguiente manera

frmHijo.parent := frmPadre;

en los metodos Keyspress y Keydown no tomo ninguna tecla, y si lo hago en el frmHijo, pues el problemon es que delphi hace caso omiso cuando presiono una tecla en el formulario hijo, tengan en cuenta que tambien tengo el foco en el formulario hijo.


Nro2
Ya se que no van en los eventos las teclas con &, quizas solo me pase a mi pero REPITO, si le pongo &A y SOLO presiono la tecla A, SIN PRESIONAR LA TECLA ALT, me lo toma de la misma manera que si lo hiciera con la tecla ALT, Se entiende????, por las dudas...

en mi programa ALT + S = S, ese es mi problema!!!, alguna sugerencia

iguelmente gracias LEPE por tu voluntad de contestarme, lamentablemente no me sirve tu respuesta, igualmente gracias, en serio, sin sarcasmo
Responder Con Cita
  #4  
Antiguo 27-09-2004
Avatar de vic_ia
vic_ia vic_ia is offline
Miembro
 
Registrado: ene 2004
Posts: 238
Poder: 21
vic_ia Va por buen camino
hola...

yo tengo configurada mi aplicacion de forma similar a la tuya, tengo una ventana padre, varias ventajas hijo (no son mdi), y tengo colocado el Keypreview del padre (no del hijo) y los "shortcuts" asignados por ejemplo a algun boton que llego a colocar (ya directo en el formulario hijo, ya en algun panel dentro del formulario hijo, etc.) o por ejemplo asignando los caption de los tabs en un TPagecontrol; y la verdad no se me presenta ese problema, el evento OnKeyPress del padre solo me responde al evento que necesito (cuando se presiona ENTER), todo funciona adecuadamente; pudiera ser que en alguna otra parte estes definiendo esa combinación o hayas asignado un shorcut para alguna acción o en ultima instancia que haya un error de compilacion...

saludos....
Responder Con Cita
  #5  
Antiguo 28-09-2004
Avatar de wonder boy
wonder boy wonder boy is offline
Miembro
 
Registrado: mar 2004
Ubicación: Argentina
Posts: 50
Poder: 21
wonder boy Va por buen camino
Lo que yo quiero saber son dos cosas, pero como pretenden contestarmelas juntas prefiero que me solucionen al menos una, y es la gran cuestion por la cual comence este hilo.


Como hago para que en el formulario hijo (que esta insertado en un formulario padre que NO es un MDI) me tome un onkeydown y no lo haga el padre, que tambien tiene un evento onkeydown, que debo hacer en este caso

pd: ver todos los mails anteriores para no repetir la respuesta, gracias
Responder Con Cita
  #6  
Antiguo 28-09-2004
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 wonder boy
Como hago para que en el formulario hijo (que esta insertado en un formulario padre que NO es un MDI) me tome un onkeydown y no lo haga el padre, que tambien tiene un evento onkeydown, que debo hacer en este casos
El problema es que el formulario "hijo" jamás va a recibir el evento del teclado por la manera en que está diseñada la VCL. Cuando se oprime una tecla es el control activo quien primero recibe el evento (aun estando el KeyPreview del formulario en true) en el método manejador WMKeyDown:

Código Delphi [-]
procedure TWinControl.WMKeyDown(var Message: TWMKeyDown);
begin
  if not DoKeyDown(Message) then
    inherited;
  ...
end;

DoKeyDown es un método estático (es decir, no podrás redefinirlo) que a grandes rasgos hace lo siguiente:

Busca el formulario padre (el que contiene al control)
Si este formulario tiene KeyPreview = true le manda el evento
En caso contrario llama al método protegido KeyDown del control.

El problema está en cómo se obtiene el formulario padre del control:

Código Delphi [-]
function GetParentForm(Control: TControl): TCustomForm;
begin
  while Control.Parent <> nil do Control := Control.Parent;
  if Control is TCustomForm then
    Result := TCustomForm(Control) else
    Result := nil;
end;

esto es, asciende por la cadena de padres hasta encontrar un control cuyo padre sea nil. Si el último distinto de nil es un formulario regresa éste como valor, en caso contrario regresa nil.

En tu caso, cuando el método DoKeyDown del control activo en el formulario "hijo" llama a GetParentForm, la búsqueda ascendente pasa por el formulario pero se lo salta ya que su padre (el formulario principal) no es nil. En resumen, GetParentForm regresará el formulario principal y no el formulario que contiene diectamente al control.

Y lo grave aquí es que GetParentForm no es más que una función (ni a método llega) por lo que no puedes cambiar su comportamiento.

// Saludos
Responder Con Cita
  #7  
Antiguo 28-09-2004
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
Una posible solución para detectar teclas en el formulario "hijo":

Coloca en el formulario "hijo" una componente TActionList y agrégale una acción por cada tecla que desees manejar. En cada acción asignas la tecla en cuestión a la propiedad ShortCut.

En el formulario "padre" colocas una componente TApplicationEvents cuyo evento OnShortCut será así:

Código Delphi [-]
procedure TFormPadre.ApplicationEvents1ShortCut(...);
begin
  Handled := FormHijo.ActionList1.IsShortCut(Msg);
end;

// Saludos
Responder Con Cita
  #8  
Antiguo 29-09-2004
Avatar de wonder boy
wonder boy wonder boy is offline
Miembro
 
Registrado: mar 2004
Ubicación: Argentina
Posts: 50
Poder: 21
wonder boy Va por buen camino
Gracias Roman, te has ganado un admirador (en programacion eh!) te tendre en cuenta en mis oraciones (de codigo Delphi, jajaja)


Deveras GRacias!!!
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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 10:35:37.


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