gpubunit.pas

来自「delphi renyuanguanlixinxioxitong」· PAS 代码 · 共 112 行

PAS
112
字号
unit gpubUnit;

interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
  Forms,Dialogs,ComCtrls, ADODB, DB, ExtCtrls, DBCtrls;
var
   gsUserID :string;
   gsUserName :string;

   //tvDepartment为从调用界面传递过来的TTreeView,将部门插入到该tvDepartment对象中
   //建立树结构函数
   function gfunCreateTree(tvDepartment :TTreeView) :boolean;
   //查找父节点函数
   function gfunFindparentSite(sUpperDepartmentNo :string; tvDepartment :TTreeView): integer ;

implementation
uses DataModual;
//------------------------------------------------------------------------------
//创建部门数函数
//参数tvDepartment:调用者传递来的TTreeView对象,该对象没有数据
//功能:动态创建TADOQuery对象,用于检索部门树结构,根据该对象的值,
//      在tvDepartment构造一颗部门树,并返回给调用者
function gfunCreateTree(tvDepartment :TTreeView) :boolean;
var
  aqryTree: TADOQuery;  //用于检索部门树结构
  //接收数据集的字段
  sDepartmentName,sUpperDepartmentNo,sDepartmentNo :string;
  nParentSite :integer; //查找父结点
  ilevel :integer;     //结点级别
begin
  //检索部门树状结构
  aqryTree :=TADOQuery.Create(nil);
  aqryTree.Connection :=DataModule1.connOracle;
  aqryTree.SQL.Add('select departmentNo,departmentname,upperDepartmentNo ,level') ;
  aqryTree.SQL.Add('from department');
  aqryTree.SQL.Add('connect by prior departmentNo=upperdepartmentno');
  aqryTree.SQL.Add('start with departmentno= :sDepartmentNo');
  aqryTree.SQL.Add('order by level');
  aqryTree.Parameters.ParamByName('sDepartmentNo').Value := '001';
  try
    aqryTree.Open;
  except
    application.MessageBox('检索树结构出错','提示',mb_ok) ;
    Result :=False;
  end;

  //将部门插入到treeview中
  tvDepartment.Items.Clear ;
  aqryTree.First; //将指针移动到最前面
  while not aqryTree.Eof do //数据集未完以前
  begin
    sDepartmentNo:=trim(aqryTree.fieldbyname('DepartmentNo').asstring);
    sDepartmentName:=trim(aqryTree.FieldByName('DepartmentName').AsString);
    sUpperDepartmentNo:=trim(aqryTree.fieldbyname('UpperDepartmentNo').asstring);
    ilevel := aqryTree.fieldbyname('level').AsInteger ;
    if ilevel=1 then //如果ilevel=1,则当前要插入的为根结点
       tvDepartment.Items.add(tvDepartment.topitem,sDepartmentNo+'--'+sDepartmentName)
    else
    begin
      //找到相应的父结点
      nParentSite:= gfunFindparentSite(sUpperDepartmentNo,tvDepartment);
      if nParentSite<>-1 then
         tvDepartment.Items.AddChild(tvDepartment.Items[nParentSite],
               sDepartmentNo+'--'+sDepartmentName);
    end;
    aqryTree.Next;//数据集向下移一条
  end;
  if tvDepartment.Items.Count=0 then
  begin
    Result :=True;
    exit;
  end;
  tvDepartment.TopItem.Expanded:=true;
  //释放对象qryTree
  aqryTree.Active :=False;
  aqryTree.Free;
  Result :=True;
end;
//------------------------------------------------------------------------------
//查找父结点函数
//参数sUpperDepartmentNo:上级部门编号
//参数tvDepartment:调用者传递来的TTreeView对象,该对象已经建立并有数据
//功能:依据sUpperDepartmentNo值,在tvDepartment中找到相应的位置,
//      若找到,返回序号,否则返回-1
function gfunFindparentSite(sUpperDepartmentNo :string;tvDepartment :TTreeView): integer;
  var
    i :integer;
    tempStr :string;
begin
  //遍历整棵树
  if tvDepartment.Items.Count=0 then
  begin
    result:=-1;
    exit;
  end;
  for i:=0 to tvDepartment.Items.Count-1 do
  begin
    tempStr:=tvDepartment.Items[i].Text;
    //判断结点显示值中的第一个是否与上级编号相同
    if pos(sUpperDepartmentNo,tempStr)<>0 then
    begin
      result:=i; //i为TreeView中items集合中的序号数
      exit;
    end;
  end;
  result :=0;
end;


end.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?