看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. CentOS7查看开放端口命令

    CentOS7查看开放端口命令   CentOS7的开放关闭查看端口都是用防火墙来控制的,具体命令如下: 查看已经开放的端口: /tcp --permanent 命令含义: –zone #作用域 –a ...

  2. TensorFlow 实战(一)—— 交叉熵(cross entropy)的定义

    对多分类问题(multi-class),通常使用 cross-entropy 作为 loss function.cross entropy 最早是信息论(information theory)中的概念 ...

  3. 维纳过程(Wiener Process)与高斯过程(Gaussian Process)

    维纳过程又叫布朗运动过程(Brownian motion): 1. 维纳过程 维纳过程 Wt 由如下性质所描述: W0=1, a.s.(a.s.,almost surely)

  4. wpf控件开发基础(2) -属性系统(1)

    原文:wpf控件开发基础(2) -属性系统(1) 距离上篇写的时间有1年多了.wpf太大,写的东西实在太多,我将依然围绕着自定义控件来展开与其相关的技术点. 也欢迎大家参与讨论.这篇我们将要讨论的是W ...

  5. Visual Studio Code同时debug多种代码的方式

    今天看了一下,猜应该是configurations里面多写一个就行,试了下,真的可以同时debug Python和Go代码. 可以打断点.单步执行Python和Go代码. launch.json 如下 ...

  6. 图像处理与计算机视觉的 topics

    光学图像(optical image): the apparent reproduction of an object, formed by a lens or mirror system from ...

  7. 使用bcc32做在windowXP上qt3.2.1编译环境的配置

    1.安装borland C++编译器,编译器文件所在目录下的文件如下: 其中bcc32.cfg和ilink32.cfg文件是自己加进去的,bcc32.cfg内容是-I"C:\Borland\ ...

  8. 微信小程序支付结果 c#后台回调

    又为大家带来简单的c#后台支付结果回调方法,首先还是要去微信官网下载模板(WxPayAPI),将模板(WxPayAPI)添加到服务器上,然后在打开WxPayAPI项目中的example文件下的 Nat ...

  9. libcurl 支持 openssl 交叉编译 mips rt5350

    By admin | 11月18日 0 Comment Advertisement 历经半个月终于把libcurl库编译出来,参考网上很多博客,最终把自己要的库编译出来. 首先说明一下,我要这个库的目 ...

  10. WPF 绑定父类属性

    原文:WPF 绑定父类属性 1.绑定父控件的属性. <ContextMenu x:Key="ContextMenuColoum"> <MenuItem Heade ...