起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 1159|回复: 12

[分享]组织机构相关控件

[复制链接]
发表于 2008-6-27 14:55:39 | 显示全部楼层 |阅读模式
平台上跟组织机构相关的控件有:
  TOrgTreeView  TOrgComboBox TOrgListView

下面先介绍以下TOrgTreeView
继承关系:
  TWinControl
    +-- TCustomTreeView
           +-- TBaseTreeView
                 +-- TBizTreeView
                       +-- TOrgTreeView

常用的属性和方法有:
TOrgTreeView
  //给StartWithNodes增加一个节点,从这个组织机构节点开始显示子树
  procedure AddStartWith(URL: string); overload;
  procedure AddStartWith(OrgUnit: Business.Model.Org.TOrgUnit); overload;

  //同上,增加的不是节点自己,而是节点的子节点开始的子树
  procedure AddStartWithChildren(URL: string); overload;
  procedure AddStartWithChildren(OrgUnit: Business.Model.Org.TOrgUnit; Kinds: Business.Model.Org.TOrgUnitKinds; Recurse: Boolean); overload;

  //给StartWithNodes增加组织机构根,从组织机构的根开始显示
  procedure AddStartWithOrgRoot;
  
TBizTreeView:
  //为了调用方便,实际BizTree=Business.Model.BizTree.BizTreeStructure
  function BizTree: Business.Model.TBizTree;

  //在控件中显示的对象的BizURL,如果控件的任何一级父对象不在这里,那么控件就不能显示了,比如:如果需要显示 销售部的部门经理这个岗位成员,除了在BizURLs中包含销售部的部门经理的BizURL之外,还需要包含 销售部的BizURL,销售部所在机构的BizURL...,这里一般调用BizTree.GetNodesTreeList来获得每一级父的BizURL
  property BizURLs: Business.System.TStrings;

  //不在控件中显示的对象的BizURL,一旦对象不显示的话,他的子对象也就不能显示了
  property ExcludeBizURLs: Business.System.TStrings;

  //当前选中的节点
  property SelectedNode: Business.Model.TBizNode;

  //多选时,被选中的每一个节点
  property SelectedNodes: Business.System.TStrings;

  //显示的对象的类型,这里跟BizURLs一样,只有包含了父对象的类型,才可以显示子对象
  property ShowOptions: Business.Model.TBizObjectKinds;

TBaseTreeView:
  //重新加载
  procedure ReloadTree;

  //是否自动展开
  property AutoExpand: Boolean;

  //是否自动加载,如果不自动加载,只有调用ReloadTree才会加载
  property AutoLoad: Boolean;

  //选中的节点的选择框是否隐藏
  property HideSelection: Boolean;

  //是否热点跟踪
  property HotTrack: Boolean;

  //是否允许多选
  property MultiSelect: Boolean;

  //多选的方式.
    msControlSelect        Clicking on any node with the Control key pressed toggles the selection of that node.
    msShiftSelect        Clicking on any node with the Shift key press selects that node, the last single node selected, and the nodes in between. All other nodes are deselected.
    msVisibleOnly        Multiple selections with the Shift key do not include child nodes of collapsed nodes.
    msSiblingOnly        Selected nodes are restricted to a single set of siblings.
  property MultiSelectStyle: TMultiSelectStyle;

  //默认是从跟开始显示,设置StartWithNodes可以从BizTree的某几个节点开始显示,要调用StartWithNodes.AddObject方法来增加
  //第一个参数是节点的GUID,注意不是BizURL,第二个参数是节点对象的BizNode
  //可以调用BizTree.FindNodeByBizURL根据BizURL来查找BizNode
  property StartWithNodes: Business.System.TStrings;

TCustomTreeView:
  //完全收缩
  procedure FullCollapse;

  //完全展开
  procedure FullExpand;
回复

使用道具 举报

 楼主| 发表于 2008-6-30 10:30:13 | 显示全部楼层

TOrgTreeView举例

以下代码从销售部开始显示销售部的子节点,并且展开树
var
  lURL: TBizURL;
  lNode: TBizNode;
begin
  lURL := TBizURL.Create;
  try
    OrgTreeView1.StartWithNodes.Clear;
    lURL.URL := 'Org:ROOTYGJT.OGNXSB.dpt';
    lNode := OrgTreeView1.BizTree.FindNodeByBizURL(lURL);
    OrgTreeView1.StartWithNodes.AddObject(lNode.GUID, lNode);
  finally
    lURL.Free;
  end;
  OrgTreeView1.ReloadTree;
  OrgTreeView1.FullExpand;
