Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Mensaje - Evento... antes de perder el foco, es posible??? (https://www.clubdelphi.com/foros/showthread.php?t=26712)

ariefez 01-11-2005 03:56:26

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.

Delphius 01-11-2005 04:11:53

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.

Al González 01-11-2005 04:21:11

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.

ariefez 01-11-2005 07:56:41

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

Lepe 01-11-2005 10:43:09

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

roman 01-11-2005 14:10:02

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

ariefez 01-11-2005 15:50:25

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.

Al González 01-11-2005 16:48:24

¡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. :)

ariefez 02-11-2005 04:26:16

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?

Al González 02-11-2005 21:24:58

¡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. :)

ariefez 02-11-2005 22:55:23

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.

ariefez 13-07-2007 23:28:21

1 Archivos Adjunto(s)
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.


La franja horaria es GMT +2. Ahora son las 19:00:52.

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