2012-02-08 37 views
5

Actualmente estoy intentando desarrollar un proyecto basado en Firemonkey. Estoy usando Firemonkey para sus funciones de interfaz de usuario ya que el proyecto consiste en muchas aplicaciones más pequeñas, cada una con un aspecto 3D. Actualmente solo estoy desarrollando/implementando en Windows con el framework FMX, pero puede ir multiplataforma en una fecha posterior.Firemonkey - Gestión de mensajes

He salido de la mayoría de los problemas que he encontrado construyendo una aplicación Windows VCL en el fondo para realizar una acción muy específica, y luego construir una interfaz FMX. Sin embargo, esto solo es adecuado cuando solo desea ejecutar la aplicación para realizar esa acción para la que está diseñado y, por lo tanto, puede ejecutar la aplicación con parámetros. En una de las aplicaciones, me he dado cuenta de la necesidad de usar mensajes (o algo similar). Por ejemplo, en mi aplicación FMX, si hago clic en "button1", quiero que envíe un mensaje a la aplicación VCL de fondo para realizar "acción1", en lugar de ejecutarlo con parámetros.

Un buen ejemplo podría ser el uso de la VCL TMediaPlayer en la aplicación de fondo, con la aplicación FMX-extremo delantero que se utiliza para mostrar la información y proporcionar un control de reproducción, pausa, etc. de tal manera que se convierte esencialmente en un FMX UI con capacidad VCL.

que he sido hasta ahora incapaz de encontrar nada sobre cómo los mensajes (por ejemplo, en VCL, estarían hechos con "SendMessage" o "PostMessage" o algo similar) son manejados con FireMonkey, ya sea a través de los locales archivo de ayuda, o mediante una amplia búsqueda en Google. Todo lo que he encontrado se ha relacionado con el correo electrónico (presumiblemente debido a la palabra "Mensaje" en la mayoría de mis términos de búsqueda).

Can anyone point me in the right direction on how messages would be handled with Firemonkey/FMX?

Saludos, de Scott Pritchard

+2

Usted sabe que puede usar VCL y FMX en el mismo proceso de aplicación, ¿no es así? Bueno, requiere un trabajo adicional, pero es técnicamente posible, y hay bibliotecas de terceros y artículos que le muestran cómo hacerlo. Así que no necesitaría lidiar directamente con los mensajes de la ventana si pudiera simplemente llamar al método 'Click()' de su botón VCL desde un manejador de eventos FMX UI (o mejor, aislar su código compartido en su propia función que tanto VCL como FMX pueden llamar cuando sea necesario). –

Respuesta

4

Mi entendimiento es que FireMonkey no se basa en las ventanas tradicionales, por lo que el envío de mensajes de ventana a FireMonkey controles no suele ser una opción. Aunque algunos controles sí usan Windows (más notoriamente, TCommonCustomForm), entonces puede usar la función FmxHandleToHWND() en la unidad FMX.Platform.Win para extraer un HWND de un TFmxHandle cuando sea necesario. No tengo ni idea de cómo recibir y personalizar los mensajes de la ventana en los controles de FMX, si eso es posible.

Firemonkey en Windows tiene acceso a la API de Win32, por lo que no debe haber nada que le impida enviar mensajes de ventana a otros controles de ventana, como su interfaz de usuario de VCL. Incluya la unidad Winapi.Windows en su cláusula uses para acceder a las funciones API de Win32, tal como lo haría en una aplicación VCL.

ACTUALIZACIÓN: dado que FireMonkey no expone el acceso a los mensajes que se envían a la ventana de un formulario, debe subclase manualmente la ventana para recibir mensajes antes de que FireMonkey los vea. Puede anular el método CreateHandle() del Formulario, llame primero al método inherited para crear la ventana, luego use FmxHandleToHWND() para obtener el HWND que puede subclase. Asegúrese también de anular el método DestroyHandle() para eliminar la subclase antes de llamar al inherited para liberar el HWND.

3

Actualmente, FireMonkey no tiene un controlador de mensajes que pueda usar para enviar y publicar mensajes.

Existe la posibilidad de conectar cosas utilizando oyentes como FireMonkey funciona internamente, pero nada de eso está documentado.

Así, en lugar, esto es lo que he hecho:

he creado mi propia clase personalizada "mensaje". Creo instancias de la clase y las agrego a una lista de seguridad de subprocesos desde cualquier subproceso que necesito. En el hilo principal, tengo un temporizador que verifica la lista y procesa los "mensajes".