Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-11-2005
Avatar de ariefez
ariefez ariefez is offline
Miembro
 
Registrado: sep 2005
Ubicación: Perú - Lima
Posts: 63
Poder: 19
ariefez Va por buen camino
Mensaje - Evento... antes de perder el foco, es posible???

bueno quisiera saber si se puede saber cuando un control esta por perder el foco, e visto q delphi dephine el CM_LOSTFOCUS se puede implementar de alguna forma para que mi aplicacion pueda recibir este mensaje.

si se preguntan porque es que busco esto, es porque quiero mostrar un mensaje al salir de un control, ya se que se puede hacer en el evento OnExit pero este evento ocurre cuando el control ya perdio el foco y otro control ya a recibido el foco.

bueno les agradesco por adelantado cualquier sugerencia.
Responder Con Cita
  #2  
Antiguo 01-11-2005
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Disculpa, se que no soy un gran experto... y tal vez no haya entendido muy bien lo que pretendes:

Por el título de tu hilo dices que deber realizar ALGO justo antes de que se pierda el foco... pero... por otro lado dices:

Cita:
Empezado por ariefez
si se preguntan porque es que busco esto, es porque quiero mostrar un mensaje al salir de un control
De cualquier manera, tengo entendido que no se puede saber cuando se está por abandonar el foco, pero SI cuando lo ha abandonado y cuando lo recibe.. tal cual lo dices.
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #3  
Antiguo 01-11-2005
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

Cita:
Empezado por ariefez
...e visto q delphi dephine el CM_LOSTFOCUS se puede implementar de alguna forma para que mi aplicacion pueda recibir este mensaje...
Si. Una forma de hacerlo es crear una clase derivada del componente en cuestión. Creando en ella un metodo mensaje declarado con la constante CM_LOSTFOCUS, para desempeñar en él la acción que deseas.

Espero esto sea de utilidad, seguimos en contacto.

Al González.

El día en que uno se convierte en héroe de cómic sabe que realmente se hizo famoso. Nelson Mandela.
Responder Con Cita
  #4  
Antiguo 01-11-2005
Avatar de ariefez
ariefez ariefez is offline
Miembro
 
Registrado: sep 2005
Ubicación: Perú - Lima
Posts: 63
Poder: 19
ariefez Va por buen camino
Esto si que es rapidez , agradesco sus prontas respuestas

Cita:
Empezado por Delphius
Por el título de tu hilo dices que deber realizar ALGO justo antes de que se pierda el foco... pero... por otro lado
Al parecer no me explique bien, pero si un control esta por perder el foco es porque se esta por salir de el, si me dejo entender;

Cita:
Empezado por Al González
Si. Una forma de hacerlo es crear una clase derivada del componente en cuestión. Creando en ella un metodo mensaje declarado con la constante CM_LOSTFOCUS
Pues eso es exactamente lo que busco, pero hay alguna forma de hacer para que el formulario reciba los mensajes o como podria declarar el mensaje ya que e puesto lo siguiente y sin resultado:

Código Delphi [-]
 
  TForm1 = class(TForm)
    ...
    private
      procedure CMLostFocus(var Message: TCMLostFocus); message CM_LOSTFOCUS;
    ...


implementation
 
procedure CMLostFocus(var Message: TCMLostFocus); message 
begin
  ...
  {Nunca entra a esta parte}
end;

Recien estoy entrando en esto de los mensajes y necesito una base de donde poder guiarme, como haria para que mi
Responder Con Cita
  #5  
Antiguo 01-11-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Sin entrar en detalles, en la implementación te sobra la palabra message, en lo demás la implementación está bien. Otra cosa será el concepto .

saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #6  
Antiguo 01-11-2005
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
Si CM_LOSTFOCUS es un mensaje que ha de recibir el control entonces deberá hacerse tal como dice Al. No puede esperarse que simplemente poniendo la declaración en el formulario entonces el mensaje del control le llegará al formulario.

Por otro lado me da la impresión de que CM_LOSTFOCUS no se genera nunca. Al menos, buscando en las fuentes de la VCL, sólo encuentro la línea donde se declara la constante pero nada más.

Haciendo algunas pruebas veo que WM_KILLFOCUS sí se genera antes de perderse el foco.

// Saludos
Responder Con Cita
  #7  
Antiguo 01-11-2005
Avatar de ariefez
ariefez ariefez is offline
Miembro
 
Registrado: sep 2005
Ubicación: Perú - Lima
Posts: 63
Poder: 19
ariefez Va por buen camino
lo de message fue un error al escribir el mensaje.

Por otra lado e implementado el mensaje WM_KILLFOCUS pero no se genera.

Cita:
Empezado por Roman
Haciendo algunas pruebas veo que WM_KILLFOCUS sí se genera antes de perderse el foco.
me podrias decir como hiciste esas pruebas.
Responder Con Cita
  #8  
Antiguo 01-11-2005
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

¡Hola a todos!

