unit LoadTree; interface uses Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,Db,adodb,DBTables,ComCtrls,ImgList,StdCtrls; function GetLevel(sFormat,sCode:String):Integer; procedure CreateTree(qry_Comm:tAdoquery;const TableName,aCode,aName:String;tv:TTreeView); const SCodeFormat ='322222'; //科目代码结构 SFirstNodeTxt = '报表目录'; //首节点显示的文字 implementation function GetLevel(sFormat,sCode:String):Integer; var i,Level,iLen:Integer; begin Level:=-1;//如果代码不符合标准,则返回-1 iLen:=0; if (sFormat <>'')and(sCode<>'')then for i:=1 to Length(sFormat) do begin iLen:=iLen+StrToInt(sFormat[i]); if Length(sCode)=iLen then begin Level:=i; Break; end; end; Result:=Level; end; procedure CreateTree(qry_Comm:tAdoquery;const TableName,aCode,aName:String;tv:TTreeView); var NowID,sName,ShowTxt:String; i,Level:Integer; MyNode:array[0..6]of TTreeNode; //保存各级节点,最长支持6级(重点) begin Screen.Cursor:=crHourGlass; Level:=0; With qry_Comm do begin try if Active then close; sql.Clear ; sql.Text :='select '+aCode+','+aName+' from '+TableName+' order by '+acode; open; First; tv.Items.Clear; //以下是增加第一项 MyNode[Level]:=tv.Items.Add(tv.TopItem,SFirstNodeTxt); MyNode[Level].ImageIndex:=0; MyNode[Level].SelectedIndex:=0; //以上是增加第一项 While Not Eof do begin NowID:=Trim(FieldByName(aCode).AsString); ShowTxt:=NowID+' '+FieldByName(aName).AsString; Level:=GetLevel(SCodeFormat,NowID); //返回代码的级数 //以下是增加子项 //以下用上一级节点为父节点添加子节点 if Level> 0 then//确保代码符合标准 begin MyNode[Level]:=tv.Items.AddChild(MyNode[Level-1],ShowTxt); MyNode[Level].ImageIndex:=1; MyNode[Level].SelectedIndex:=2; end; //以上是增加子项 Next; end; finally Close; end; end; MyNode[0].Expand(False);//将首节点展开 Screen.Cursor:=crDefault; end; end.