new multithreading delphi message delphi-xe2 hwnd

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?