我通过指定每个结点的父结点来动态生成一颗自顶向下的树,当结点的编号是从0 开始然后按添加顺序递增时,可以通过运行,可删除某一结点,使原来的递增序列出现断点,从而出现错误,老是提示 Invalid index ,希望各位高手们帮帮忙!我的代码:
procedure TForm1.PopulateTreeView;
var
 parentnode,sonnode,treenode:TTreenode;
 i:Integer;
begin
 tvwFolders.Items.Add(self.tvwFolders.TopItem,'人员权限总栏:');
 ADOQuery1.Close;
 ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Add('Select  * from T_树结点表 ');
 ADOQuery1.Prepared:=True;
 ADOQuery1.Open;
 ADOQuery1.First;
 
 while not ADOQuery1.Eof do  //如果未到达最后一项,执行循环
  begin
    i := ADOQuery1.FieldByName('父结点编号').AsInteger; tvwFolders.Items[i].Selected:=True;  ------->提示这行有问题!!!  tvwFolders.Items.AddChild(tvwFolders.Selected, ADOQuery1.fieldbyname('基本权限').AsString) ;   ADOQuery1.Next;
  end;end;谢谢了! 希望得到你的可行的方法,先行谢过!  在线等.....

解决方案 »

  1.   

    i := ADOQuery1.FieldByName('父结点编号').AsInteger; tvwFolders.Items[i].Selected:=True;  ------->提示这行有问题!!!你拿父节点的编号来做索引值,不对吧!
      

  2.   

    代码请看:http://tb.blog.csdn.net/TrackBack.aspx?PostId=1587543
      

  3.   

    谢谢 chenzhuo(睡到自然醒),已经解决!
    盗用 QSmile(RedFox)兄的代码!
    谢谢了二位
    procedure   TfrmDepartEmp.BuildTree;   
      var   
          tNode   :TTreeNode;   
      begin   
          if   dsDept.Active   then   dsDept.Close;   
        
          dsDept.CommandText   :=   'select   *   from   Departments';   
          dsDept.Open;   
          tNode   :=   treeDept.Items.AddChild(nil,'公司人员权限');   
          tNode.Data   :=   Pointer(0);   
          tNode.ImageIndex   :=   0;   
          tNode.SelectedIndex   :=   1;   
          TreeMe(tNode);   
      end;   
        
      procedure   TfrmDepartEmp.TreeMe(tNode:   TTreeNode);   
      var   
          ParentID   :   Longint;   
          childNode   :   TTreeNode;   
      begin   
          ParentID   :=   Integer(tNode.Data   );   
          dsDept.First;   
          while   not   dsDept.Eof   do   
          begin   
              if   dsDept.FieldByName('父结点编号').AsInteger   =   ParentID   then   
              begin   
                    childNode   :=   TreeDept.Items.AddChild(tNode,   
                                        dsDept.FieldByName('基本权限').AsString);   
                    childNode.Data   :=   Pointer(dsDept.FieldByName('树结点编号').AsInteger);   
                    childNode.ImageIndex   :=   0;   
                    childNode.SelectedIndex   :=   1;   
                    //TreeMe(childNode);   
              end;   
              dsDept.Next;   
          end;   
        
          childNode   :=   tNode.getFirstChild;   
          while   childNode   <>   nil   do   
          begin   
                TreeMe(childNode);   
                childNode   :=   childNode.getNextSibling;   
          end;   
        
      end;