CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

为什么我添加树不成??

楼主xuren1981()2005-08-01 22:01:18 在 Delphi / VCL组件开发及应用 提问

我这段代码为什么   不能添加树啊  
  procedure   Tform1.ADDtree(AID:integer;Pnode:Ttreenode);  
  var  
      I:   Integer;  
      ANodeData:   PNodeData;  
      NewNode:   TTreeNode;  
  begin  
      with   ADOquery1   do  
          begin  
            close;  
            sql.Clear;  
            sql.Add('select*   from   tree_TABLE   where   PID=:PID');  
            parameters.ParamByName('PID').Value:=AID;  
            open;  
            for   i:=0   to   recordcount-1   do  
                begin  
                  ANodeData   :=   New(PNodeData);  
                  ANodeData^.Auto_ID:=fieldbyname('ID').AsInteger;  
                  ANodeDATA^.Parent_ID:=fieldbyname('PID').AsInteger;  
                  ANodeDATA^.caption:=fieldbyname('name').AsString;  
                  NewNode:=treeview1.Items.AddChildFirst(Pnode,name);  
                  NewNode.Data:=ANodeData;  
   
                  ADDtree(fieldbyname('ID').AsInteger,NewNode);  
                end;  
          end;  
  end;  
  procedure   TForm1.FormCreate(Sender:   TObject);  
  begin  
      AddTree(0,nil);  
  end; 问题点数:50、回复次数:26Top

1 楼loon1981(懒家伙)回复于 2005-08-01 22:22:09 得分 0

你的数据里的游标没有移动...  
  不家OPEN后先FIRST一下Top

2 楼hthunter(茫茫然时光飞逝)回复于 2005-08-01 22:26:15 得分 0

在for循环里你没有ADOquery1.Next;Top

3 楼yimibaer(别人笑我看不穿,我笑别人太疯癫)回复于 2005-08-02 08:22:45 得分 0

1,2樓正解  
  Adoquery     先first     在循環中Adoquery.next  
  Top

4 楼xuren1981()回复于 2005-08-02 09:17:54 得分 0

很感谢各位   可是改过后还是不行   添加不成,  
   
      Tpnode=record  
      ID:integer;  
      caption:string;  
      end;  
        Ptreenode=^Tpnode;  
  ..................................  
  procedure   Tform1.ADDtree(AID:integer;Pnode:Ttreenode);  
  var  
      I:   Integer;  
      ANodeData:   PNodeData;  
      NewNode:   TTreeNode;  
  begin  
      with   ADOquery1   do  
          begin  
            close;  
            sql.Clear;  
            sql.Add('select*   from   tree_TABLE   where   PID=:PID');  
            parameters.ParamByName('PID').Value:=AID;  
            open;  
   
            first;  
            for   i:=0   to   recordcount-1   do  
                begin  
                  ANodeData   :=   New(PNodeData);  
                  ANodeData^.Auto_ID:=fieldbyname('ID').AsInteger;  
                  ANodeDATA^.Parent_ID:=fieldbyname('PID').AsInteger;  
                  ANodeDATA^.caption:=fieldbyname('name').AsString;  
                  NewNode:=treeview1.Items.AddChildFirst(Pnode,name);  
                  NewNode.Data:=ANodeData  
                  ADDtree(fieldbyname('ID').AsInteger,NewNode);  
   
                  next;  
                end;  
          end;  
  end;  
  procedure   TForm1.FormCreate(Sender:   TObject);  
  begin  
      AddTree(0,nil);  
  end;  
  Top

5 楼xuren1981()回复于 2005-08-02 09:32:39 得分 0

我写错了   其中这句应该是  
    NewNode:=treeview1.Items.AddChildFirst(Pnode,   ANodeDATA^.caption);  
   
   
  可是关键好象不是在这里   我改了还是不行?那位可以指点一下啊Top

6 楼xuren1981()回复于 2005-08-02 10:55:42 得分 0

有那位可以帮我啊   急啊Top

7 楼chenxuqian(aQ)回复于 2005-08-02 11:09:45 得分 0

这问题简单啊,正确的做法是,设置断点用F8跟踪,逐步查明问题所在,  
  不能添加树,首先是书的数据又没有查出来,其次数据有了添加的过程有没有问题,  
  我讲的是方法,开始跟踪吧!!Top

