起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 246|回复: 6

[分享]平台上的业务关联是如何用消息机制实现的**

[复制链接]
发表于 2008-6-25 15:32:38 | 显示全部楼层 |阅读模式
主界面上的业务管理条是通过环境的消息机制来实现的。
有关环境的背景知识请参考
http://bbs.justep.com/forum.php?mod=viewthread&tid=2357
http://bbs.justep.com/forum.php?mod=viewthread&tid=19153
有关环境中发消息的背景知识请参考
http://bbs.justep.com/forum.php?mod=viewthread&tid=24102

以下我们看看平台如何通过消息机制来显示业务关联条的

1.png

70.84 KB, 下载次数: 193

回复

使用道具 举报

 楼主| 发表于 2008-6-25 15:36:44 | 显示全部楼层
首先在 协同系统\关联\业务关联库 定义了业务关联需要的消息
  TRefreshRelevanciesMessage = class(TBizMessage)
  private
    FRelevancyNavBar: TRelevancyNavBar;
  public
    constructor Create(ARelevancyNavBar: TRelevancyNavBar);
    static function GetName: string;
    property RelevancyNavBar: TRelevancyNavBar read FRelevancyNavBar;
  end;

static function TRefreshRelevanciesMessage.GetName: string;
begin
  Result := 'Relevancy.View.Refresh.Message';
end;
这里FRelevancyNavBar是需要显示出来的关联条,在主窗体上创建消息实例时候对它赋值
GetName的静态函数就是消息的名称,在创建消息实例和消息处理对象实例时候使用
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-25 15:40:39 | 显示全部楼层
2) 在主窗体上创建消息实例,往当前功能上发消息
    lRefreshRelevanciesMessage := TRefreshRelevanciesMessage.Create(FRelevancyNavBar);
    try
      if not CurrentFunc.Context.SendMessage(lRefreshRelevanciesMessage) then
        DefaultRefreshRelevancies(FRelevancyNavBar);
    finally
      lRefreshRelevanciesMessage.Free;
    end;
因为大部分功能没有定义消息处理对象,因此执行了缺省的DefaultRefreshRelevancies方法
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-25 15:42:33 | 显示全部楼层
http://bbs.justep.com/forum.php?mod=viewthread&tid=18303 给出了,如何在功能上定义自己的消息处理对象来处理这个 TRefreshRelevanciesMessage 消息,以显示自己需要的业务关联内容
简单说明如下:
1) 定义消息处理类,在这个类的DoExecute方法中决定了业务关联许和来显示,这里Handled=True,因此不再执行缺省的DefaultRefreshRelevancies方法。
  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.Clear;
    //根据ActivePageIndex绑定不同的数据集
    if FForm.PageControl1.ActivePageIndex=0 then
      lMsg.RelevancyNavBar.BindDataSet(FForm.DataSetBroker1.DataSet as TBizDataSet)
    else
      lMsg.RelevancyNavBar.BindDataSet(FForm.DataSetBZSJJ1);

    //根据上面指定的数据集,根据业务关联定义加载关联项
    lMsg.RelevancyNavBar.ReloadRelevancies(FForm.Context, FForm.FuncBroker1.Func.BizClassURL.BizURL.URL);
    //增加自定义的关联项
    lMsg.RelevancyNavBar.AddAction('mytest', FForm.Action1);
    //记录关联条对象,待会儿发消息时候要用到
    if NavBar=nil then NavBar := lMsg.RelevancyNavBar;
    Handled := True;
  end;
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-25 15:44:00 | 显示全部楼层
2) 在功能主窗体Create事件中,创建消息处理类的一个实例,并且注册到功能环境中
procedure TMainForm.BizFormCreate(Sender: TObject);
var
  lmh: TRelevancyMsgHandle;
begin
  lmh := TRelevancyMsgHandle.Create;
  MsgHandler := lmh;
  lmh.FForm := Self;
  //在环境中注册关联条刷新消息处理对象,当关联条需要刷新时候就调用这个对象了
  Context.AddMessageHandler(TRefreshRelevanciesMessage.GetName, lmh);
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-25 15:44:38 | 显示全部楼层
3) 在功能窗体Destroy 事件中,释放环境中的这个消息处理对象
procedure TMainForm.BizFormDestroy(Sender: TObject);
begin
  //注销消息处理对象并且释放它
  Context.RemoveMessageHandler(TRefreshRelevanciesMessage.GetName, MsgHandler);
  MsgHandler.Free;
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-25 15:47:44 | 显示全部楼层
4) 在功能窗体中需要重新刷新业务关联时候,可以自己创建一个 TRefreshRelevanciesMessage 的实例,然后给功能环境发消息
procedure TMainForm.PageControl1Change(Sender: TObject);
var
  lmsg: TRefreshRelevanciesMessage;
begin
  //当Page页切换以后,发送一个刷新关联条的消息
  //在消息处理函数中就可以根据当前Page页显示对应数据集的关联项了
  lmsg := TRefreshRelevanciesMessage.Create(NavBar);
  try
    Context.SendMessage(lmsg);
  finally
    lmsg.Free;
  end;
end;
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-18 08:34 , Processed in 0.043930 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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