end;
运行效果

1.png

2.28 KB, 下载次数: 620

回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-30 10:36:35 | 显示全部楼层
以下代码跟楼上同样效果
begin
  OrgTreeView1.StartWithNodes.Clear;
  OrgTreeView1.AddStartWith('Org:ROOTYGJT.OGNXSB.dpt');
  OrgTreeView1.ReloadTree;
  OrgTreeView1.FullExpand;
end;
运行效果

2.png

2.28 KB, 下载次数: 604

回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-30 10:40:18 | 显示全部楼层
以下代码显示整个组织机构树,并且展开
begin
  OrgTreeView1.ShowOptions := [TBizObjectKind.boBizServer, TBizObjectKind.boSpace, TBizObjectKind.boFolder, TBizObjectKind.boFunc,
    TBizObjectKind.boOrgServer, TBizObjectKind.boOrgRoot, TBizObjectKind.boOrgan, TBizObjectKind.boDept, TBizObjectKind.boPositionMember,
    TBizObjectKind.boPersonMember];
  OrgTreeView1.AddStartWithOrgRoot;
  OrgTreeView1.ReloadTree;
  OrgTreeView1.FullExpand;
end;
运行效果

1.png

4.21 KB, 下载次数: 609

回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-30 10:45:20 | 显示全部楼层
以下代码显示销售部的子部门以及人员成员和岗位成员等
begin
  OrgTreeView1.StartWithNodes.Clear;
  OrgTreeView1.AddStartWithChildren('Org:ROOTYGJT.OGNXSB.dpt');
  OrgTreeView1.ReloadTree;
  OrgTreeView1.FullExpand;
end;
运行效果

1.png

1.99 KB, 下载次数: 609

回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-30 11:22:57 | 显示全部楼层

一个例子,可以拿来直接使用

这个例子提供了一个静态方法,调用这个静态方法,可以从组织机构树中选择需要的组织单元
例子中用到了TOrgTreeView来显示选择的源和目标
用到了TOrgTreeView类的以下方法和属性:
  AddStartWithOrgRoot
  ReloadTree
  BizURLs
  SelectedNode

窗体的资源文件
object TreeSelectOrgUnits: TTreeSelectOrgUnits
  Left = 0
  Top = 0
  BorderStyle = bsDialog
  Caption = #20027#31383#20307
  ClientHeight = 488
  ClientWidth = 632
  Color = clBtnFace
  Font.Charset = GB2312_CHARSET
  Font.Color = clWindowText
  Font.Height = -12
  Font.Name = #23435#20307
  Font.Style = []
  OldCreateOrder = False
  ShowHint = True
  WindowState = wsNormal
  OnCreate = BizFormCreate
  OnDestroy = BizFormDestroy
  OnShow = BizFormShow
  PixelsPerInch = 96
  TextHeight = 12
  object otvSource: TOrgTreeView
    Left = 8
    Top = 16
    Width = 272
    Height = 408
    AutoLoad = False
    HideSelection = False
    Indent = 19
    TabOrder = 0
    TabStop = True
    DisplayType = dtDisplayName
    BizOperates = []
  end
  object otvSelected: TOrgTreeView
    Left = 352
    Top = 16
    Width = 224
    Height = 408
    AutoLoad = False
    HideSelection = False
    Indent = 19
    TabOrder = 1
    TabStop = True
    DisplayType = dtDisplayName
    BizOperates = []
  end
  object btnAdd: TButton
    Left = 304
    Top = 64
    Width = 32
    Height = 25
    Caption = '>>'
    TabOrder = 2
    OnClick = btnAddClick
  end
  object btnDel: TButton
    Left = 304
    Top = 216
    Width = 32
    Height = 25
    Caption = '<<'
    TabOrder = 3
    OnClick = btnDelClick
  end
  object BitBtn1: TBitBtn
    Left = 256
    Top = 448
    Width = 75
    Height = 25
    TabOrder = 4
    Kind = bkOK
  end
  object BitBtn2: TBitBtn
    Left = 376
    Top = 448
    Width = 75
    Height = 25
    TabOrder = 5
    Kind = bkCancel
  end
end

代码:
unit TreeSelectOrgUnits;

interface

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

