起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 1252|回复: 7

[分享]功能代码中定义业务关联**

[复制链接]
发表于 2007-9-25 11:40:12 | 显示全部楼层 |阅读模式
运行效果图:

1.png

87.12 KB, 下载次数: 430

回复

使用道具 举报

 楼主| 发表于 2007-9-25 11:47:09 | 显示全部楼层
在功能中,在项目管理中,引入 协同系统\关联\业务关联库
在代码中,写法如下:
//定义消息处理对象的处理方法
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;

//在主窗体上注册这个消息处理对象
var
  lmh: TRelevancyMsgHandle;
begin
  lmh := TRelevancyMsgHandle.Create;
  TRelevancyMsgHandle(lmh).FForm := Self;
  Context.AddMessageHandler('Relevancy.View.Refresh.Message', lmh);
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-6 13:23:44 | 显示全部楼层
lMsg.RelevancyNavBar是TRelevancyNavBar,可以调用这个对象的以下方法来控制关联项,比如当功能中PageControl切换时候,可以只绑定当前TabSheet上的数据集
NameSpace: RelevancyLib
--------------------------------------------------------------------------------
TRelevancyNavBar = class(Justep.Tools.ExpressNavBar.TdxNavBar)
public
  constructor create(AOwner: Business.System.TComponent); overload;
  //增加一个动作Action
  procedure AddAction(GroupCaption: string; Action: Business.Forms.TAction);
  //绑定一个数据集
  procedure BindDataSet(ADataSet: Business.Model.TBizDataSet);
  //解除绑定一个数据集
  procedure UnbindDataSet(ADataSet: Business.Model.TBizDataSet);
  procedure Clear;
  procedure ClearBindDataSets;
  procedure Destroy; override; overload;
  //获取分组对象,可以修改这个对象来改变分组显示的颜色图标等
  function GetGroup(AGroup: RelevancyInfo.TRelevancyGroupRec): Justep.Tools.ExpressNavBar.TdxNavBarGroup; overload;
  function GetGroup(AGroupCaption: string): Justep.Tools.ExpressNavBar.TdxNavBarGroup; overload;
  //重新加载关联项
  procedure ReloadRelevancies(AOwnerContext: Business.Model.TContext; OwnerURL: string; ExceptFuncURL: array of string); overload;
  procedure ReloadRelevancies(AOwnerContext: Business.Model.TContext; OwnerURL: string); overload;
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-6 14:46:17 | 显示全部楼层
标准风格主界面在功能切换时候才可以刷新关联条,而且只有在功能环境下的信息环境中的数据集才可以识别出来
以下情况关联条不能自动识别出来:
1  直接放在窗体上的数据集
2  信息的隔离级不是缺省或者不是功能的
3  代码创建的数据集
4  在功能中,需要自动识别在Page页上的数据集
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-6 14:48:47 | 显示全部楼层
以下举例为:
窗体上创建的数据集,当Page页切换时候,只识别当前Page页上的数据集,而且处理识别数据集之外,可以增加一些自定义的动作
============================
unit MainForm;

interface

uses
  Business.System, Business.Forms, Business.Data, Business.Model;

type
  TMainForm = class(TForm)
    ControlBar1: TControlBar;
    DataNavigator1: TDataNavigator;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    DataGrid1: TDataGrid;
    InfoBroker1: TInfoBroker;
    DataSetBroker1: TDataSetBroker;
    DataSource1: TDataSource;
    DataGrid2: TDataGrid;
    DataSetBZSJJ1: TSQLDataSet;
    ActionList1: TActionList;
    Action1: TAction;
    FuncBroker1: TFuncBroker;
    procedure BizFormShow(Sender: TObject);
    procedure BizFormCreate(Sender: TObject);
    procedure Action1Execute(Sender: TObject);
    procedure PageControl1Change(Sender: TObject);
    procedure BizFormDestroy(Sender: TObject);
  private
    {private declarations}
    MsgHandler: TBizMessageHandler;
  public
    {public declarations}
  end;

implementation

uses RelevancyLib;

var
  NavBar: TRelevancyNavBar;

type
  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;

procedure TMainForm.BizFormCreate(Sender: TObject);
var
  lmh: TRelevancyMsgHandle;
begin
  lmh := TRelevancyMsgHandle.Create;
  MsgHandler := lmh;
  lmh.FForm := Self;
  //在环境中注册关联条刷新消息处理对象,当关联条需要刷新时候就调用这个对象了
  Context.AddMessageHandler(TRefreshRelevanciesMessage.GetName, lmh);
end;

procedure TMainForm.BizFormDestroy(Sender: TObject);
begin
  //注销消息处理对象并且释放它
  Context.RemoveMessageHandler(TRefreshRelevanciesMessage.GetName, MsgHandler);
  MsgHandler.Free;
end;

procedure TMainForm.PageControl1Change(Sender: TObject);
var
  lmsg: TRefreshRelevanciesMessage;
begin
  //当Page页切换以后,发送一个刷新关联条的消息
  //在消息处理函数中就可以根据当前Page页显示对应数据集的关联项了
  lmsg := TRefreshRelevanciesMessage.Create(NavBar);
  Context.SendMessage(lmsg);
end;

procedure TMainForm.BizFormShow(Sender: TObject);
begin
  DataSetBroker1.DataSet.Open; //显示在Page页的第0页上
  DataSetBZSJJ1.Open;          //显示在Page页的第1页上
end;

procedure TMainForm.Action1Execute(Sender: TObject);
begin
  Dialogs.ShowMessage('action1');
end;

end.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-6 15:06:42 | 显示全部楼层
运行效果,Page页的第0页,对应的是 计划信息的计划数据集

1.png

50.9 KB, 下载次数: 406

回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-6 15:07:21 | 显示全部楼层
运行效果,Page页的第1页,对应的是 客户信息的客户数据集

2.png

50.87 KB, 下载次数: 404

回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-6 15:16:02 | 显示全部楼层
5楼有一个小技巧:
因为在创建 TRefreshRelevanciesMessage 消息时候,需要传递 RelevancyNavBar,而这个对象是在主界面上的,在当前功能上没有,因此在第一次收到处理消息时候,用 NavBar 变量把这个对象保存起来,这样当发消息时候就可以用这个变量了
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2024-12-22 17:58 , Processed in 0.051050 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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