Senden und Empfangen von Botschaften mit der RTL

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Verwenden der plattformübergreifenden RTL-Botschaftslösung


Die RTL stellt eine plattformübergreifende Botschaftslösung bereit, die in der Unit System.Messaging implementiert ist.

So verwenden Sie diese Botschaftslösung:

  1. Rufen Sie eine Instanz des Botschafts-Managers ab.
  2. Abonnieren Sie Methoden für bestimmte Botschaftstypen.
  3. Senden Sie Botschaften an den Botschafts-Manager.

In der RTL ist nur ein Botschaftstyp, nämlich TMessage, definiert. Dabei handelt es sich eigentlich um eine Vorlage, die Sie zum Erstellen von Botschaften für bestimmte Arten von Werten verwenden können; zum Beispiel: TMessage<int> oder TMessage<UnicodeString>. Sie können von TMessage auch Unterklassen ableiten, um eigene Botschaftstypen zu definieren. Wenn Sie FireMonkey verwenden, können Sie auch die im Framework definierten Botschaftstypen wiederverwenden.

Hinweis: Verwenden Sie für C++-Projekte TMessageBase statt TMessage.

Abrufen einer Instanz des Botschafts-Managers

Die Klasse TMessageManager definiert ein Objekt, das als eine anwendungsweite Botschaftszentrale fungieren kann.

Sie können viele Instanzen von TMessageManager erstellen, aber diese Klasse kann auch als Singleton verwendet werden. Sie können TMessageManager.DefaultManager aufrufen, um auf eine Instanz von TMessageManager zuzugreifen, anstatt Ihre eigenen Instanzen zu instantiieren und zu verfolgen:

Delphi:

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

C++:

TMessageManager* MessageManager = TMessageManager::DefaultManager();

FireMonkey überträgt Systembenachrichtigungen beispielsweise mit dem Standard-Botschafts-Manager.

Abonnieren oder Stornieren des Abonnements von Botschaftstypen

Wenn eine Instanz von TMessageManager vorhanden ist, können Sie für bestimmte Typen von Botschaften Botschaftsbehandlungsmethoden abonnieren. Botschaftsbehandlungsmethoden können Methoden eines Objekts oder von anonymen Methoden sein. Der folgende Code zeigt, wie eine anonyme Methode abonniert wird:

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. Definieren Sie in Ihrer Klasse eine Methode mit folgender Signatur:
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. Abonnieren Sie dann die Methode wie folgt:
TMessageManager* MessageManager = TMessageManager::DefaultManager;
TMetaClass* MessageClass = __classid(TMessage__1<UnicodeString>);
TMessageListenerMethod ShowReceivedMessagePointer = &(this->ShowReceivedMessage);
int SubscriptionId = MessageManager->SubscribeToMessage(MessageClass, ShowReceivedMessagePointer);

Wenn Sie eine Methode für einen Typ einer Botschaft abonniert haben (TMessage<UnicodeString> im obigen Beispiel), wird jedes Mal, wenn eine Botschaft dieses Typs gesendet wird, die abonnierte Methode aufgerufen.

Um das Abonnement einer zuvor abonnierten Methode für einen Botschaftstyp aufzuheben, rufen Sie TMessageManager.Unsubscribe auf.

Senden von Botschaften

Um eine Botschaft an alle Methoden zu senden, die den Typ dieser Botschaft in einem Botschafts-Manager abonniert haben, erstellen Sie ein Instanz von TMessageBase oder eine Unterklasse und rufen TMessageManager.SendMessage auf:

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);

Siehe auch