multithreading - new - Mensajes personalizados en clases sin ventanas: ¿necesita un controlador predeterminado?
python multiprocessing (1)
Bueno, sí, por supuesto. AllocateHWnd
acepta un TWndMethod
para actuar como el procedimiento de ventana de la ventana creada. La confusión, supongo, se debe a que el compilador acepta la directiva messsage
. No lo pongas:
private
FHwnd : HWND;
procedure HandleMyMessage(var Message : TMessage);
..
procedure TMyClass.HandleMyMessage(var Message: TMessage);
begin
case Message.Msg of
TH_MYMESSAGE: //
end;
Message.Result := DefWindowProc(FHWnd, Message.Msg, Message.WParam, Message.LParam);
end;
Edición: (Respuesta al comentario). Para que el mensaje se maneje en la clase que creó la ventana de la utilidad, puede enrutar su mensaje desde la ventana que AllocateHWnd crea a su clase:
private
FHwnd : HWND;
procedure HandleMyMessage(var Message : TMessage);
procedure THMyMessage(var Message: TMessage); message TH_MYMESSAGE;
..
procedure TMyClass.HandleMyMessage(var Message: TMessage);
begin
case Message.Msg of
TH_MYMESSAGE: Dispatch(Message);
end;
Message.Result := DefWindowProc(FHWnd, Message.Msg, Message.WParam, Message.LParam);
end;
procedure TMyClass.THMyMessage(var Message: TMessage);
begin
//
end;
Con una clase (TObject) tengo:
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 un TThread personalizado privado (creado dentro de esta clase) y el único mensaje que publica es TH_MYMESSAGE
. Tengo entendido que la directiva de message
en la declaración de procedimiento restringe su manejo a solo TH_MYMESSAGE
.
Esto HandleMyMessage
bien en las pruebas, pero tras la integración en una aplicación mucho más grande, recibo información de que HandleMyMessage
está HandleMyMessage
otros mensajes (con resultados indeseables).
Esto se corrigió fácilmente agregando if Message.Msg <> TH_MYMESSAGE then Exit;
en HandleMyMessage
. Mi pregunta es: ¿Por qué sucede esto?
Mi mejor conjetura es que AllocateHWND
ha hecho que HandleMyMessage
el equivalente a un DefWndProc
pesar de tener la directiva de message
. ¿Hay una forma correcta de implementar esto que me estoy perdiendo?