Delphi es una herramienta de desarrollo de software visual orientada a objetos de Borland Company. Delphi combina las ventajas de Visual C++ y Visual Basic: fácil de usar, potente y tiene ventajas únicas, especialmente en diseño de interfaces, programación de bases de datos y programación de redes.
Mensajes en Delfos
Un mensaje es una notificación enviada por Windows que le indica a una aplicación que ha ocurrido un evento. En Delphi, en la mayoría de los casos los mensajes de Windows están encapsulados en eventos VCL. Solo necesitamos manejar los eventos VCL correspondientes. Sin embargo, si necesitamos escribir nuestros propios controles, interceptar o filtrar mensajes, debemos profundizar en el mecanismo de procesamiento de mensajes de Win32.
En Delphi, los mensajes se definen en forma de registros TMessage. Abra el archivo Message.pas, podemos ver que Tmessage se define así:
tipo
TMensaje = registro empaquetado
Mensaje: Cardenal;
caso Entero de
0: (WParam: Entero largo;
LParam: Entero largo;
Resultado: Entero largo);
1: (WParamLo: Palabra;
WParamHi: Palabra;
LParamLo: Palabra;
LParamHi: Palabra;
ResultadoLo: Palabra;
ResultadoHola: Palabra);
fin;
Entre ellos, Msg es un valor constante que es diferente de otros mensajes. Estos valores constantes pueden ser constantes predefinidas en unidades de Windows o constantes definidas por el usuario. Wparam suele ser un valor constante relacionado con un mensaje, o puede ser un identificador de una ventana o control. LParam suele ser un puntero a datos en la memoria.
El resultado es el valor de retorno del procesamiento de mensajes. Wparam, Lparam y Result son todos de 32 bits. Si desea acceder a los 16 bits inferiores o a los 16 bits superiores, puede utilizar WparamLo, WparamHi, LParamLo, LparamHi, ResultLo y ResultHi respectivamente.
Además del Tmessage general, se define un registro de mensaje especial para cada Windows en Delphi. Podemos explorar el archivo Message.pas y aquí está el registro del mensaje del teclado:
TWMKey = registro empaquetado
Mensaje: Cardenal;
Código de caracteres: palabra;
Sin usar: Palabra;
Datos clave: Entero largo;
Resultado: Entero largo;
Los mensajes relacionados con el teclado, como: registros WM_KEYDOWN, WM_KEYUP, WM_CHAR, WM_SYSKEYDOWN, WM_SYSKEYUP y WM_SYSCHAR también se definen como TWMkey. Existe la siguiente declaración en el archivo Message.pas:
TWMChar=TWMclave; TWMKeyDown=
clave TWM;
-KeyDown=TWMclave; TWMSysKeyUp=
TWMkey;TWMSysChar=TWMkey;
envío de mensajes
El procesamiento de mensajes consiste en definir cómo responde la aplicación a los mensajes de Windows. En Delphi, cada mensaje tiene su propio proceso de procesamiento. Debe ser un método en un objeto y solo puede pasar un Tmessage u otro registro de mensaje especial. Debe haber un comando de mensaje después de la declaración del método, seguido de un mensaje que va desde 0. a Constante entre 32767.
Los mensajes que mencionamos anteriormente son todos mensajes estándar de Windows (WM_X). Además, hay mensajes internos de VCL, mensajes de notificación y mensajes definidos por el usuario.
Los mensajes internos de VCL generalmente comienzan con "CM_" y se usan para administrar cosas dentro de VCL. Si cambia el valor de una propiedad o algunas otras características de un componente, debe notificar a otros componentes del cambio a través de mensajes internos. Por ejemplo, el mensaje de activación del foco de entrada se envía a un componente activado o desactivado para aceptar o renunciar al foco de entrada.
También hay mensajes de notificación. Algo le sucede a un control secundario en una ventana y la ventana principal debe ser notificada. Esto se logra mediante mensajes de notificación. Sólo funciona con controles de ventana estándar, como botones, cuadros de lista, cuadros de edición, etc. Abra el archivo Message.pas. Después del estándar de Windows está la declaración del mensaje de notificación:
constante
{$EXTERNALSYM BN_CLICKED}
BN_CLICKED = 0;
{$EXTERNALSYM BN_PAINT}
BN_PINTURA = 1;
{$EXTERNALSYM BN_HILITE}
BN_HILITE = 2;
Los anteriores son los mensajes de notificación del botón, que indican respectivamente que el usuario hizo clic en el botón, que el botón debe volver a dibujarse y que el usuario resaltó el botón.
Los usuarios también pueden definir sus propios mensajes, enviarse mensajes a sí mismos y escribir procedimientos de procesamiento de mensajes. El valor constante del mensaje es WM_USER+100 a $7FFF. Windows reserva este rango para mensajes definidos por el usuario.
Hay tres métodos para enviar mensajes Delphi:
1. Realizar el método de objeto de la clase Tcontrol. Puedes enviar mensajes a cualquier formulario o control, solo necesitas conocer la instancia del formulario o control. Su comunicado es el siguiente:
función Tcontrol.Perform(Msg:Cardinal;Wparam,Lparam:Longint):Longint
2. Funciones API de Windows SendMessage() y Postmessage(). Su comunicado es el siguiente:
función EnviarMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
función EnviarMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
La función PostMessage agrega un mensaje a la cola de mensajes de la aplicación. El bucle de mensajes de la aplicación extraerá el mensaje registrado de la cola de mensajes y luego lo enviará a la ventana correspondiente.
La función SendMessage puede enviar mensajes directamente al procedimiento de ventana a través de la cola de mensajes. Entonces, SendMessage se usa cuando Windows necesita devolver un valor inmediatamente y PostMessage se usa cuando diferentes aplicaciones necesitan procesar mensajes en secuencia. Realizar es esencialmente similar a SendMessage, se envían directamente al procedimiento de ventana. Las funciones SendMessage y Postmessage solo necesitan conocer el identificador de la ventana para enviar mensajes, de modo que puedan enviar un mensaje a un formulario que no sea de Delphi, pero Perform debe conocer la instancia del formulario o control.
Mecanismo de procesamiento de mensajes VCL
Existe la declaración application.Run en el código fuente de la aplicación Delphi. Su función es iniciar el bucle de mensajes y luego llamar a Application.PRocessMessage. Esta función encontrará un mensaje en la cola de mensajes de la aplicación. Cuando se recupera un mensaje de la cola de mensajes, se activa el evento Application.OnMessage. De esta forma, antes de que Windows procese el mensaje, responderá al procesamiento del evento OnMessage. Es superior a cualquier procesamiento de mensajes y solo recibe mensajes registrados, es decir, los mensajes enviados por PostMessage como se mencionó anteriormente. El proceso de procesamiento que responde al evento Application.OnMessage debe ser del tipo TmessageEvent, que se declara de la siguiente manera:
escriba TMessageEvent = procedimiento (var Msg: TMsg; var Handled: Boolean) del objeto;
Donde TMsg es el registro de mensaje definido en Windows, podemos declararlo así:
Procedimiento OnMyMessage(var Msg:TMsg;var Handled:Boolean);
Luego asigne este método al evento Application.OnMessage:
Aplicación.OnMessage :=OnMyMessage;
El evento OnMessage capturará todos los mensajes enviados a la aplicación, que es un evento muy ocupado, por lo que no es aconsejable establecer puntos de interrupción durante el procesamiento del evento OnMessage para el procesamiento de mensajes.
El método utilizado por el objeto VCL para recibir mensajes se llama MainWndProc. Es un método estático definido en la clase Twincontrol y no se puede sobrecargar. No procesa el mensaje directamente. Cuando el mensaje sale de MainWndProc, el mensaje se pasa al método WndProc del objeto. El método WndProc es un método virtual definido en la clase Tcontrol, que llama al método Dispatch. Dispatch busca el método de procesamiento correspondiente en función del mensaje entrante. Si al final no puede encontrarlo, continúa buscando el método de procesamiento del mensaje en la clase principal hasta que lo encuentra. Si no lo encuentra, llama a Defaulthandler. El método Defaulthandler realiza el procesamiento final del mensaje y luego pasa el mensaje a la función DefWindowProc de Windows u otros procedimientos de ventana predeterminados.