type
  TTreeSelectOrgUnits = class(TForm)
    otvSource: TOrgTreeView;
    btnAdd: TButton;
    otvSelected: TOrgTreeView;
    btnDel: TButton;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    procedure btnAddClick(Sender: TObject);
    procedure btnDelClick(Sender: TObject);
    procedure BizFormDestroy(Sender: TObject);
    procedure BizFormCreate(Sender: TObject);
    procedure BizFormShow(Sender: TObject);
  private
    {private declarations}
    FNodes: TStrings;
    procedure RefreshSelected;
    procedure AssignOrgURLs(AOrgURLs: TOrgURLs);
    procedure AssignToOrgURLs(AOrgURLs: TOrgURLs);
  public
    {public declarations}
    static function SelectOrgUnits(AContext: TContext; const ACaption: string;
      ASelected: TOrgURLs): Boolean;
  end;

implementation

static function TTreeSelectOrgUnits.SelectOrgUnits(AContext: TContext; const ACaption: string;
      ASelected: TOrgURLs): Boolean;
begin
  with TTreeSelectOrgUnits.Create(AContext) do
  begin
    Caption := ACaption;
    AssignOrgURLs(ASelected);
    Result := ShowModal = Business.Forms.Controls.mrOK;
    if Result then
      AssignToOrgURLs(ASelected);
  end;
end;

procedure TTreeSelectOrgUnits.AssignOrgURLs(AOrgURLs: TOrgURLs);
var
  i: Integer;
begin
  for i:=0 to AOrgURLs.Count-1 do
    FNodes.AddObject( AOrgURLs.BizURL.URL,
    BizTree.BizTreeStructure.FindNodeByBizURL(AOrgURLs.BizURL));
end;

procedure TTreeSelectOrgUnits.AssignToOrgURLs(AOrgURLs: TOrgURLs);
var
  i: Integer;
begin
  AOrgURLs.Clear;
  for i:=0 to FNodes.Count-1 do
    AOrgURLs.Add(TBizNode(FNodes.Objects).BizURL);
end;

procedure TTreeSelectOrgUnits.BizFormCreate(Sender: TObject);
begin
  FNodes := TStringList.Create;
  otvSource.AddStartWithOrgRoot;
  otvSource.ReloadTree;
  RefreshSelected;
end;


procedure TTreeSelectOrgUnits.BizFormDestroy(Sender: TObject);
begin
  FreeAndNil(FNodes);
end;

procedure TTreeSelectOrgUnits.RefreshSelected;
var
  i: Integer;
  lNodes1, lNodes2: TStrings;
begin
  lNodes1 := TStringList.Create;
  lNodes2 := TStringList.Create;
  try
    for i:=0 to FNodes.Count-1 do
      lNodes2.AddObject(TBizNode(FNodes.Objects).GUID, FNodes.Objects);

    BizTree.BizTreeStructure.GetNodesTreeList(lNodes2, lNodes1, False,
          False, True, True);

    otvSelected.BizURLs.Clear;
    for i:=0 to lNodes1.Count-1 do
      if not SysUtils.Sametext('Org:', TBizNode(lNodes1.Objects).BizURL.URL) then
        otvSelected.BizURLs.Add(TBizNode(lNodes1.Objects).BizURL.URL);
    if otvSelected.BizURLs.Count>0 then
      otvSelected.ReloadTree
    else
      otvSelected.ClearTree;
    if (FNodes.Count>0) and (otvSelected.SelectedNode=nil) then
        otvSelected.SelectedNode := (FNodes.Objects[0] as TBizNode);
  finally
    lNodes1.Free;
    lNodes2.Free;
  end;
end;

procedure TTreeSelectOrgUnits.btnAddClick(Sender: TObject);
var
  lNode: TBizNode;
begin
  otvSelected.BeginUpdate;
  lNode := BizTree.BizTreeStructure.FindNodeByBizURL(otvSource.SelectedNode.BizURL);
  FNodes.AddObject(lNode.BizURL.URL, lNode);

  RefreshSelected;
  otvSelected.EndUpdate;
  otvSelected.SelectedNode := otvSource.SelectedNode;
end;

procedure TTreeSelectOrgUnits.btnDelClick(Sender: TObject);
var
  lTreeNode: TTreeNode;
begin
  if (otvSelected.SelectedNode<>nil) and (FNodes.IndexOfObject(otvSelected.SelectedNode)>=0) then
  begin
    FNodes.Delete(FNodes.IndexOf(otvSelected.SelectedNode.BizURL.URL));
    lTreeNode := otvSelected.FindNextToSelect;
    RefreshSelected;
    try
      if (FNodes.Count>0) then
        otvSelected.Selected := lTreeNode;
    except
      if FNodes.Count>0 then
        otvSelected.SelectedNode := (FNodes.Objects[0] as TBizNode);
    end;
  end;
end;

procedure TTreeSelectOrgUnits.BizFormShow(Sender: TObject);
begin
  RefreshSelected;
end;

end.

运行效果图

1.png

6.46 KB, 下载次数: 614

回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-30 11:23:42 | 显示全部楼层
调用的方法
var
  lSelected: Org.TOrgURLs;
  s: String;
  i: Integer;
begin
  lSelected := Org.TOrgURLs.Create;
  lSelected.Add('XSB', 'XSY', '');
  TTreeSelectOrgUnits.SelectOrgUnits(Context, 'Test', lSelected);
  if lSelected.Count=0 then
    s := '没有选中的单元'
  else
    s := SysUtils.Format('共选择了%3d个,分别是', [lSelected.Count]);
  for i:=0 to lSelected.Count-1 do
    s := s+#13#10#9+lSelected.BizURL.URL;
  Business.Forms.Dialogs.Showmessage(s);
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-30 11:35:33 | 显示全部楼层
在 系统空间用户界面基础\界面库系统接口\选择组织单元对话框 也是一个选择组织单元的窗体,可以直接调用
左边的选择源是用的TBizTree,显示成树,右边的选中的对象是部门 岗位 人员三个ID显示
调用代码如下:
var
  lSrc, lSelected: TOrgURLs;
  s: String;
  i: Integer;
begin
  lSrc := TOrgURLs.Create;
  lSelected := TOrgURLs.Create;
  lSrc.Add('XSB', '', '');
  lSrc.Add('XSB', 'XSY', '');
  lSelected.Add('XSB', 'XSY', '');
  TSelectOrgUnitsForm.SelectOrgUnits(Context, 'test', lSrc, lSelected, True, [TOrgUnitKind.boDept, TOrgUnitKind.boPositionMember]);
  if lSelected.Count=0 then
    s := '没有选中的单元'
  else
    s := SysUtils.Format('共选择了%3d个,分别是', [lSelected.Count]);
  for i:=0 to lSelected.Count-1 do
    s := s+#13#10#9+lSelected.BizURL.URL;
  Dialogs.Showmessage(s);
end;
运行效果

1.png

7.79 KB, 下载次数: 612

回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-30 15:16:59 | 显示全部楼层
下面来介绍一下TOrgComboBox
继承关系:
  TWinControl
    +-- TCustomControl
           +-- TCustomControlComboBox
                 +-- TBaseComboBox
                       +-- TBizComboBox
                             +-- TOrgComboBox

常见属性与方法:
TBizComboBox
  //下拉的树,可以参考上面介绍的TBizTreeView来设置,比如设置StartWithNodes来设置从哪个节点开始显示
  function BizTreeView: TBizTreeView;

  //当前选中的文件名,如果是组织单元的话,其实FileName=BizURL.URL的,也可以调用Business.Model.BizSys.BizSystem.FileName2URL 方法来转换成BizURL来使用
  property FileName: string;

  //可以选择的节点类型,比如设置[TBizObjectKind.boPersonMember],则只能选择人员成员,其他类型的节点无法选择
  property SelectedOptions: Business.Model.TBizObjectKinds;

  //是否显示全路径,比如:True是显示 组织模型\组织机构\阳光集团\销售部\销售员\张三
  //False是显示 张三
  property ShowFullPath: Boolean;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-30 15:18:45 | 显示全部楼层
以下代码使显示下来只显示销售部,并且只允许选择人员成员
var
  lURL: TBizURL;
  lNode: TBizNode;
begin
  lURL := TBizURL.Create;
  try
    OrgComboBox1.BizTreeView.StartWithNodes.Clear;
    lURL.URL := 'Org:ROOTYGJT.OGNXSB.dpt';
    lNode := OrgComboBox1.BizTreeView.BizTree.FindNodeByBizURL(lURL);
    OrgComboBox1.BizTreeView.StartWithNodes.AddObject(lNode.GUID, lNode);
    OrgComboBox1.SelectedOptions := [TBizObjectKind.boPersonMember];
    OrgComboBox1.BizTreeView.ReloadTree;
  finally
    lURL.Free;
  end;
end;
运行效果

1.png

4.2 KB, 下载次数: 598

回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-20 23:11 , Processed in 0.043735 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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