从数据库读取树形资料,并在treeview中显示,非常精练的广度优先算法

摘自 eyLife富翁笔记                            作者 : xfz8124

表名为TB,字段如下
编号:code
名称:name
所属:belong

算法核心代码,为增强算法通用性,将窗体的一个treeview和ADOQuery引用到局部变量中,作为对象引用,不创建,也不释放,相当于别名
ContractedBlock.gif ExpandedBlockStart.gif Code
 1procedure Tfrm.FmtTree();
 2var
 3  i,j :integer;
 4  leafList,leafListPlus: TList;
 5  leaf,subNode: TTreeNode;
 6  tv: TTreeView;//引用窗体控件
 7  qry: TADOQuery;//引用窗体控件
 8begin
 9  //初始化
10  leafList:=TList.Create;
11  leafListPlus:=TList.Create;
12  tv:=tvw1;
13  tv.Items.Clear;
14  qry:=qry1;
15  subNode:=tv.Items.AddChild(nil,'月夜风筝(我)的公司');
16  leafList.Add(subNode);
17  //处理
18  while leafList.Count > 0 do
19     begin
20     leafListPlus.Clear;
21     for i:=0 to leafList.Count-1 do
22        begin
23        leaf:=leafList;
24        if leaf.Level = 0 then
25           qry.SQL.Text:=Format('select code,name,belong from TB where belong = ''%s''',['--'])
26        else
27           qry.SQL.Text:=Format('select code,Name,belong from TB where belong = ''%d''',[leaf.StateIndex]);
28        qry.Open;
29        for j:= 0 to qry.RecordCount-1 do
30           begin
31           subNode:=tv.Items.AddChild(leaf,qry.FieldByName('name').AsString);
32           subNode.ImageIndex:=subNode.Level;
33           subNode.StateIndex:=StrToInt(qry.FieldByName('code').AsString);
34           leafListPlus.Add(subNode);
35           qry.Next;
36           end;
37        end;
38     leafList.Assign(leafListPlus);
39     end;
40  //清理
41  tv.FullExpand;
42  leafListPlus.Free;
43  leafList.Free;
44end;
45



说明:
  用TList类型模拟实现了广度优先算法的队列--先进先出--实际上,本算法不需要那么严格,只要按批先进先出就行了。leafList用于当前循环,leafListPlus用于下一轮循环,其中保存的都是树节点类型,以方便在treeview上直接插入子节点,就省了查找父结点的算法,节点的编号缓存在节点的StateIndex属性中,编号可转为整数型这是最方便的,如果编号不能保证可转为整数,可以使用data属性,可保万无一失

转载于:https://www.cnblogs.com/netclass/archive/2009/09/09/1563513.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值