8 楼xuren1981()回复于 2005-08-02 12:02:02 得分 0

我做了啊     跟踪不出来啊   怎么办  
   
  那里出错了呢Top

9 楼Johnson8021()回复于 2005-08-02 15:18:08 得分 0

ADOquery1   是全局对象,改成函数内的局部对象吧!Top

10 楼Johnson8021()回复于 2005-08-02 15:23:50 得分 0

因为你是用递归算法个,而ADOquery1   是个全局对象,每次第推调用时都把ADOquery1   原有的数据毁坏而无法回归了,在函数内定义一个局部ADO来用吧!Top

11 楼xuren1981()回复于 2005-08-02 15:47:19 得分 0

多次实验   还是不行   我又改了    
   
  Procedure   Tform1.ADDtree(AID:integer;FatherId:TtreeNode);  
  var  
      ADOQuery1:TADOquery;  
      i:integer;  
      mynode:Ttreenode;  
      myptreenode:Ptreenode;  
  begin  
      ADOQuery1:=TADOQuery.Create(self);  
        ADOQuery1.ConnectionString:='Provider=SQLOLEDB.1;Integrated   Security=SSPI;'+  
                                'Persist   Security   Info=False;Initial   Catalog=test;Data   Source=18-MDX';  
        with   ADOQuery1   do  
          begin  
              close;  
              sql.Clear;  
              sql.Add('select*   from   Tree_TABLE   where   ID=:ID');  
              parameters.ParamByName('Id').Value:=AID;  
                  open;  
                  first;  
            for   i:=0   to   recordcount-1   do  
                  begin  
                      New(myptreenode);  
   
                      myptreenode^.ID:=fieldbyname('ID').AsInteger;  
                      myptreenode^.caption:=fieldbyname('name').AsString;  
                      mynode:=Treeview1.Items.AddChild(FatherId,myptreenode^.caption);  
                      mynode.Data:=myptreenode;  
   
                      ADDtree(fieldbyname('ID').AsInteger,mynode);  
                        next;  
                  end  
          end;  
          ADOQuery1.Free;  
  end;  
   
  procedure   TForm1.FormCreate(Sender:   TObject);  
  begin  
        ADDtree(0,nil)  
  end;Top

12 楼Johnson8021()回复于 2005-08-02 16:02:37 得分 0

我觉得你这样添加树效率很低,会多次频繁地跟数据库服务器连接,而且占用内存多。Top

13 楼xuren1981()回复于 2005-08-02 16:04:22 得分 0

那应该怎样做呢?请指教!  
   
  可是我这样做不知道为什么就是不行     那里错了  
  Top

14 楼Johnson8021()回复于 2005-08-02 16:27:28 得分 0

你用这种方法有什么结果?有什么error吗??Top

15 楼xuren1981()回复于 2005-08-02 16:31:14 得分 0

没有错误提示啊   ,可以运行,但是就生成不了树,teview是空白的  
   
   
   
   
  谢谢楼上多次指点!Top

16 楼Johnson8021()回复于 2005-08-02 16:37:11 得分 0

 
  sql.Add('select*   from   Tree_TABLE   where   ID=:ID');  
              parameters.ParamByName('Id').Value:=AID;  
   
  改成这个  
   
  sql.Add('select*   from   Tree_TABLE   where   PID=:ID');  
              parameters.ParamByName('Id').Value:=AID;Top

17 楼Johnson8021()回复于 2005-08-02 16:45:28 得分 0

sql.Add('select*   from   Tree_TABLE   where   ID=:ID');  
              parameters.ParamByName('Id').Value:=AID;  
   
  改成这个  
   
  sql.Add('select*   from   Tree_TABLE   where   PID=:ID');  
              parameters.ParamByName('PId').Value:=AID;  
  Top

18 楼Johnson8021()回复于 2005-08-02 16:49:45 得分 0

不可能是空白的吧,至少可以添加一个节点。Top

19 楼xuren1981()回复于 2005-08-02 16:56:46 得分 0

