码迷,mamicode.com
首页 > 其他好文 > 详细

FMX有两种消息处理的实现方式,一种是用TMessageManager来实现自定义的消息,另外一种象TEdit中的实现,直接声明消息方法

时间:2017-01-19 17:56:13      阅读:340      评论:0      收藏:0      [点我收藏+]

标签:接收   ...   cti   hang   ade   amp   tcl   ref   共享   

看FMX代码,发现有两种消息处理的实现方式,一种是用TMessageManager来实现自定义的消息,另外一种象TEdit中的实现,直接声明消息方法。

 
早前,看过文章说TMessageManager的用法,可用到的时候,又找不到,只好自己动手。
 
我的应用场景是这样:
 
当前的Frame弹出一个对话框Frame,当操作对话框的时候,想让当前的Frame跟着应响,让用户看到操作的结果,如下图,点大中小字体,后面的题目的字体会跟着变化:
技术分享
 
参考fmx的代码,试着用消息机制实现了:
1.声明消息类:
type
  TFontChangeMessage = class(System.Messaging.TMessage<INTEGER>);
这个消息类,带一个整型值,表示选择字体的大小
 
2.声明一个消息的接收方法
    procedure FontChangeHandler(const Sender: TObject; const Msg: System.Messaging.TMessage);
这个方法的原型就是这样,不能改动,只能改名称FontChangeHandler
接收消息的方法实现:
procedure TExamFrame.FontChangeHandler(const Sender: TObject; const Msg: System.Messaging.TMessage);
begin
//TFontChangeMessage(Msg).Value可取到消息返回的值
//用这个值改变界面上控件字体的大小,代码就省略
...
end;
 
3.利用TMessageManager来订阅这个消息:
  FFontChangeMessageId := TMessageManager.DefaultManager.SubscribeToMessage(TFontChangeMessage, FontChangeHandler);
FFontChangeMessageID是订阅消息的返回句柄,用于取消定阅
SubscribeToMessage的两个参数,分别是定义的消息类与接收消息的方法
4.取消订阅消息
  TMessageManager.DefaultManager.Unsubscribe(TFontChangeMessage, FFontChangeMessageId, True);
参数分别是消息类,及订阅消息时返回的消息句柄
最后的True,表示是否取消,看代码,这个参数决定是否在取消时从TMessageManager的一个List直接删除。
 
1、2、3、4步在试题Frame中准备好了接收对话框Frame发来的消息。下面,准备在对话框中,发送消息:
(为了共享第一步TFontChangeMessage消息类的声明,我单独用了一个单元,单元名称为exam.const.pas。)
 
在对话框Frame中发送消息:
1.先引用exam.const单元,准备使用其中声明的消息类
2.建立并发送消息,看下面代码:
var
  aMessage: TFontChangeMessage;//声明自己的消息实例
begin
  if RadioButton1.IsChecked then
    FFontSize := 13;
  if RadioButton2.IsChecked then
    FFontSize := 15;
  if RadioButton3.IsChecked then
    FFontSize := 17;
  aMessage := TFontChangeMessage.Create(FFontSize);//建立消息
  TMessageManager.DefaultManager.SendMessage(nil, aMessage);//发送消息
end;
 
TMessageManager还有一个订阅消息的方法,可以直接订阅匿名方法,我还没试,等试好再补上。
function SubscribeToMessage(const AMessageClass: TClass; const AListener: TMessageListener): Integer; overload;
朋友告诉我说在官方wifi中,有用匿名方法的资料,在这里http://docwiki.embarcadero.com/CodeExamples/Berlin/en/System.Messaging_(Delphi),写的很详细。
 
还有一点要注意,发送的消息,所有的订阅者都会接到,象我上面的例子,实际上只有当前显示的Frame接收到即可,那么要避免一下这种情况的产生,有两个办法:一个在消息接收方法中处理;另一个就是取消订阅.

 

http://blog.sina.com.cn/s/blog_44fa172f0102wfwl.html

FMX有两种消息处理的实现方式,一种是用TMessageManager来实现自定义的消息,另外一种象TEdit中的实现,直接声明消息方法

标签:接收   ...   cti   hang   ade   amp   tcl   ref   共享   

原文地址:http://www.cnblogs.com/findumars/p/6307326.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!