当前位置:首页
开发技术指南» 文章正文
    引言:
 

 

    摘要: 有些出入啊 请问这是什么原因啊? ......
    摘要: 只会做二值图,呵呵。 ......


用递归的方法建树的问题,up者有分

程序如下:结果是递归时一遍以后返回上一个循环时结果集QryTmptype没有结果了,造成只有一个循环到底的树,请大家分析一下  
      PNodeInfo=^TNodeInfo;         //指针类型,存储对应节点信息  
          TNodeInfo=Packed   Record  
                NodeId:String;                 //节点  
                NodeName:string;             //节点名称  
                ParentId:string;             //父节点  
          end;  
   
  procedure   TForm1.CreateTree(Id:   integer;   ParentNode:   TTreeNode   ;DTree:TTreeView);  
  var  
          MyNode:TTreeNode;  
          TmpNodeInfo:PNodeInfo;  
  begin  
          //QryTmp前面已定义  
          QryTmp.SQL.Clear;  
          QryTmp.SQL.Add(Select   id,code,name   From   directory);  
          qrytmp.sql.add(   where   code=+IntToStr(Id)+   Order   by   Id);  
          QryTmp.Open;  
          MyNode:=nil;  
          while   not   QryTmp.Eof   do  
          begin  
              New(TmpNodeInfo);  
              TmpNodeInfo.Nodeid:=Trim(QryTmp.Fields[0].AsString);  
              TmpNodeInfo.Parentid:=Trim(QryTmp.Fields[1].AsString);  
              TmpNodeInfo.Nodename:=Trim(QryTmp.Fields[2].AsString);  
              MyNode:=DTree.Items.AddChildObject(ParentNode,QryTmp.Fields[2].AsString,TmpNodeInfo);     //把所有节点当作子节点遍历  
              CreateTree(QryTmp.Fields[0].AsInteger,MyNode,dtree);   //递归调用  
              QryTmp.Next;  
          end;  
   
       
  end;

NO.1   作者: mib3000

学习  
  up

NO.2   作者: sanyixu2002

不会,UP!

NO.3   作者: underwolf

SORRY我是初学者!  
  不过帮你UP

NO.4   作者: IORILI

你上面的程序在进行调用程序本身的时候,qrytmp的结果就发生了改变。  
  如果想用递归的话,你要再procedure   TForm1.CreateTree(Id:   integer;   ParentNode:   TTreeNode   ;DTree:TTreeView);加一个实参,类型是tcustomadodatase,然后在递归过程中调用不同的query控件进行查询。  
  下面是一个不是用递归做出来的建树的例子:  
  procedure   Tcpya_app.FormCreate(Sender:   TObject);  
  begin  
      datamodule2.tree.close;  
      datamodule2.tree.sql.clear;  
      datamodule2.tree.sql.add(select   name   from   plat   order   by   name);  
      datamodule2.tree.Active:=true;  
      datamodule2.tree.Open;  
      while   not   datamodule2.tree.Eof   do  
          begin  
            with   tv.Items   do  
      begin  
            MyTreeNode1   :=   Add(nil,trim(datamodule2.tree.fields[0].asstring));  
              with   datamodule2   do  
              begin  
                child.close;  
                child.SQL.Clear;  
                child.SQL.Add(select   comp   from   dalei   where   plat=+Trim(datamodule2.tree.Fields[0].asstring)++   order   by   comp);  
                child.Active:=true;  
                child.Open;  
                While   Not   child.Eof   do  
                begin  
                          TV.Items.AddChild(mytreenode1,trim(child.Fields[0].AsString));  
                          child.Next;  
                          end;   end;  
                datamodule2.tree.Next;  
        end;  
        end;  
  end;

NO.5   作者: rwdx

