起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 371|回复: 5

【结帖】如何在流程步骤的功能中取到下一环节的功能名?[请求]**

[复制链接]
发表于 2008-1-31 10:53:23 | 显示全部楼层 |阅读模式
在功能中拉一个FlowsBroker
然后在其AfterFlowOut事件中通过FlowsBroker.FlowControl.CurrentProcUnit.SuccedentUnits[0].DisplayName
获得所要流转的下一步功能环节的功能名
但是如果下一环节为AND、OR、XOR等条件判断就取
FlowsBroker.FlowControl.CurrentProcUnit.SuccedentUnits[0].SuccedentUnits.DisplayName,这样如果分支环节比较多呈树状分布(节点中可能又存在条件判断等环节),那么如何获取真正传到的功能名称?
回复

使用道具 举报

发表于 2008-1-31 11:22:36 | 显示全部楼层
用 GetSuccedentUnits 函数
  procedure GetSuccedentUnits(AUnits: Business.System.TList; AInKinds: TProcUnitKinds; AStopKinds: TProcUnitKinds); overload;
  procedure GetSuccedentUnits(AUnits: Business.System.TList; AInKinds: TProcUnitKinds; AInclude: Boolean); overload;
  procedure GetSuccedentUnits(AUnits: Business.System.TList; AInKinds: TProcUnitKinds; AStopUnit: TProcUnit); overload;

以下是我曾经做的一个例子,找到当前节点后续的条件环节和条件分支环节
procedure TMAINFORM.ShowProcConditions;
var
  i: Integer;
  lUnits: TList;
begin
  lUnits := TList.Create;
  try
    clbConditions.Clear;

    FlowBroker1.FlowControl.CurrentProcUnit.GetSuccedentUnits(lUnits, [TProcUnitKind.ukConditionBranch, TProcUnitKind.ukCondition], [TProcUnitKind.ukActivity]);
    for i:=0 to lUnits.Count-1 do
      clbConditions.AddItem(TProcUnit(lUnits).DisplayName, lUnits);
  finally
    lUnits.Free;
  end;
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-2-3 08:35:28 | 显示全部楼层
俺不是要找条件环节和条件分支环节,是想找到本功能后续的全部实际所传到的功能环节。就是流程图中所有红色框的功能名(无视任何条件及分支环节)

有啥好办法~
回复 支持 反对

使用道具 举报

发表于 2008-2-3 09:11:45 | 显示全部楼层
那就要作个递归程序找了
procedure FindSuccedentActivityUnit(AUnit: TProcUnit; ASuccedentUnits: TList);
var
  i: Integer;
begin
  if AUnit.Kind in [TProcUnitKind.ukStart, TProcUnitKind.ukFinish] then Exit;

  for i:=0 to AUnit.SuccedentUnitCount-1 do
  begin
    if AUnit.SuccedentUnits.Kind = TProcUnitKind.ukActivity then
      ASuccedentUnits.Add(AUnit.SuccedentUnits)
    else FindSuccedentActivityUnit(AUnit.SuccedentUnits, ASuccedentUnits);
  end;
end;

调用方法是
  lUnits := TList.Create;   
    FindSuccedentActivityUnit(FlowBroker1.FlowControl.CurrentProcUnit, lUnits);
回复 支持 反对

使用道具 举报

发表于 2008-2-3 09:51:35 | 显示全部楼层
改进了,增加了子流程环节的处理,取子流程的入口活动环节
procedure TMAINFORM.FindSuccedentActivityUnit(AUnit: TProcUnit; ASuccedentUnits: TList);
var
  i: Integer;
  lBizURL: TBizClassURL;
  lProc: TProc;
begin
  if AUnit.Kind in [TProcUnitKind.ukStart, TProcUnitKind.ukFinish] then Exit;
  if AUnit.Kind=TProcUnitKind.ukSubProc then
  begin
    lBizURL := TBizClassURL.Create;
    lBizURL.BizURL.URL := TSubProcUnit(AUnit).ProcURL.URL;
    lProc := Context.FindParentContext(BizSys.IL_GLOBAL).GetBizObject(lBizURL) as TProc;
    lBizURL.Free;
    for i:=0 to lProc.EntryActivityCount-1 do
      ASuccedentUnits.Add(lProc.EntryActivities);
  end;
  for i:=0 to AUnit.SuccedentUnitCount-1 do
  begin
    if AUnit.SuccedentUnits.Kind = TProcUnitKind.ukActivity then
      ASuccedentUnits.Add(AUnit.SuccedentUnits)
    else FindSuccedentActivityUnit(AUnit.SuccedentUnits, ASuccedentUnits);
  end;
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-2-4 08:41:15 | 显示全部楼层
还是使用递归了,哎,有点麻烦。
另用方案了,方法收下了,谢谢啦。
先结帖吧
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-6 21:36 , Processed in 0.039360 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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