摘自 eyLife富翁笔记 作者 :
xfz8124
表名为TB,字段如下
编号:code
名称:name
所属:belong
算法核心代码,为增强算法通用性,将窗体的一个treeview和ADOQuery引用到局部变量中,作为对象引用,不创建,也不释放,相当于别名
Code
1
procedure Tfrm.FmtTree();
2
var
3
i,j :integer;
4
leafList,leafListPlus: TList;
5
leaf,subNode: TTreeNode;
6
tv: TTreeView;//引用窗体控件
7
qry: TADOQuery;//引用窗体控件
8
begin
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;
44
end;
45
说明:
用TList类型模拟实现了广度优先算法的队列--先进先出--实际上,本算法不需要那么严格,只要按批先进先出就行了。leafList用于当前循环,leafListPlus用于下一轮循环,其中保存的都是树节点类型,以方便在treeview上直接插入子节点,就省了查找父结点的算法,节点的编号缓存在节点的StateIndex属性中,编号可转为整数型这是最方便的,如果编号不能保证可转为整数,可以使用data属性,可保万无一失