Envoi et réception de messages en utilisant la RTL

De RAD Studio
Aller à : navigation, rechercher

Remonter à Utilisation de la solution de messagerie multiplate-forme RTL


La RTL fournit une solution de messagerie multiplate-forme, implémentée dans l'unité System.Messaging.

Pour utiliser cette solution de messagerie :

  1. Obtention d'une instance du Gestionnaire de messages.
  2. Abonner des méthodes à des types de messages spécifiques.
  3. Envoyer des messages au Gestionnaire de messages.

La RTL définit seulement un type de message, TMessage. C'est réellement un modèle que vous pouvez utiliser pour créer des messages pour des types spécifiques de valeurs ; par exemple : TMessage<int> ou TMessage<UnicodeString>. Vous pouvez également sous-classer TMessage afin de définir vos propes types de messages ou, si vous utilisez FireMonkey, vous pouvez réutiliser les types de messages définis par le framework.

Remarque : Pour les projets C++, utilisez TMessageBase au lieu de TMessage.

Obtention d'une instance du Gestionnaire de messages

La classe TMessageManager définit un objet qui agit comme un centre de notifications de niveau application.

Vous pouvez créer beaucoup d'instances de TMessageManager, mais cette classe peut également travailler comme un singleton. Vous pouvez appeler TMessageManager.DefaultManager pour accéder à une instance de TMessageManager au lieu d'instancier vos propres instances et d'effectuer leur suivi :

Delphi :

// var MessageManager: TMessageManager;
MessageManager := TMessageManager.DefaultManager;

C++ :

TMessageManager* MessageManager = TMessageManager::DefaultManager();

FireMonkey, par exemple, transmet les notifications système en utilisant le Gestionnaire de messages par défaut.

Abonnement ou désabonnement depuis les types de messages

Dès que vous avez une instance de TMessageManager, vous pouvez abonner des méthodes de gestion de messages à des types spécifiques de messages. Les méthodes de gestion de messages peuvent être des méthodes d'un objet ou des méthodes anonymes. Le code suivant montre comment abonner une méthode anonyme :

Delphi :

// var SubscriptionId: Integer;
SubscriptionId := MessageManager.SubscribeToMessage(TMessage<UnicodeString>, procedure(const Sender: TObject; const M: TMessage)
begin
  ShowMessage((M as TMessage<UnicodeString>).Value);
end);

C++ :

1. Définissez une méthode dans votre classe avec la signature suivante :
void __fastcall TForm1::ShowReceivedMessage(System::TObject* const Sender, System::Messaging::TMessageBase* const M)
{
  TMessage__1<UnicodeString>* Message = dynamic_cast<TMessage__1<UnicodeString>*>(M);
  if (Message)
    ShowMessage(Message->Value);
}
2. Abonnez ensuite cette méthode comme suit :
TMessageManager* MessageManager = TMessageManager::DefaultManager;
TMetaClass* MessageClass = __classid(TMessage__1<UnicodeString>);
TMessageListenerMethod ShowReceivedMessagePointer = &(this->ShowReceivedMessage);
int SubscriptionId = MessageManager->SubscribeToMessage(MessageClass, ShowReceivedMessagePointer);

Dès l'abonnement d'une méthode à un type de message (TMessage<UnicodeString> dans l'exemple ci-dessus), à chaque diffusion d'un message de ce type, la méthode abonnée est appelée.

Pour désabonner une méthode préalablement abonnée à un type de message, appelez TMessageManager.Unsubscribe.

Diffusion des messages

Pour diffuser un message à toutes les méthodes abonnées au type de votre message dans un Gestionnaire de messages, créez une instance de TMessageBase ou une sous-classe, et appelez TMessageManager.SendMessage :

Delphi :

MessageManager := TMessageManager.DefaultManager;
Message := TMessage<UnicodeString>.Create('This is a string message.');
MessageManager.SendMessage(Sender, Message, True);

C++ :

TMessageManager* MessageManager = TMessageManager::DefaultManager;
TMessage__1<UnicodeString>* Message = new TMessage__1<UnicodeString>("This is a string message.");
MessageManager->SendMessage(Sender, Message, true);

Voir aussi