‒ Métodos de mensajes.
Los métodos a mensajes son punteros guardados en un área especial correspondiente a la clase que los implementa, los métodos de mensajes han sido diseñados especialmente para ser usados con funciones que devuelven una respuesta (callback functions), y que son usados ampliamente con herramientas de desarrollo de interfaces Gráficas de usuario (GUI) como son GTK y Win32 o Win64.
Los métodos de mensajes también se usan para implementar Eventos, ya que un método de mensaje puede ser la respuesta a un evento. La diferencia entre la implementación de eventos con punteros de métodos y métodos de mensaje, está en como se implementa los métodos de respuesta a los eventos. Cuando se usan punteros a métodos las respuestas a un evento se implementan generalmente en la clase contenedora y cuando se implementa con métodos de mensajes los métodos de respuesta se implementa haciendo una herencia de la clase que implementa sus eventos.
Para implementar un método de mensaje es suficiente colocar al final del método la palabra reservada message y seguido un número o una cadena de caracteres que identificará al método de mensajes. El evento será el número o cadena de caracteres que identifica al método de mensaje y el método de respuesta será el método de mensaje. Un método de mensaje se puede declarar del siguiente modo:
Procedure Cambios(Var Msg:TMsg); Message 1; [B] ~ [P] o con cadena de caracteres
Procedure Cambios(Var Msg:TMsg); Message 'EvCambios'; [B] ~ [P] Todos los métodos de mensajes son virtuales por defecto, lo que nos permite sobre escribirlo más adelante sin necesidad de las palabras reservadas virtual y override.
Además que todo método de mensaje debe tener como mínimo un parámetro que puede ser con tipo o sin tipo, pero lo más común es usar un registro en donde el primer campo debe ser de tipo Cardinal o una cadena de caracteres con un máximo de 255. TMsg se declará de la siguiente forma:
TMsg=Record
MSGID : Cardinal;
Data : integer;
End;
o con cadena de caracteres
TMsg=Record
MSGID : String;
Data : integer;
End;
Después del MSGID, se pueden colocar otros campos que pueden variar según lo necesite el evento a ejecutar.
Para enviar un mensaje o activar un evento a un método de mensaje se hace uso del método Dispatch o DispatchStr, del siguiente modo:
mensaje.MSGID:=1;
mensaje.Data:=indice;
Dispatch(mensaje);
o con cadena de caracteres
mensaje.MSGID:='EvCambios';
mensaje.Data:=indice;
DispatchStr(mensaje);
A continuación se muestra un ejemplo de una lista de números reales, que es el mismo que se vio en el capitulo anterior, pero esta vez usando los métodos de mensaje que implementarán los métodos de respuesta.
En esta clase existe sólo un método de mensaje Cambios que será el mensaje de respuesta cada vez que el método Dispatch envie el mensaje, este será enviando cada vez que se asigne un elemento a la lista ya que este se ejecuta desde dentro del método Pon.
Por defecto el método Cambios es un método vació que no hace absolutamente nada ya que este será reemplazado por otro cuando se herede la lista por otra clase.
A continuación el programa que hace uso de la lista de reales, en ella se puede observar que la clase TlistaFrecuencias hereda métodos y atributos de la clase TlistaReales, para sobreescribir el método de mensaje Cambios, que se usará para calcular las frecuencias.
El uso de esta técnica se recomienda cuando se tenga que implementar eventos en donde todos los objetos ofrezcan una misma respuesta a un evento, y el puntero a métodos se usa generalmente cuando los objetos ofrezcan una respuesta distinta a un mismo evento. Es por eso que esta técnica es más usado en la implementación de interfaces Gráficas de usuario (GUI) como son GTK y Win32 o Win64.