procedure   Tf_dselect.FormShow(Sender:   TObject);  
  var  
      ss:   String;  
      i:   Integer;  
  begin  
      try  
          Cq(aq1);  
          Cq(aq2);  
          aq1.Connection:=   d_dbs.Ac;  
          aq2.Connection:=   d_dbs.Ac;  
          aq1.SQL.Add(select   *   from   dept);  
          aq2.SQL.Add(select   *   from   dept);  
          aq1.Open;  
          aq2.Open;  
          while   not   aq1.Eof   do   begin  
              ss:=   aq1.FieldByName(d_upid).AsString;  
              if   (ss   <>   D00000)   and   (aq1.Lookup(d_id,   ss,   d_id)   =   NULL)   then   aq1.Delete   else   aq1.Next;  
          end;  
          aq1.Connection:=   nil;  
          aq2.Connection:=   nil;  
          ss:=   D00000;  
          tv.Items.Clear;  
          with   aq1   do   begin  
              if   RecordCount   <   1   then   Exit;  
              First;  
              while   not   Eof   do   begin  
                  if   FieldByName(d_upid).AsString   =   ss   then   begin  
                      tv.Items.AddChild(tv.Selected,   FieldByName(d_name).AsString);  
                      Delete;  
                  end  
                  else   Next;  
              end;  
              while   RecordCount   >   0   do   begin  
                  for   i:=   0   to   tv.Items.Count   -   1   do   begin  
                      tv.Items[i].Selected:=   True;  
                      ss:=   aq2.Lookup(d_name,   tv.Selected.Text,   d_id);  
                      if   ss   =   NULL   then   break;  
                      First;  
                      while   not   Eof   do   begin  
                          if   FieldByName(d_upid).AsString   =   ss   then   begin  
                              tv.Items.AddChild(tv.Selected,   FieldByName(d_name).AsString);  
                              Delete;  
                          end  
                          else   Next;  
                      end;  
                  end;  
              end;  
          end;  
          for   i:=   tv.Items.Count   -1   downto   0   do   tv.Items[i].Selected:=   True;  
      except  
          on   E:   Exception   do   sLogAdd(E,   self.Name   +   .FormShow,   E.Message);  
      end;  
      Cq(aq1);  
      Cq(aq2);  
  end;  
   
   
  aq1,aq2为tadoquery控件

NO.6   作者: gdfd

不是太清楚不过你每次都Clear那么递归返回后的Next应该会无用了把……

NO.7   作者: IORILI

加一个实参,类型是tcustomadodataset,它可以是table、也可以是query

NO.8   作者: zjadmin

因为树每一层需要有一个独立的query,你的QryTmp因是即使动态create   一个新的而不是像你的只得一个。  
 

NO.9   作者: tiexinliu

看看我写的,没有问题,也是递归.  
  procedure   Tcustomer_treefrm.CreateSubTree_all(FNodeName:   string;   Node:   TTreeNode   =   nil);  
  var  
      mLocalName:   string;  
      TreeNode:   TTreeNode;  
      Ads_Tmp:   Tclientdataset;  
      p:pstr;  
  begin  
      ADS_Tmp   :=   Tclientdataset.Create(Self);  
      ADS_Tmp.RemoteServer:=mainfrm.SocketConnection1;  
        ADS_Tmp.ProviderName:=datasetprovider3;  
      with   ADS_Tmp   do  
      begin  
          Close;  
          CommandText   :=QUERY_customer_By_Parent_No_sec   ++FNodeName++,++userid+;;  
          Open;  
          First;  
          while   not   Eof   do  
          begin  
              mLocalName   :=   FieldbyName(ID).Asstring;  
              new(p);  
              p^:=mlocalName;  
              TreeNode   :=self.tv_zb.Items.AddChildObject(Node,   FieldByName(Name).AsString,p);  
              CreateSubTree_all(mLocalName,   TreeNode);  
              Next;  
          end;  
      end;  
      Ads_Tmp.Free;  
  end;

NO.10   作者: tiexinliu

pstr=^string;

NO.11   作者: mazhanjun

高人

NO.12   作者: wuyunhong

up   接分~

NO.13   作者: qly_1314

学习,up

NO.14   作者: coreblood

http://www.csdn.net/Develop/Read_Article.asp?Id=13651  
   
   
  看这个很好用

NO.15   作者: Devlopered

学习

NO.16   作者: yangxjn

up

NO.17   作者: dickeybird888

你的程序中每曾分支都只循环了一次!

NO.18   作者: wzds2000

学习,顶。。。

NO.19   作者: dengyueguang

学习

NO.20   作者: dulei115

up

NO.21   作者: bw110323

up,学习

NO.22   作者: xiaoyuer0851

呵呵,高手,     不过呢?  
  我有个建议,    
  对于编写高效率的程序而言,一般情况最好不要使用递归和那种不能够确定循环次数的   循环,因为这样容易出现未知的………………

NO.23   作者: dicke

UP,学习中

NO.24   作者: mxk19791116

不太好说。

NO.25   作者: noil0125

学习

NO.26   作者: chenwc

看来我不出手没人能发现这个问题了!!!!!!!!!!!!!!  
   
  在代码的最后一个end之前加上QryTmp.Free;  
  OK

NO.27   作者: xiaofei7569

学习。

NO.28   作者: aiunong

study   and   up


    摘要: 如何将64位long转化位8位byte,急,解决,马上给分! ......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE