100求实现一个通用建树函数,请各位来支支招

ck_邬 2012-11-26 11:20:59
想实现一个通用的建树函数,用Treeview实现,函数声明类似如下:
function IniTree(arSqlStr:array of String;Level:Integer)

arSqlStr是一个SQL语句的数组,Level是对应数组的个数,
如arSqlStr有两个元素,即Level是2传入,生成的树就是两层.
如我输入的level是2,
第一层返回的数据是
a
b
第二层返回的数据是
a a1
a a2
b b1
那么结果就是
+a
+--a1
+--a2
+b
+--b1

固定层数还好办.现在就想做一个能动态层数的.
以上是我设想的函数声明,大伙可以完善一下,本人才疏,算法比较差,想不通啊,向大家求解一下.谢谢,
...全文
154 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
SQLDebug_Fan 2012-11-27
  • 打赏
  • 举报
回复
可以把树理解为一种数据结构,如果要实现通用建树,就要实现底层数据结构。
haitao 2012-11-27
  • 打赏
  • 举报
回复
随机生成一棵树? 只要循环扫描treeview.items,随机决定要不要对treeview.items[i].addchild 或者先生成一个层次缩进文本,再treeview.loadfromfile(文本文件)
bdmh 2012-11-27
  • 打赏
  • 举报
回复
就是个递归吗,你可以参考treeview的loadfile
UnkownState 2012-11-27
  • 打赏
  • 举报
回复
id, parent是可以使用构建树方法,有递归的,有非递归的,递归的效率不高,非递归的网上介绍也很多。有种使用stringlist二分查找的效率较高。
蓝色光芒 2012-11-26
  • 打赏
  • 举报
回复
数据库的树型结构,最理想的是2个控制字段 ID ParentID (Name and more..) int int 如果ParentID=0则是顶级目录,如果ParentID>0,则归属于该ID的目录下,这样无论是显示还是调整结构都非常方便. 显示时, procedure ShowToTreeView(Tree : TTreeView; ParentNode : TTreeNode; ParentID : integer); 然后用这个函数递归,整个树就显示出来了.
雄牛 2012-11-26
  • 打赏
  • 举报
回复
给你一个数据库的部门树生成: 数据库: AutoID ID Dname ParentID leave ShortName 141 01 北京公司 0 1 A 142 02 深圳公司 0 1 B 143 03 上海公司 0 1 C 144 0301 资讯部 03 2 F 149 030101 硬件组 0301 3 150 030102 软件组 0301 3 145 04 香港公司 0 1 D 146 05 武汉仓库 0 1 E {--------------------------读树-----------------------------} procedure TMainForm.ReadTree(tnode:TTreeNode;Fvalue: String); Var i: integer; Flist:TStringList; Flist1:TStringList; str,s:string; snode:TTreeNode; begin qryTree.close; qryTree.sql.clear; qryTree.sql.add('select did,dname,Parentid from depart where isnull(Parentid,'''')='''+Fvalue+''' '+Fittree+' '); qryTree.Open; qryTree.First; Flist:=TStringList.Create; Flist1:=TStringList.Create; while not qryTree.eof do begin Flist.Add(trim(qryTree.fieldbyname('dname').asstring)); Flist1.Add(qryTree.fieldbyname('did').asstring); qryTree.next; end; for i:= 0 to flist.Count-1 do begin s:=flist1.Strings[i]; str:=flist.Strings[i]; snode:=Treeview1.items.addchild(tnode,str); ReadTree(snode,s); end; flist.free; flist1.free; end; //调用 ReadTree(RootNode1,'0');

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