• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

DelphiBerlin10.1.2FMX用TMessageManager处理自定义消息

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

 
早前,看过文章说TMessageManager的用法,可用到的时候,又找不到,只好自己动手。
 
我的应用场景是这样:
 
当前的Frame弹出一个对话框Frame,当操作对话框的时候,想让当前的Frame跟着应响,让用户看到操作的结果,如下图,点大中小字体,后面的题目的字体会跟着变化:
 
参考fmx的代码,试着用消息机制实现了:
1.声明消息类:
type
  TFontChangeMessage = class(System.Messaging.TMessage);
这个消息类,带一个整型值,表示选择字体的大小
 
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

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
MATLAB远程桌面打开失败解决办法发布时间:2022-07-18
下一篇:
matlab练习程序(Floyd–Steinberg dithering)发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap