请问如何使用递归,能帮我逐条解条解释一下下面的代码吗?Thanks!
SQL中数据表MaterielType有字段no/type/ParentNo,其记录值由用户决定,比如:
no     type    ParentNo
1      成品       
2      半成品     
3      面板       1
4      网框       1
5      导相管     1
6      装饰板     2
7      相件       3现要求建立一树TreeView,对应表中的记录。
|--1--3--7 
|   --4 
|   --5
|--2--6代码如下:
procedure  TForm1.newtreeview(Node:TTreeNode;ParentID:integer);
var
  tmpNode : TTreeNode;
  ADOquery1 : TADOQuery;
begin
  ADOQuery1 := TADOQuery.Create(self);
  ADOQuery1.Connection := ADOConnection1;
  ADOQuery1.close;
  ADOQuery1.SQL.clear;
  ADOQuery1.SQL.Text := 'select * from table where Parentno ='+inttostr(ParentID);
  ADOQuery1.open;
  if ADOQuery1.recordcount > 0  then
  begin
    ADOQuery1.First;
    while not ADOQuery1.Eof do
    begin
      tmpNode := TreeView1.Items.AddChild(Node,ADOQuery1.FieldByName('type').AsString);
      Newtreeview(tmpNode,ADOQuery1.FieldByName('no').AsInteger);
      ADOQuery1.next;
    end;
  end;
  ADOQuery1.Free;
end;
//楼主将前两条记录的ParentNo改为0
procedure TForm1.Button1Click(Sender: TObject);
begin
  newtreeview(nil,0);
end;

解决方案 »

  1.   

    程序递归思路:1.调用时取得当前(第一次为根节点)的ParentNo号,取得当前节点下的所有记录ADOQuery1.SQL.Text := 'select * from table where Parentno ='+inttostr(ParentID);2.增加该节点Newtreeview(tmpNode,ADOQuery1.FieldByName('no').AsInteger);3.记住该节点的tmpNode := TreeView1.Items.AddChild(Node,ADOQuery1.FieldByName('type').AsString);4.再次执行此过程,如有下一节点if ADOQuery1.recordcount > 0  then则继续加入下一节点(1/2/3步)即从再次执行4.  
     如没有下一节点则程序到ADOQuery1.Free;处,处理上一节点的下一节点,如上循环直到加入所有节点。递归实际是调用本过程的一程方法,程序将自动记住上一层的操作,如第一次执行时newtreeview(nil,0);程序找到两条记录no值为1和2;首先加入1,然后递归加入3,然后递归加入7,再次执行时因7无节点,故返回下一条记录,即加入节点4,4无节点,返回执行加入5,依次返回上一循环,加入2,然后6完成。