Con una clase (TObject) Tengo:Mensajes personalizados en clases sin ventana: ¿necesita un controlador predeterminado?
private
FHwnd : HWND;
procedure HandleMyMessage(var Message : TMessage); message TH_MYMESSAGE;
donde TH_MYMESSAGE = WM_USER + 1
En el constructor de la clase:
FHwnd := AllocateHWND(HandleMyMessage);
El único objeto que recibe una referencia a FHwnd
es una costumbre privada TThread (creado dentro de esta clase) y el único mensaje que publica es TH_MYMESSAGE
. Entiendo que la directiva message
en la declaración de procedimiento restringe su manejo a solo TH_MYMESSAGE
.
Esto funcionaba bien en las pruebas, pero después de la integración en una aplicación mucho más grande recibo retroalimentación que HandleMyMessage
está disparando también para otros mensajes (con resultados obvios no deseados).
Esto se corrigió fácilmente agregando if Message.Msg <> TH_MYMESSAGE then Exit;
en HandleMyMessage
. Mi pregunta es: ¿por qué está pasando esto?
Mi mejor conjetura es que AllocateHWND
ha hecho HandleMyMessage
el equivalente de un DefWndProc
a pesar de tener la directiva message
. ¿Hay una forma correcta de implementar esto que me falta?
su conjetura es correcta '' HandleMyMessage' convierte WndProc' de creado no visual ventana. para que reciba todos los mensajes; su solución para filtrar 'Message.Msg' también es correcta. modificador de método 'message' Usado por Delphi para el manejo predeterminado de llamadas' TObject.Dispatch' (en clases sin ventana) – teran
@teran Asumiendo, entonces, que quería un 'WndProc' predeterminado para otros mensajes sería' HandleMyMessage' filter correctamente con la directiva 'message' si hubiera hecho' AllocateHWND' en algún otro procedimiento general? –
@Ken No hay problema con WM_USER aquí. –