好像还是不行啊     sql.Add('select*   from   Tree_TABLE   where   ID=:ID');  
                                      parameters.ParamByName('Id').Value:=AID;  
   
  ID=:ID');   后一个ID是参数   ParamByName('Id')     所以这里应该是ID   才对啊Top

20 楼xuren1981()回复于 2005-08-02 16:58:05 得分 0

一个节点都没有啊   不知道怎么回事     找不到出毛病   郁闷了Top

21 楼Johnson8021()回复于 2005-08-02 17:06:41 得分 25

哦,我看错了!  
  应该是  
  sql.Add('select*   from   Tree_TABLE   where   PID=:ID');  
              parameters.ParamByName('Id').Value:=AID;  
   
  不知道你数据表里的PID和ID是怎样组织的??Top

22 楼xuren1981()回复于 2005-08-02 17:28:06 得分 0

ID   PID     name  
  1     0         总公司  
  2     1         软件部  
  3     1       办公室  
  4     2       meriko  
   
  是这样的Top

23 楼loon1981(懒家伙)回复于 2005-08-02 23:38:54 得分 0

这是前几天发的一个贴我把他贴过来了.你自己慢慢对一下吧.  
  MENUID           NENUNAME       parents_name  
  00                   在职员工         NULL  
  0001               生管部           在职员工  
  000101           小海盗           生管部  
  第一个为他的ID   第一个为节点的名称.第三个存的是他父节点的名称  
  parents_name字段存放的是他父节点的名称.  
  //------------------------------创建树BEGIN----------------------------------  
  //调用的时候传入一个树形控件的名称  
  procedure   TFrm_Set_Power.CreateNavigationTree(tvThis:TTreeView);  
   
  Var  
    sqlstr:String;  
    myQ,Child:TAdoQuery;  
    sqlstr2:String;  
    i:integer;  
  Begin  
  i:=0;  
  tvThis.Items.Clear();  
  myQ:=TadoQuery.Create(self);  
  myQ.ConnectionString:=Frm_Main_Menu.ADOConnection1.ConnectionString;  
  myQ.Close();  
  myQ.SQL.Clear();  
   
                  sqlstr     :=   'Select   menuid,MenuName   menuname,MenuUrl   menuurl,SetParameters   menuparam   From   T_SysMenuInfo   menu';  
                  sqlstr:=   sqlstr+'   where   parents_name='   ;  
                  sqlstr:=   sqlstr+'''''';  
                  sqlstr:=   sqlstr+'   Order   By   MenuId'   ;  
   
    myQ.Close();  
    myQ.SQL.Clear();  
    myQ.SQL.Add(sqlstr);  
    myQ.Open();  
    myQ.First();  
    While   not   myQ.Eof   do  
      Begin  
        tvThis.Items.Add(tvThis.Selected,myQ.FieldByName('menuname').AsString);  
            begin  
                Child:=tAdoQuery.Create(Self);  
                Child.ConnectionString:=Frm_Main_Menu.ADOConnection1.ConnectionString;//'Provider=SQLOLEDB.1;Integrated   Security=SSPI;Persist   Security   Info=False;User   ID=sa;Initial   Catalog=WORK;Data   Source=sbsever';  
   
                              sqlstr2:='Select   menuid,MenuName   menuname,MenuUrl   menuurl,SetParameters   menuparam   From   T_SysMenuInfo   menu';  
                              sqlstr2:=   sqlstr2+'   where   parents_name='   ;  
                              sqlstr2:=   sqlstr2+''''+myQ.FieldByName('menuname').AsString+'''';  
                              sqlstr2:=   sqlstr2+'   Order   By   MenuId'   ;  
                 
            Child.Close();  
            Child.SQL.Clear();  
            Child.SQL.Add(sqlstr2);  
            Child.Open();  
            Child.First();  
          for   i:=i   to   tvThis.Items.Count-1     do  
                    if     tvThis.items.Item[i].Text=myQ.FieldByName('menuname').AsString   then  
              begin  
                While   not   Child.Eof   do  
                Begin  
                    tvThis.Items.AddChild(tvThis.items.Item[i],Child.FieldByName('menuname').AsString);  
                    Child.Next;  
                End;  
                Child.Free;  
                break;  
            END;  
      end;  
        i:=i+1;  
    myQ.Next;  
    End;  
    myQ.Free();  
    sqlstr:='';  
    sqlstr2:='';  
  End;  
  //-------创建树END-----  
  Top

