procedure TForm1.FillTree(Node: TTreeNode);
var
Child, Temp: TTreeNode;
begin
with Query1 do begin
if not Assigned(Node) then //如果是树根节点,那么读取Parent值作为根节点
SQL.Text := 'Select Distinct Parent As Child From test1'
else begin //如果是非根节点,那么根据当前父节点确定其子节点
SQL.Text := 'Select Child From test1 '
+ 'Where Parent =
arent';
ParamByName('Parent').AsString := Node.Text;
end;
Open;
try //通过循环添加当前父节点的所有子节点(不包括子节点的子节点)
First;
while not Eof do begin
TreeView1.Items.AddChild(Node, FieldByName('Child').AsString);
Next;
end;
finally
Close;
end;
//通过递归添加子节点的子节点
if Assigned(Node) then Child := Node.GetFirstChild
else Child := TreeView1.Items[0];
while Assigned(Child) do begin
//注意:这段代码用于删除重复节点,而且它将会极大影响速度,原因是
//很难通过表中直接知道哪些节点是真正的根节点,哪些节点是非根节点,
//所以不得不先把真假根节点加入,然后再在删除之。有两个解决方法
//可以提高效率:1。在建树前,另外写一段代码来确定真根节点;2。在
//在数据表中添加入一条特殊的记录,如:-1 101,然后修改上面处理根
//节点的SQL语句,可以达到快速的理想效果,但这显然是用空间换取时间
//的方法,自己看着办吧。
if Assigned(Node) then begin
Temp := TreeView1.Items[0];
while Assigned(Temp) do begin
if Temp.Text = Child.Text then begin
Temp.Delete;
Break;
end;
Temp := Temp.GetNextSibling;
end;
end;
//递归
FillTree(Child);
Child := Child.GetNextSibling;
end;
end;
end;
procedure TForm1.FormClick(Sender: TObject);
begin
FillTree(nil);
end;