Cita:
Empezado por ariefez
...he implementado el mensaje WM_KILLFOCUS pero no se genera...
¿Cómo lo has implementado?

Como comentó Román, el evento no le llega a la forma. Según el archivo Win32.hlp que todo programador Windows debe tener al alcance de uno o dos clics: «The WM_KILLFOCUS message is sent to a window immediately before it loses the keyboard focus». Entendiendo en términos generales que el concepto de ventana en Win32 es cualquier objeto visible que tenga un identificador (handle) —controles y formas—. Así pues, para que el manejador de mensaje responda deberá ser implementado, como dije antes, en una nueva clase derivada del componente control en cuestión, ¿alguno en especial Ariefez? (TEdit, TButton, TDBGrid...), es decir, creando un nuevo componente descendiente.

Ahora bien, existe una manera de interceptar el mensaje sin tener que definir nuevas clases de componentes, la cual consiste en utilizar el evento OnMessage del objeto Application (más fácilmente con un componente TApplicationEvents). Ahí podrás interceptar el mensaje wm_KillFocus y cualquier otro que sea puesto en la cola de mensajes del programa.
Corrección: El mensaje wm_KillFocus no es puesto en la cola de mensajes de la aplicación. Por lo tanto no se puede utilizar TApplicationEvents para interceptarlo. «Note: OnMessage only receives messages that are posted to the message queue, not those sent directly with the Windows API SendMessage function», ayuda de Delphi.

Espero esto sea de utilidad, seguimos en contacto.

Al González.

Última edición por Al González fecha: 02-11-2005 a las 21:39:54. Razón: Corrección
Responder Con Cita
  #9  
Antiguo 02-11-2005
Avatar de ariefez
ariefez ariefez is offline
Miembro
 
Registrado: sep 2005
Ubicación: Perú - Lima
Posts: 63
Poder: 19
ariefez Va por buen camino
Disculpen por la demora pero no e podido entrar estas horas, yo especialmente busco capturar el evento para los TComboBox y TDBEdit; e probado con el TApplicationEvents

Código Delphi [-]
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  if Msg.message = WM_KILLFOCUS then showmessage('...');
end;

pero nunca se muestra el mensaje estoy haciendo algo mal?
Responder Con Cita
  #10  
Antiguo 02-11-2005
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

¡Hola de nuevo!

Pido una disculpa. Tal parece que el mensaje wm_KillFocus no es puesto en la cola de mensajes de la aplicación (como lo supuse). Solamente es enviado al control que está por perder el foco.

Por lo tanto es recomendable recurrir a la opción de crear clases derivadas de TComboBox y TDBEdit, incluyendo en ellas los manejadores de mensajes necesarios. Pero antes de que lo hagas Ariefez, ¿podrías detallarnos el contexto de este caso? (antecedentes, objetivo, etc.). Y decirnos qué quieres que el programa realice cuando uno de los controles esté por perder el foco.

Gracias.

Al González.
Responder Con Cita
  #11  
Antiguo 02-11-2005
Avatar de ariefez
ariefez ariefez is offline
Miembro
 
Registrado: sep 2005
Ubicación: Perú - Lima
Posts: 63
Poder: 19
ariefez Va por buen camino
Claro q si, bueno mi problema surgio a causa de esto:

antes de cambiar de un ComboBox a otro control, verifico q lo ingresado se encuentra en sus items, si no esta incluido entonces muestro un mensaje ("...agregar el...").

esto lo hacia en el evento OnExit pero cuando paso de un ComboBox a otro ComboBox y se muestra el mensaje el cursor se pierde, ademas hace que me bloquee su desplegable, por eso queria saber si se podia de alguna forma capturar ese evento justo antes de q se pierda el foco;

e estado creando un derivado del ComboBox pero el Mensaje WM_KILLFOCUS solo salta cuando se pierde el foco del teclado, cuando hago clic en otro componente no pasa nada, y tambien cuando la aplicacion pierde el foco,

un ejemplo sencillo de esto seria:

colocando dos ComboBox y en sus eventos OnExit mostrar un mensaje;
al hacer clic repetidamente en cada control, uno queda bloqueado.

se puede evitar ese bloqueo de alguna forma

en mi caso no muestro los mensajes tan seguido.
Responder Con Cita
  #12  
Antiguo 13-07-2007
Avatar de ariefez
ariefez ariefez is offline
Miembro
 
Registrado: sep 2005
Ubicación: Perú - Lima
Posts: 63
Poder: 19
ariefez Va por buen camino
Este es un tema que habia dejado colgado, y como no encontre solucion en su momento opte por otra, pero ahora navegando por la web exactamente en CodeGear encontre un ejemplo q solucionaba dicho poblema, sin mas q decir aca les adjunto la solucion a dicho problema, aunque solo se implementa para el evento OnEnter es valido para OnExit.
Archivos Adjuntos
Tipo de Archivo: zip Example_OnenterMsg.zip (1,9 KB, 44 visitas)
Responder Con Cita
Respuesta



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 19:31:15.


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