24 楼loon1981(懒家伙)回复于 2005-08-03 00:01:47 得分 25

你PID为0的时候就为一个根结点吗?如果是这样看下面的代码吧.  
  我把上面发的修改了一下应该可以的.你自己再调试一下吧.?  
  //调用的时候传入一个树形控件的名称  
   
  procedure   TFrm_Set_Power.CreateNavigationTree(tvThis:TTreeView);  
   
  Var  
    sqlstr:String;  
    myQ,Child:TAdoQuery;  
    sqlstr2:String;  
    i:integer;  
  Begin  
  i:=0;  
  tvThis.Items.Clear();  
  myQ:=TadoQuery.Create(self);  
  myQ.ConnectionString:=Frm_Main_Menu.ADOConnection1.ConnectionString;//你用的ADOQUERY修改此处的连接字符串  
  myQ.Close();  
  myQ.SQL.Clear();  
   
                  sqlstr     :=   'Select   id,pid,name   From   Tree_TABLE   ';  
                  sqlstr:=   sqlstr+'   where   PID=0'   ;                  
                  sqlstr:=   sqlstr+'   Order   By   Id'   ;  
   
    myQ.Close();  
    myQ.SQL.Clear();  
    myQ.SQL.Add(sqlstr);  
    myQ.Open();  
    myQ.First();  
    While   not   myQ.Eof   do  
      Begin  
        tvThis.Items.Add(tvThis.Selected,myQ.FieldByName('name').AsString);  
            begin  
                Child:=tAdoQuery.Create(Self);  
                Child.ConnectionString:=Frm_Main_Menu.ADOConnection1.ConnectionString;//你用的ADOQUERY修改此处的连接字符串  
   
   
                              sqlstr2:=sqlstr     :=   'Select   id,pid,name   From   Tree_TABLE   ';  
                              sqlstr2:=   sqlstr2+'   where   PID='   ;  
                              sqlstr2:=   sqlstr2+''''+myQ.FieldByName('Id').AsString+'''';  
                              sqlstr2:=   sqlstr2+'   Order   By   Id'   ;  
                 
            Child.Close();  
            Child.SQL.Clear();  
            Child.SQL.Add(sqlstr2);  
            Child.Open();  
            Child.First();  
          for   i:=i   to   tvThis.Items.Count-1     do  
                    if     tvThis.items.Item[i].Text=myQ.FieldByName('name').AsString   then  
              begin  
                While   not   Child.Eof   do  
                Begin  
                    tvThis.Items.AddChild(tvThis.items.Item[i],Child.FieldByName('name').AsString);  
                    Child.Next;  
                End;  
                Child.Free;  
                break;  
            END;  
      end;  
        i:=i+1;  
    myQ.Next;  
    End;  
    myQ.Free();  
    sqlstr:='';  
    sqlstr2:='';  
  End;  
  //-------创建树END-----  
  Top

25 楼xuren1981()回复于 2005-08-03 10:34:31 得分 0

是我自己的原因   现在弄好了   感谢懒家伙和jonohsonTop

26 楼xuren1981()回复于 2005-08-03 10:37:10 得分 0

是我自己的原因   现在弄好了    
  感谢懒家伙和jonohson!!Top

相关问题

  • 为什么添加的子菜单没有添加成功?
  • 为什么添加拨号网络不成功?
  • 我在项目管理中为什么添加引用会不成功
  • 快发疯了,为什么添加总是不成功,帮帮我啊!!!!
  • 给控件添加数据成员时,单选扭为什么不可选
  • 为什么我不能添加数据?
  • 为什么回自动添加文件》??
  • 为什么添加不了啊!asp.net(vb)
  • 为什么数据库添加成功了,可页面(html)没有出来(ie不停的转)???
  • pb6.5生成的数据窗口 添加一个字段后 不能修改 为什么?

关键词

  • 节点
  • 数据
  • adoquery
  • anodedata
  • myptreenode
  • parambyname
  • myq
  • aid
  • addtree
  • 添加

得分解答快速导航

  • 帖主:xuren1981
  • Johnson8021
  • loon1981

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo