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


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

     
    早前,看过文章说TMessageManager的用法,可用到的时候,又找不到,只好自己动手。
     
    我的应用场景是这样:
     
    当前的Frame弹出一个对话框Frame,当操作对话框的时候,想让当前的Frame跟着应响,让用户看到操作的结果,如下图,点大中小字体,后面的题目的字体会跟着变化:
    Delphi <wbr>Berlin <wbr>10.1.2 <wbr>FMX用TMessageManager处理自定义消息.
     
    参考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

    firemonkey messaging
    https://github.com/malcolmgroves/firemonkeymessaging

  • 相关阅读:
    CSS3学习笔记
    ie6对hover兼容性问题的解决:
    Maven-- 操作指南
    java基础 -- json多层转换成对象
    idea 导入maven项目
    工具的使用与安装--JAVA 环境变量的配置
    FreeMarker语言
    Apache Shiro 安全框架
    java基础--内部类
    java框架--Model层框架 sorm
  • 原文地址:https://www.cnblogs.com/findumars/p/6307326.html
Copyright © 2020-2023  润新知