⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ucreattree.pas

📁 专项拨款逐级下发系统的主要功能:对专项拨款申请系统审批通过的专项拨款进行资金下发和签收
💻 PAS
字号:
unit Ucreattree;

interface
uses
  Windows, Messages, SysUtils, Classes, ComCtrls, Controls,
  RzTreeVw,  ImgList, DB, ADODB,forms;
  //定义树结点存放数据使用的记录指针
  type
  PMyTree=^TMyTree;
  TMyTree=Record
    Code:string;        //结点代码
    Name:string;        //结点名
    ParentCode:string;  //父结点代码
    itemed:boolean;    //项目结点
  end;
 function NewNode(Nodes:TTreeNodes;ParentNode:TTreeNode;Name,Code,ParentCode:String;itemed:boolean;MyT:PMyTree;level:integer):TTreeNode;
 procedure CreateNode(DataSet:TDataSet;aqitem:tadoquery;Nodes:TTreeNodes;ParentNode:TTreeNode;
                             ParentCode:string;MyT:PMyTree;proplan:TProgressBar);
 procedure LoadTree(TreeView:TRzTreeView;AdoConn:TADOConnection;strSQL:String;proplan:TProgressBar);
implementation

var
  MyTreeNode:PMyTree;
// C.设置结点参数,指针等(通公用代码)
function NewNode(Nodes:TTreeNodes;ParentNode:TTreeNode;Name,Code,ParentCode:String;itemed:boolean;MyT:PMyTree;level:integer):TTreeNode;
begin
  New(MyT);
  MyT^.Code            := Code;
  MyT^.Name            := Name;
  MyT^.ParentCode      := ParentCode;
  MyT^.itemed          :=itemed;
  result               := Nodes.AddChild(ParentNode,Name);
  result.ImageIndex :=level;
  result.Data          := MyT;

end;

// B.递推创建结点 (通用代码)
//DataSet中需要有字段Name:显示的值,ParentCode父结点代码,Code当前结点代码三个字段
//其余字段根据实际情况自行添加,并修改相应代码即可
procedure CreateNode(DataSet:TDataSet;aqitem:tadoquery;Nodes:TTreeNodes;ParentNode:TTreeNode;
                  ParentCode:string;MyT:PMyTree;proplan:TProgressBar);
var
  Recno:Integer;
  Node,itemnode : TTreeNode;
  Code,Name,itemcode,itemname : String;
  level:integer;
begin
  Recno := DataSet.RecNo;  //记下进入时的记录号
  if DataSet.Locate('higherUp_No',ParentCode,[]) then  //查找父结点以下的首个子节点
  begin
    while not DataSet.Eof do  //扫描所有子结点,并载入到树中
    begin
      Code := DataSet.FieldValues['u_no'];
      Name := DataSet.FieldValues['u_name'];
      level:=DataSet.FieldValues['u_Level'];
      Node :=NewNode(Nodes,ParentNode,Name,Code,ParentCode,false,MyT,level);
      aqitem.SQL.Clear;
      aqitem.SQL.Add('select item_no,item_name,use_unit_no from info_item where use_unit_no='''+Code+'''');
      aqitem.Open;
      if aqitem.RecordCount>0 then
       while not aqitem.Eof  do
       begin
          itemCode := aqitem.fieldbyname('item_no').AsString;
          itemName :=  aqitem.fieldbyname('item_name').AsString+'(项目)';
          itemNode :=NewNode(Nodes,node,itemName,itemCode,code,true,MyT,6);
          aqitem.Next;
       end;
      CreateNode(DataSet,aqitem,Nodes,Node,Code,MyT,proplan);   //递推方式加载下层子结点
      DataSet.Next;
      if DataSet.FieldValues['higherUp_No']<>ParentCode then break;  //父结点不同时返回到上层
    end;
  end;

    proplan.Position := nodes.Count;
    application.ProcessMessages;

  DataSet.RecNo := Recno;  //还原记录号
end;

// A.加载树
procedure LoadTree(TreeView:TRzTreeView;AdoConn:TADOConnection;strSQL:String;proplan:TProgressBar);
var
  AdoQry,adoqryitem: TADOQuery;
begin
  // 1. 打开数据表,并按父级代码,总代码进行升序排列记录
  AdoQry := TADOQuery.Create(nil);
  AdoQry.Connection := AdoConn;
  AdoQry.SQL.Add(strSQL);
  AdoQry.Active := true;
  adoqryitem:=Tadoquery.Create(nil);
  adoqryitem.Connection:=adoconn;
  // 2. 清空树结点,创建根结点
  TreeView.Items.BeginUpdate;
  TreeView.Items.Clear;
    proplan.Visible :=true;;
    proplan.Min := 0;
    proplan.Max := AdoQry.RecordCount;

  CreateNode(AdoQry,adoqryitem,TreeView.Items,nil,'0',MyTreeNode,proplan);
  proplan.Position := proplan.Max;
  proplan.Visible :=false;
  //  3. 关闭数据表
  AdoQry.Free;
  adoqryitem.Free;
  // 4.树生成完成,展开根结点
  TreeView.Items.EndUpdate;
  treeview.FullExpand ; 
  //TreeView.Items[0].Expand(false);
end;
end.
 

⌨️ 快捷键说明

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