看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. Vue挂载元素的替换

    Vue根组件已有挂载DOM'#app',在render又引进一个组件,该组件最外层也是用了'#app',为何根组件的DOM'#app'会被替换掉. //main.js import Vue from ...

  2. VS2008智能提示解决办法

    最近在VS2008的代码编辑环境中,发现定义了一个类后,然后用类对象点不出对象的属性和方法,于是在网上参考一些资料. 具体步骤如下: 一.开始->Microsoft Visual Studio ...

  3. RStudio 的使用

    0. 基本 路径查看和设置: getwd() ⇒ 查看路径 setwd() ⇒ 设置路径: 1. 快捷键 ctrl+shift+c:多行注释:选中待注释的代码段,按下 ctrl+shift+c(c 表 ...

  4. java8中的localdate和localtime用法举例

    java8中的localdate和localtime用法举例如下:这两个方法使我们可以方便的实现将旧的日期类转换为新的日期类,具体思路都是通过Instant当中介,然后通过Instant来创建Loca ...

  5. 一个2013届毕业生(踏上IT行业)的迷茫(1)

    从毕业到现在已经快半年了,已经想写这篇文字很久了,但是一次又一次的被没有时间给搁置了,今天突然好想写一篇自己这么多年的总结,算是一种反思,也可以看作为未来的人生指路吧. 我和很多搞IT的同行们一样,不 ...

  6. PAT 1061 - 1064 题解

    这四道题来自 13 年 08 月 30 的 PAT 测试. 代码量不大,思路也比较直接.不过第一题的处理逻辑不太清晰,需要好好把握.稍有不慎就掉进坑里了(很多人被这道 20'的题坑了一个多小时心慌意乱 ...

  7. 自己动手编写一个VS插件(七)

    作者:朱金灿 来源:http://blog.csdn.net/clever101 继续开发VS插件.今天在添加ATL控件时出现一个"未能返回新代码元素"的错误,如下图: 解决办法是 ...

  8. [UWP]在应用开发中安全使用文件资源

    原文:[UWP]在应用开发中安全使用文件资源 在WPF或者UWP应用开发中,有时候会不可避免的需要操作文件系统(创建文件/目录),这时候有几个坑是需要大家注意下的. 创建文件或目录时的非法字符检测 在 ...

  9. 用Delphi即时判断当前的网络的连接方式

    判断网络的是否连接或者连接方式,比较重要的一点就是是不是即时判断,如果你明明无连接,判断出来却说你有,连接上了,却说你还未连接,下面要介绍的两个方法中 InternetGetConnectedStat ...

  10. 深入WPF中的图像画刷(ImageBrush)之1——ImageBrush使用举例

    原文:深入WPF中的图像画刷(ImageBrush)之1--ImageBrush使用举例 昨天我在<简述WPF中的画刷(Brush)  >中简要介绍了WPF中的画刷的使用.现在接着深入研究 ...