使用跨平台的消息机制(RTL Cross-Platform Messaging Solution):
目录
使用跨平台的消息机制(RTL Cross-Platform Messaging Solution):
RTL提供了跨平台的消息处理机制(方案),在System.Messageing单元中实现,程序中如果需要使用,就要引用这个单元:
uses
System.Messageing;
发送和接收消息原理步骤:
RTL跨平台消息机制依赖于System.Messageing单元中的TMessageManager对象。
- 希望接收特定类型消息的组件在消息管理器上订阅目标消息类型(TMessageManager.SubscribeToMessage)。
- 组件向消息管理器发送消息,消息管理器将这些消息转发给订阅了所接收消息类型的组件(TMessageManager.SendMessage)。
关于TMessageManager的详细使用步骤,参见:【Delphi】中使用消息Messages(三)
注意:Delphi框架RTL消息机制同时支持FireMonkey和VCL。
FireMonkey支持RTL系统消息说明:
FireMonkey提供了一个平台服务IFMXApplicationService,它提供了对事件通知的跨平台访问,因此不需要在应用程序针对的每个平台上使用不同的、特定于平台的事件系统。当IFMXApplicationService从操作系统接收到事件通知时,它会生成一个消息对象(TMessage或其子对象之一)来提供事件数据。message对象包含有关所发生事件的只读信息。消息对象的类型指示发生的事件的类型。
FireMonkey组件也依赖RTL消息相互通信。
FireMonkey组件将消息发送到默认的消息管理器。有关FireMonkey系统消息类型的列表如下:
所谓系统消息可以是从平台系统消息翻译过来的,也可以是由FireMonkey框架实现的。除了这些系统消息,我们当然可以定义我们自己的消息。
VCL支持RTL系统消息说明:
VCL框架不使用RTL跨平台消息传递解决方案;相反,它使用Windows API消息传递解决方案。这意味着VCL不会将Windows消息转换为RTL消息,VCL组件也会使用Windows API相互通信。
重点:
只有在不需要从Windows或VCL组件捕获消息时,才能在项目中使用RTL消息。例如,您可以使用RTL消息来处理多线程应用程序中的线程,或者编写只发送和接收彼此消息的组件。
如果需要访问来自Windows或VCL组件的消息,必须执行以下操作之一:
- 使用Windows API消息传递解决方案。
- 将项目移植到FireMonkey。FireMonkey已经将系统消息转换为RTL消息,FireMonkey组件也使用RTL消息。
- 编写自己的翻译层,将Windows API消息映射到RTL消息。
下一节:【Delphi】中使用消息Messages(三)