📄 ucreattree.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 + -