RTL を使用したメッセージの送受信
RTL クロスプラットフォーム メッセージング ソリューションの使用 への移動
RTL にはクロスプラットフォームのメッセージング ソリューションが用意されており、System.Messaging ユニットに実装されています。
このメッセージング ソリューションを使用するには:
RTL には、1 つのメッセージ型 TMessage のみ定義されています。これは、実際には、特定の値型のメッセージ(たとえば、TMessage<int>
や TMessage<UnicodeString>
など)を作成するのに使用できるテンプレートです。また、TMessage のサブクラスを作成して、独自のメッセージ型を定義することもできますし、FireMonkey を使用している場合は、そのフレームワークに定義されているメッセージ型を再利用できます。
メモ: C++ プロジェクトの場合、TMessageBase を TMessage の代わりに使用します。
メッセージ マネージャのインスタンスの取得
TMessageManager クラスは、アプリケーション全体を扱う通知センターの機能を果たすオブジェクトを定義します。
TMessageManager のインスタンスを多数作成できますが、このクラスはシングルトンとして機能することもできます。以下のように、TMessageManager.DefaultManager を呼び出して TMessageManager のインスタンスにアクセスできます。独自のインスタンスを作成し、それらの状態を絶えず把握している必要はありません。
Delphi:
// var MessageManager: TMessageManager;
MessageManager := TMessageManager.DefaultManager;
C++:
TMessageManager* MessageManager = TMessageManager::DefaultManager();
たとえば、FireMonkey では、デフォルトのメッセージ マネージャを使ってシステム通知を中継します。
メッセージ型へのサブスクライブ、メッセージ型からのアンサブスクライブ
いったん TMessageManager のインスタンスを取得したら、特定のメッセージ型にメッセージ処理メソッドをサブスクライブできます。メッセージ処理メソッドはオブジェクトのメソッドでも無名メソッドでもかまいません。以下のコードでは、無名メソッドのサブスクライブ方法を示しています。
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. お使いのクラスに、次のようなシグネチャのメソッドを定義します。
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. 次に、このメソッドを以下のようにサブスクライブします。
TMessageManager* MessageManager = TMessageManager::DefaultManager;
TMetaClass* MessageClass = __classid(TMessage__1<UnicodeString>);
TMessageListenerMethod ShowReceivedMessagePointer = &(this->ShowReceivedMessage);
int SubscriptionId = MessageManager->SubscribeToMessage(MessageClass, ShowReceivedMessagePointer);
あるメッセージ型(上記の例では TMessage<UnicodeString>
)にメソッドをサブスクライブしたら、この型のメッセージのブロードキャストがあるたびに、サブスクライブしたメソッドが呼び出されます。
既にサブスクライブしたメソッドをメッセージ型からアンサブスクライブするには、TMessageManager.Unsubscribe を呼び出します。
メッセージのブロードキャスト
メッセージ マネージャで特定のメッセージの型にサブスクライブしたすべてのメソッドにメッセージをブロードキャストするには、次のように、TMessageBase またはそのサブクラスのインスタンスを作成し、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);