起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 1930|回复: 3

[分享]X3平台上定义和处理业务消息**

[复制链接]
发表于 2007-10-9 15:31:41 | 显示全部楼层 |阅读模式
背景知识:环境   http://bbs.justep.com/forum.php?mod=viewthread&tid=2357

Windows消息之外,平台也在环境上有一套平台上业务消息的发送和处理机制,并且预定义了一些消息。

平台上通过环境来组织各种对象的运行与配合,不同的对象之间可以发送各种各样的自定义消息对象,在相应的环境下通过消息处理对象来处理消息对象。TBizMessage是业务消息的基类,自定义消息都必须从这个基类继承下来。TBizMessageHandler是业务消息处理的基类,所有处理消息的类都必须从这个基类继承袭来。消息的发送是通过环境来发送的,可以发消息给自己,也可以发给父亲或者发给孩子。注册在环境中的消息处理对象来对发送到这个环境的消息进行处理。
TBizMessage = class(Business.System.TObject)
public
  constructor create(AName: string);
  property Name: string; readonly;
end;

TBizMessageHandler = class(Business.System.TObject)
protected
  procedure DoExecute(AMessage: TBizMessage; AParam: THandleParam; Handled: Boolean); virtual;
public
  constructor create;
{ 返回值表示是否已处理(Handled) }
  function Execute(AMessage: TBizMessage; AParam: THandleParam): Boolean;
  property Next: TBizMessageHandler; readonly;
end;

TContext = class(Business.System.TObject)
public
……
{ 注册消息处理对象 }
  procedure AddMessageHandler(AName: string; AHandler: TBizMessageHandler);
{ 删除消息处理对象 }
  procedure RemoveMessageHandler(AName: string; AHandler: TBizMessageHandler);
{ 发送消息给自己 }
  function SendMessage(AMessage: TBizMessage): Boolean;
  { 广播消息给父亲,不包括自己 }
  function BroadcastToChildren(AMessage: TBizMessage): Boolean;
  { 广播消息给孩子,不包括自己 }
  function BroadcastToParent(AMessage: TBizMessage): Boolean;
……
回复

使用道具 举报

 楼主| 发表于 2007-10-9 15:32:06 | 显示全部楼层
使用业务消息的步骤大致如下:
1.        定义自己的消息(从TBizMessage继承下来)
2.        定义消息接收类(从TBizMessageHandler继承下来),重载DoExecute方法
3.        创建一个消息接收类的对象,在某个环境中注册这个对象
4.        创建消息的实例,往需要的环境中发送这个消息实例
注意事项:
  在消息上有一个Name的属性,注册消息处理对象时候同样需要提供一个Name,只有这两者匹配才可以处理,也就是说,同样的消息类,可以通过不同的Name来定义多个消息对象,对应多个不同的消息处理对象
在消息处理函数中,Handled表示是否已处理这个消息,如果没有就传递到下一个消息处理对象来处理。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-9 15:32:37 | 显示全部楼层
举例1:自定义一个信息和信息处理类
1.        定义自己的消息TMyMessage,消息内容是一个字符串Msg
  TMyMessage = class(TBizMessage)
  private
    FMsg: String;
  public
    constructor Create(AMsg: String);
    static function Name: String;
    property msg: String read FMsg;
  end;

implementation

constructor TMyMessage.Create(AMsg: String);
begin
  inherited Create(TMyMessage.Name);
  FMsg := AMsg;
end;

static function TMyMessage.Name: String;
begin
  Result := 'MyMessage.Test';
end;
2.        定义消息接收类TMyMessageHandler,重载DoExecute方法,在这个方法中处理消息
type
  TMyMessageHandler = class(TBizMessageHandler)
  private
    FMemo: TMemo;
  public
    procedure DoExecute(AMessage: TBizMessage; const AParam: THandleParam;
      var Handled: Boolean); override;
  end;

procedure TMyMessageHandler.DoExecute(AMessage: TBizMessage; const AParam: THandleParam;
      var Handled: Boolean);
begin
  if AMessage is TMyMessage then
  begin
    FMemo.Lines.Add((AMessage as TMyMessage).msg);
    Handled := True;
  end;
end;
3.        创建一个消息接收类的对象,在全局环境中注册这个对象
procedure TMainForm.AddMsgHandler;
begin
  lmh := TMyMessageHandler.Create;
  TMyMessageHandler(lmh).FMemo := Memo1;
  Memo1.Clear;
  BizSys.GlobalContext.AddMessageHandler(TMyMessage.Name, lmh);
end;
4.        创建消息的实例,往全局环境中发送这个消息实例
var
  lMsg: TMyMessage;
begin
  lMsg := TMyMessage.Create(Edit1.Text);
  BizSys.GlobalContext.SendMessage(lMsg);
  lMsg.Free;
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-9 15:32:52 | 显示全部楼层
举例2:利用平台预定义的消息
在平台上,预定义了一个业务关联刷新消息TRefreshRelevanciesMessage,当功能切换时,需要刷新业务管理栏的内容,会向功能环境发送一个业务关联刷新消息,在功能中定义一个消息处理程序,可以自定义业务关联栏中显示的内容。
1.        消息定义在协同系统\关联\业务关联库
2.        在功能中定义业务关联消息处理类
在功能中,在项目管理中,引入 协同系统\关联\业务关联库
uses RelevancyLib;

  TRelevancyMsgHandle = class(TBizMessageHandler)
  private
    FForm: TMainForm;
  public
    procedure DoExecute(AMessage: TBizMessage; const AParam: THandleParam;
      var Handled: Boolean); override;
  end;

procedure TRelevancyMsgHandle.DoExecute(AMessage: TBizMessage; const AParam: THandleParam;
      var Handled: Boolean);
var
  lMsg: TRefreshRelevanciesMessage;
begin
  if AMessage is TRefreshRelevanciesMessage then
  begin
    lMsg := AMessage as TRefreshRelevanciesMessage;
    lMsg.RelevancyNavBar.AddAction('mytest', FForm.Action1);
    Handled := True;
  end;
end;
3.        在功能创建这个消息处理类的对象,注册到当前功能环境上
//在主窗体上注册这个消息处理对象
var
  lmh: TRelevancyMsgHandle;
begin
  lmh := TRelevancyMsgHandle.Create;
  TRelevancyMsgHandle(lmh).FForm := Self;
  Context.AddMessageHandler(TRefreshRelevanciesMessage.Name, lmh);
end;
4.        在系统空间\简洁风格\界面库\窗体库\标准风格主窗体中,在需要刷新业务关联栏的地方,创建消息实例,向当前功能发送业务关联刷新消息对象
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2024-12-22 23:50 , Processed in 0.037470 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表