表:  
id      nodeid   description  
2 01 一二階文件
3 01 三階文件
4 02 客戶特殊規格書
5 02 產品規格
6 02 燒結半成品規格書
7 02 副材料規格書
8 02 成品包裝規格書
9 02 三廠一致性作業標准
10 02 高安各單位作業標准
11 01 外來文件
  
 
代碼:  
 
procedure  TOneTwoLevelForm.LoadSubNode(snode:TTreeNode;nodekind:String);  
var  
   subnode:TTreeNode;  
   nname,nid:String;  
   p1:Pint;  
begin  
   with  ADOQuery1  do  
   begin  
       Close;  
       SQL.Add('select  *  from  FMC_Category  where  nodeid=:a');  
       Parameters.ParamByName('a').Value:=nodekind;  
       Open;  
       ExecSQL;  
       First;  
       while  not  eof  do  
       begin  
           nid:=FieldByName('nodeid').AsString;  
           nname:=FieldByName('description').AsString;  
           new(p1);  
           p1^.nodeid:=nid;  
           p1^.nodename:=nname;  
           subnode:=TreeView1.Items.AddChildObject(snode,nname,p1);  
           LoadSubNode(subnode,nid);  
           next;  
       end;  
   end;  
end;  
 
//調用:  
procedure  TOneTwoLevelForm.FormShow(Sender:  TObject);  
var  
   rootnode:TTreeNode;  
   p1:Pint;  
begin  
   new(p1);  
   p1^.nodeid:='00';  
   p1^.nodename:='公司';  
   rootnode:=TreeView1.Items.AddChildObject(nil,'AA',p1);  
   LoadSubNode(rootnode,'00');  
end;  我想實現的是:+一二階文件
+三階文件
   |-客戶特殊規格書
   |-產品規格
   |-...
   |-xx各單位作業標准
+外來文件
 
 
請問各位高手,那個遞歸錯在哪?遞歸我不是很懂啊!  
 
謝謝大家了!  

解决方案 »

  1.   

    我觉得你这个问题处理的时候根本不必用递归,就在 while not eof do循环里处理就可以了,而且就算是调用递归的话,也不要把
    with  ADOQuery1  do  
       begin  
           Close;  
           SQL.Add('select  *  from  FMC_Category  where  nodeid=:a');  
           Parameters.ParamByName('a').Value:=nodekind;  
           Open;  
           ExecSQL;  
           First;  
    等等这些代码写在递归的函数里面,因为你每次递归调用都会重复执行close open(顺便说一句,这段代码也是不规范的,select的时候不要用execsql,open就可以了)个人意见:递归用不好反而不如不用。
      

  2.   

    你的问题出在ADOQuery1上,不能用全局变量,只能用局部变量
    你每次递归的时候,ADOQuery1里的数据早就面目全非了
      

  3.   

    这种问题用递归如果数据多了会很慢的 
    你的需要定义一个TADOQuery变量 每次递归创建一个query实例
      

  4.   

    Close;  
           SQL.Add('select  *  from  FMC_Category  where  nodeid=:a');  
           Parameters.ParamByName('a').Value:=nodekind;  
           Open;  
           ExecSQL;   //把这句话去掉先,根本不需要
           First;  
      

  5.   

    procedure  TOneTwoLevelForm.LoadSubNode(snode:TTreeNode;nodekind:String);  
    var  
       subnode:TTreeNode;  
       nname,nid:String;  
       p1:Pint;  
       ADOQuery : TAdoQuery  
    begin  
       ADOQuery := TAdoQuery.Create(self);
       ADOQuery.Connection:=...; 
       with  ADOQuery1  do  
       begin  
           Close;  
           SQL.Add('select  *  from  FMC_Category  where  nodeid=:a');  
           Parameters.ParamByName('a').Value:=nodekind;  
           Open;  
           ExecSQL;  
           First;  
           while  not  eof  do  
           begin  
               nid:=FieldByName('nodeid').AsString;  
               nname:=FieldByName('description').AsString;  
               new(p1);  
               p1^.nodeid:=nid;  
               p1^.nodename:=nname;  
               subnode:=TreeView1.Items.AddChildObject(snode,nname,p1);  
               LoadSubNode(subnode,nid);  
               next;  
           end;  
       end;  
       Freeandnil(ADOQuery);
    end;  
      

  6.   

    procedure  TOneTwoLevelForm.LoadSubNode(snode:TTreeNode;nodekind:String);  
    var  
       subnode:TTreeNode;  
       nname,nid:String;  
       p1:Pint;  
       ADOQuery : TAdoQuery  
    begin  
       ADOQuery := TAdoQuery.Create(self);
       ADOQuery.Connection:=...; 
       with  ADOQuery do  
       begin  
           Close;  
           SQL.Add('select  *  from  FMC_Category  where  nodeid=:a');  
           Parameters.ParamByName('a').Value:=nodekind;  
           Open;  
           ExecSQL;  
           First;  
           while  not  eof  do  
           begin  
               nid:=FieldByName('nodeid').AsString;  
               nname:=FieldByName('description').AsString;  
               new(p1);  
               p1^.nodeid:=nid;  
               p1^.nodename:=nname;  
               subnode:=TreeView1.Items.AddChildObject(snode,nname,p1);  
               LoadSubNode(subnode,nid);  
               next;  
           end;  
       end;  
       Freeandnil(ADOQuery);
      

  7.   

    改成這樣,也還是不行,一點,程序就不動了。procedure TOneTwoLevelForm.LoadSubNode(snode:TTreeNode;nodekind:String);
    var
      subnode:TTreeNode;
      nname,nid:String;
      p1:Pint;
      ADOQuery1:TADOQuery;
    begin
      ADOQuery1:=TADOQuery.Create(self);
      ADOQuery1.Connection:=F_DMSQL.DM_SQL.UT_SORT;
      with ADOQuery1 do
      begin
        Close;
        SQL.Add('select * from FMC_Category where nodeid=:a');
        Parameters.ParamByName('a').Value:=nodekind;
        Open;
        First;
        while not eof do
        begin
          nid:=FieldByName('nodeid').AsString;
          nname:=FieldByName('description').AsString;
          new(p1);
          p1^.nodeid:=nid;
          p1^.nodename:=nname;
          subnode:=TreeView1.Items.AddChildObject(snode,nname,p1);
          LoadSubNode(subnode,nid);
          next;
        end;
      end;
      FreeAndNil(ADOQuery1);
    end;//加載01
    procedure TOneTwoLevelForm.Button1Click(Sender: TObject);
    var
      rootnode:TTreeNode;
      p1:Pint;
    begin
      new(p1);
      p1^.nodeid:='01';
      p1^.nodename:='公司';
      rootnode:=TreeView1.Items.AddChildObject(nil,'AA',p1);
      LoadSubNode(rootnode,'01');
    end;