Ver Mensaje Individual
  #6  
Antiguo 06-10-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
El método que estás usando no te va a funcionar. A grandes rasgos sucede lo siguiente:

cuando se genera un evento del teclado el sistema manda el correspondiente mensaje directamente al control de tu aplicación que en esos momentos tenga el foco, incluso si el formulario que lo contiene tiene su propiedad KeyPreview en true. El control con el foco examina la propiedad KeyPreview del formulario padre y si es true entonces redirige el mensaje al formulario en donde termina el procesamiento del mensaje. En otras palabras, KeyPreview no es más que una simulación de que el formulario recibe primero el mensaje. La realidad es otra.

Si al momento de generarse el evento del teclado el foco está en un control de un formulario MDIChild entonces el mensaje nunca pasará de allí incluso si su propiedad KeyPreview es true ya que él- y no el formulario principal -es el formulario padre del control.

La única forma entonces de que el formulario principal reciba el mensaje es que, o bien el control con el foco está directamente contenido en el formulario principal y la propiedad KeyPreview de éste es true o bien el foco lo tiene en sí el formulario principal. Pero esto último en realidad no sucede porque estamos hablando de un formulario MDI y estos formularios manejan una ventana oculta (ClientWindow) que es la que se encarga de manejar los formularios MDICHild).

De hecho, cuando cierras todos los formularios MDIChild sucede lo que observa taita, el foco se queda en esta ventana oculta (para mi gusto un error pero no sé si de Delphi o del mismo Windows).

Así que, en el caso general, tu formulario principal no recibirá el mensaje.

Cómo solventar esto depende de la finalidad que tengas. Si, por ejemplo, lo que quieres es que "algo" pase cuando se oprima una tecla en particular, digamos Ctrl+R, lo más sencillo que puedes hacer es colocar una componente TActionList (de la paleta estándar), agregarle una Action y a ésta asignarle Ctrl+R como ShortCut y procesar el "algo" en su evento OnExecute.

Si lo que quieres es que el formulario principal maneje cualquier tecla (aunque esto sería un poco raro) entonces puedes optar por colocar una componente TApplicationEvents (de la paleta Additional) y en su evento OnMessage detectar el mensaje WM_CHAR, WM_KEYDOWN o WM_KEYUP según sea el caso.

// Saludos
Responder Con Cita