看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

Delphi Berlin 10.1.2 FMX用TMessageManager处理自定义消息的更多相关文章

  1. [教学] Delphi Berlin 10.1 开发 Windows 10 平板 App 远程调试

    Delphi Berlin 10.1 开发 Windows 10 平板 App 远程调试安装步骤: 准备电脑: 一台开发电脑,安装 Delphi 开发环境 一台平板电脑,安装 PAServer,安装方 ...

  2. Delphi Berlin 10.1 for iOS 成生 info.plist 顺序改变了

    在 Delphi Seattle 10 update 1 版本(含之前版本),只要 Project > Build 会立即生成 info.plist 如果需要修改 info.plist 可以利用 ...

  3. Delphi Berlin 10.1 for 小米平板2 (Win 10) 电子罗盘测试

    Windows 10 下没有 Sensor.HeadingXSensor.HeadingYSensor.HeadingZ 需改用 Sensor.CompMagHeading

  4. [控件] 加强版 TOneSelection (改良自 Berlin 10.1 TSelection)

    本控件修改自 Delphi Berlin 10.1 的 TSelection (FMX.Controls.pas) 修改重点: 移动点显示在上方 增加(左中,上中,右中,下中)控制点,含原来的总共有 ...

  5. [修正] Berlin 10.1 支持 iPhone 4 (iOS v7.x)

    原本在 Seattle 版本时,还能支持 iPhone 3GS (iOS v6.x), iPhone 4 (iOS v7.x),到了 Berlin 已不支持了,在用户的抱怨下,只好自己尝试去修正它,经 ...

  6. Berlin 10.1 支持 iPhone 4 (iOS v7.x)

    http://www.cnblogs.com/onechen/p/5559017.html 原本在 Seattle 版本时,还能支持 iPhone 3GS (iOS v6.x), iPhone 4 ( ...

  7. Delphi Tokyo 10.2.3发布了

    Delphi Tokyo 10.2.3发布了 http://blog.sina.com.cn/s/blog_44fa172f0102wwwg.html (2018-03-14 07:51:32) 转载 ...

  8. delphi Berlin Could not load SSL library.

    delphi Berlin Could not load SSL library. TIdSSLIOHandlerSocketOpenSSL 解决办法:下载合适的版本文件libssl32.dll Id ...

  9. Delphi XE 10 跨平台三层数据库应用教程

    Delphi XE 10 跨平台三层数据库应用教程 前言: Delphi XE 开始越来越庞大,比经典的Delphi7难用,但依然是目前所有跨平台开发工具中开发效率最高.最容易上手的,其快速设计RAD ...

随机推荐

  1. node与webpack的process.env.NODE_ENV

    先看两篇文章 1.前端工程项目的NODE_ENV 2. Node 环境变量 process.env.NODE_ENV 之webpack应用 3.process.env.NODE_ENV 下面全部是在w ...

  2. Ubuntu 16.04安装MinGW32(在/etc/apt/sources.list里添加源)

    Ubuntu 16.04下直接使用命令安装MinGW32: sudo apt-get install mingw32   但是,会报错: Unable to locate package mingw3 ...

  3. Configure Two DataSources ---

    67. Data Access 67.1 Configure a DataSource To override the default settings just define a @Bean of ...

  4. Struts2——(8)struts2中文件的上传

    通过2种方式模拟单个文件上传,效果如下所示 开发步骤如下: 1.新建一个web工程,导入struts2上传文件所需jar,如下图 目录结构              2.新建Action  第一种方式 ...

  5. git commit 报错 There was a problem with the editor 'vi'

    今天提交代码git  commit -a的时候出现了这个错误 上网查了一下,说是Vim的返回值出错了,出错的原因还在翻译英文, 先贴出解决方案吧 git config --global core.ed ...

  6. WPF中取得预定义颜色

    原文:WPF中取得预定义颜色 使用XAML代码取得.net预定义颜色:<Page    xmlns="http://schemas.microsoft.com/winfx/2006/x ...

  7. Leetcode 268 Missing Number 位运算

    题意:先将0, 1, 2, ..., n放入数组,然后去掉其中一个值,找到那个值. 这题与singe number 是一个类型,变形的地方就是首先需要将0, 1, 2, ..., n再次放入这个数组, ...

  8. requireJS简单的学习门户网站

    总结 requireJS.这翻译成中国"必须js".说白了就是装js文件与.如何装好了?.这是继AMD标准化的模块化装.除了AMD另一种规范称为CMD规范.跟随CMD兼容模块加载. ...

  9. 如何删除您的注册js图书馆bower私人图书馆

    建立你自己bower 这样的私人图书馆参考http://blog.csdn.net/nsrainbow/article/details/35988611 本文 假设我们想注册自己的创作js私人图书馆图 ...

  10. WPF 自定义的图表(适用大量数据绘制)

    原文:WPF 自定义的图表(适用大量数据绘制) 在WPF中绘制图表比较简单,有很多的第三方控件,但是在绘制大量数据的时候,就显得有些吃力,即便是自己用StreamGeometry画也达不到理想的效果, ...