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 05-10-2004
nicolasdom nicolasdom is offline
Miembro
 
Registrado: ago 2004
Posts: 41
Poder: 0
nicolasdom Va por buen camino
OnKeyPress y fsMDIForm = LOCO!!!

Gente me estoy volviendo loco... por alguna razon que no se cual es pongo en el OnKeyPress del form padre un ShowMessage('hola anda!!!') pero no me anda!!! Tengo el keyPreview en true! Que puede ser?
Responder Con Cita
  #2  
Antiguo 06-10-2004
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Mira este ejemplo a ver si es que no has puesto que tecla es la que a provocar que el texto se muestre:
Código Delphi [-]
 procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
 begin
  If key = #13 then
  ShowMessage('Pulsó enter');
 end;

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.

Última edición por marcoszorrilla fecha: 06-10-2004 a las 08:53:03.
Responder Con Cita
  #3  
Antiguo 06-10-2004
nicolasdom nicolasdom is offline
Miembro
 
Registrado: ago 2004
Posts: 41
Poder: 0
nicolasdom Va por buen camino
No hay caso... el tema que en un formulario comun me anda. Pero en el MainForm no! Es un problema que ya me esta volviendo loco porque son tres lineas de codigo... lo tengo enfrente mio y no se que pasa! Help me help me...

Código:
 
procedure TMainForm.FormKeyPress(Sender: TObject; var Key: Char);
begin
  ShowMessage('hola')
end;
Responder Con Cita
  #4  
Antiguo 06-10-2004
Avatar de taita
taita taita is offline
Miembro
 
Registrado: sep 2003
Ubicación: Murcia, San Pedro del Pinatar
Posts: 115
Poder: 21
taita Va por buen camino
Hola.
Has comprobado que el formulario tenga el foco?
A mi me ha pasado que al trabajar con MDI a veces al regresar al formPrincipal tras la ejecución del MDIhijo el foco se pierde y no se sabe a donde va a parar.
También puedes probar a crear un evento OnClick en el formPrincipal, con el mismo código, para ver si está funcionando correctamente.
Responder Con Cita
  #5  
Antiguo 06-10-2004
nicolasdom nicolasdom is offline
Miembro
 
Registrado: ago 2004
Posts: 41
Poder: 0
nicolasdom Va por buen camino
Hice lo que me manifestastes... puse en el MainForm en el evento Onclick el ShowMessage y anduvo bien. Pero sin embargo el OnkeyPress Sigue sin andar. Como puedo ver el tema del foco que me comentastes? AYUDA GENIOS... delphi.com.ar copate... soy de tu palo vamo vamo... argentina vamo vamo a ganar...
Responder Con Cita
  #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
Poder: 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
  #7  
Antiguo 06-10-2004
nicolasdom nicolasdom is offline
Miembro
 
Registrado: ago 2004
Posts: 41
Poder: 0
nicolasdom Va por buen camino
Muchisimas gracias por el tiempo que te has tomado para contestarme.

Les explico que lo que tengo es un MainForm con un menu del estilo NavBar de los de devExpress (si alguien los quiere ) y un par de barras mas. Como estoy desarrollando una aplicacion que estaba echa con aterioridad en cobol (DOS) la idea es dar la opcion mouse y click click click pero seguir con la compatibilidad de teclas para los que ya venian usando el sistema hace mucho tiempo (Requerimiento no funcional de Usabilidad) no tengan inconvenientes. Voy a probar lo de interceptar mensajes. Si alguien tiene otra solucion creo que es el momento... ya que una vez que lo hago no me gustaria volver a tocarl o

Un abrazo para todos los que componen este excelente foro.

Nicolas.
Responder Con Cita
  #8  
Antiguo 06-10-2004
Avatar de taita
taita taita is offline
Miembro
 
Registrado: sep 2003
Ubicación: Murcia, San Pedro del Pinatar
Posts: 115
Poder: 21
taita Va por buen camino
Hola de nuevo.
He estado haciendo algunas pruebas y como te omentabamos con anterioridad el foco se pierde al dejar el MDIhijo.
Lo que he probado y me ha funcionado ha sido a devolver el foco a la MDIPrincipal ANTES de cerrar el MDIhijo.
Es decir: Pasas el foco al MDIPrincipal y desde ahi cierras el MDIhijo y acto seguido devuelves el foco al MDIPrincipal en el mismo procedimiento.
Es un poco lioso lo que acabo de explicar.... pero funciona.
Responder Con Cita
  #9  
Antiguo 09-10-2004
nicolasdom nicolasdom is offline
Miembro
 
Registrado: ago 2004
Posts: 41
Poder: 0
nicolasdom Va por buen camino
Question

Jaja yo de nuevo... me he puesto a implementar las ideas que me han dado y en los dos casos me surgieron problemas.

Caso 1) Usando Application Events.

El tema es que no se de donde saco el mensaje WM_KEYDOWN. Es decir este codigo esta mal la comparacion del Msg = WM_KEYDOWN. Supongo que debe ser algo como msg.algo pero no me anduvo. (creo que con esto si me ayudan no va a haber problemas). El siguiente problema (una vez resulto esto) es sabes que letra apreto. Eso de donde lo saco? (les pongo el codigo)

Código:
procedure TMainForm.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  if Msg = WM_KEYDOWN then
	ShowMessage('tecla presionada');
end;

Caso 2) Usando Lo de Foco que comento Taita. Tengo una aplicacion con un MDI. En el MainForm (fsMDIForm) tengo un menu (navbar) al estilo xp. Lo que quiero es que tambien se acceda al menu con las teclas (por compatibilidad de versiones anteriores). EJECUTO, no abro ningun hijo y sin embargo no me funca lo de las teclas. En si la pregunta es como le doy el foco al mainform si es que no lo tiene.

Muchas gracias.

Espero solucinar esto rapido... me esta demorando demasiado...

AAA por ultimo... como hacen para poner codigo delphi y les ponga colorcito? (aca en el foro!!! )
Responder Con Cita
  #10  
Antiguo 09-10-2004
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Para lo que pides relacionado con el coloreado de las etiquetas, tienes que utilizar en vez de la etiqueta Code la etiqueta Delphi, que por cierto ha sido creada por Román, que es uno de los foristas, y en este caso también Moderador, que te están respondiendo en este hilo.
En cuanto a la demora que te está tomando la solución del problema, no te preocupes, los problemas por desgracia se suelen solucionar en el ámbito temporal en proporción inversa a la celeridad que nosotros les imponemos.

Dicen que decía Napoleón: "Vísteme despacio que tengo prisa".

Un Saludo.

__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #11  
Antiguo 09-10-2004
nicolasdom nicolasdom is offline
Miembro
 
Registrado: ago 2004
Posts: 41
Poder: 0
nicolasdom Va por buen camino
JaJaJa... Tienes mucha razon... intentare convencerlo a mi jefe...


Código Delphi [-]
  ShowMessage('Esto es una prueba para las etiquetas delphi  ');
  ShowMessage('AYUDENME!!!!!!!');
Responder Con Cita
  #12  
Antiguo 09-10-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
Entiendo tu interés por la compatibilidad con el uso del teclado pero siento que no es éste (WM_KEYDOWN) el camino a seguir. Como ya te había mencionado antes, hacer un manejador para todas las teclas no es algo muy "normal". Vamos a suponer que lo que deseas es que con determinadas teclas el usuario pueda realizar ciertas operaciones: guardar o abrir archivos, abrir catálogos, insertar algún registro, etc. Todas éstas son acciones de tu programa y como tales Delphi te proporciona un mecanismo ideal para ello: la componente TActionList y sus subcomponentes TAction (que ya te había mencioando). Por cada acción de tu programa añades una TAction al ActionList, y usas su propiedad Shortcut para establecer la tecla o combinación de teclas que desees para iniciar la acción. El código en sí de la acción lo programas en el evento OnExecute del TAction. Esto, además de ayudarte en tu problema, fomenta la centralización del código: suponte que determinada acción quieres ejecutarla ya sea con una tecla, con un botón de la barra de herramientas o con un item de un menú. Basta que al item y al botón les asignes la TAction correspondiente para que al ahcer click en uno u otro se ejecute el OnExecute. Las TAction te permiten además centralizar el texto que aparece así como te permite, usando el evento OnUpdate (del TAction o del TActionList), habilitar o inhabilitar en un lugar central los controles que generen la acción (incluido el shortcut) según estén disponibles o no en determinado momento.

En fin, te recomiendo que consideres esta opción ya que me parece no solo que puede resover tu problema sino que además te permitirá escribir un código más prolijo.

Si aún así requieres de WM_KEYDOWN puedes buscar en la ayuda del SDK de Windows (incluida con Delphi) para ver cómo es que se obtiene la información precisa de la tecla oprimida.

// Saludos
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 15:00:23.


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