我创树的思想是把一级节点先查询出来,然后就用一个过程一个一个的往下面找子节点
 
我的数据结构是table name: PlatformUserTreeNodeId   TreeNode  ParentNode NodeName
-------------------------------------
1 0  NULL  用户树  
2 001  0  生产技术部
3 002  0  送电处
4 003  0  变电处
5 004  0  信息中心
6 005  0  调度所
7 006  0  人事劳动部
8 006001  006  社保办
9 006001001  006001  医保
10 002001  002  大柳塔保线站
11 002002  002  神东保线站 
代码如下:
...procedure TForm1.AddNode(NodeId: String;ParentNode: TTreeNode);
var
  node: TTreeNode;
begin  with  ADOQuery2 do begin
    Close;
    SQL.Clear;
    SQL.Add(Format('select * from PlatformUserTree where ParentNode = ''%S''',[NodeId]));
    Open;
    while not eof do begin
      node := TreeView1.Items.AddChild(ParentNode,FieldByName('NodeName').AsString);
      AddNode(FieldByName('TreeNode').AsString,node);
      next;
    end;
  end;end;
procedure TForm1.Button1Click(Sender: TObject);
var
  RootNode,ChildNode: TTreeNode;
  Nodes: String;
begin
  TreeView1.Items.Clear;
  RootNode := TreeView1.Items.Add(nil,'组织机构树') ;
  RootNode.SelectedIndex := 0;
  with ADOQuery1 do begin
    SQL.Clear;
    SQL.Add('select * from PlatformUserTree where ParentNode = ''0'' order by TreeNode');
    Open;
    while not eof do
    begin
      ChildNode := TreeView1.Items.AddChild(RootNode,FieldByName('NodeName').AsString);
      Nodes  := FieldByName('TreeNode').AsString;
      AddNode(Nodes, ChildNode);
      next;
    end;
  end;
  TreeView1.TopItem.Expanded := True;
end;如果一个节点下面有多个子节点,那么只能出现第一条记录的节点,例如:002下面有两个节点,只能出现002001  002  大柳塔保线站这个节点,另外一个节点选择不出来,因为ADOQuery2 的SQL语句又被重新更新了,请问大虾们怎么解决这个问题,谢谢

解决方案 »

  1.   

    AddNode函数里不能用ADOquery2,递归下去后ADOquery2的内容就变了。
    定义一个变量,进去的时候创建好了
    procedure TForm1.AddNode(NodeId: String;ParentNode: TTreeNode);
    var
      node: TTreeNode;
      adqTemp: TADOQuery;
    begin
      adqTemp := TADOQuery.Create(Self);
      try
      with  adqTemp do begin
        Close;
        SQL.Clear;
        SQL.Add(Format('select * from PlatformUserTree where ParentNode = ''%S''',[NodeId]));
        Open;
        while not eof do begin
          node := TreeView1.Items.AddChild(ParentNode,FieldByName('NodeName').AsString);
          AddNode(FieldByName('TreeNode').AsString,node);
          next;
        end;
      end;
      finally
        adqTemp.Free;
      end;
    end;
      

  2.   

    问题出在ADOQuery2这个变量的作用域上。
    你目前的程序中ADOQuery2是个全局变量,而在你的递归函数AddNode中却要求ADOQuery2应该是个局部变量。
      

  3.   

    修改成:
    procedure TForm1.AddNode(NodeId: String;ParentNode: TTreeNode);
    var
      node     : TTreeNode;
      ADOQuery : TADOQuery;
    begin
      ADOQuery := TADOQuery.Create(Self);
      with ADOQuery do
      begin
        Close;
        SQL.Clear;
        SQL.Add(Format('select * from PlatformUserTree where ParentNode = ''%S''',[NodeId]));
        Open;
        while not eof do 
        begin
          node := TreeView1.Items.AddChild(ParentNode,FieldByName('NodeName').AsString);
          AddNode(FieldByName('TreeNode').AsString,node);
          next;
        end;
      end;
      ADOQuery.Free;
    end;
      

  4.   

    如是这样,那就重新创建一个adoquery不就可以了吗?
      

  5.   

    不过还有个问题就是,就算是个局部变量,在递归的时候是不是每次都重新创建一个ADOQuery对象。
    谢谢大侠指导。。
      

  6.   

    问:不过还有个问题就是,就算是个局部变量,在递归的时候是不是每次都重新创建一个ADOQuery对象。答:是的。