RTL提供了跨平台的消息解决方案,在System.Messaging 单元中实现。 如何使用消息解决方案:
1. 获取消息管理器实例 2. 提交方法到指定消息类型 3. 发送消息到消息管理器
RTL只定义了一个消息类型,即 TMessage. 它实际上是一个可以用来创建指定类型值消息的模板。 例如: TMessage<int> 或 TMessage<UnicodeString>. 你也可以继承TMessage来定义你自己的消息类型,或者用的是FireMonkey时可以重复使用框架已定义的消息类型。
获取消息管理器实例
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::TMessage* 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来取消一个之前提交到消息类型的方法。
广播消息
要实现广播一个消息到所有的已提交给消息管理器里某个消息类型的方法,需创建TMessage 的实例或子类,然后调用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);
www.52jike.com (吾爱极客) ruanzhuo翻译整理,转载请注明出处
|