已知一个表 Data.mdb
"ID" "PID" "FName"
1 0 "福建省"
2 0 "广东省"
3 0 "四川省"
4 1 "福州市"
5 1 "厦门市"
6 1 "泉州市"
7 2 "佛山市"
8 2 "东莞市"
9 2 "广州市"
10 3 "无锡市"
11 3 "常州市"
12 3 "苏州市"现在要用TreeViwe显示出来
福建省
 ├福州市
 ├厦门市
 ├泉州市
广东省
 ├佛山市
 ├东莞市
 ├广州市
江苏省
 ├无锡市
 ├常州市
 ├苏州市一定要用递归方式,求路思。

解决方案 »

  1.   

    转:Delphi递归加载树形(TreeView)列表<--点击这里
      

  2.   

    帮你做好了,表也建了(开始没注意,子节点的ID应该是以父节点ID为前缀,现在也懒得改了)。功能都做出来了,如图:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      Db, ADODB, ComCtrls, Grids, DBGrids;type
      TForm1 = class(TForm)
        TreeView1: TTreeView;
        ADOConnection1: TADOConnection;
        DataSource1: TDataSource;
        DBGrid1: TDBGrid;
        ADOQuery1: TADOQuery;
        procedure FormCreate(Sender: TObject);
        procedure TreeView1Deletion(Sender: TObject; Node: TTreeNode);
        procedure TreeView1Click(Sender: TObject);
      private
        { Private declarations }
        procedure SQL(strSQL: string; ADOQuery1: TADOQuery);
        procedure CreateNode(BootNode: TTreeNode);
      public
        { Public declarations }
      end;  // 定义一个结构体,内容自行添加
      NodeData = record
        ID, Name: string;
      end;  PNodeData = ^NodeData;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.SQL(strSQL: string; ADOQuery1: TADOQuery);
    begin
      ADOQuery1.Close;
      ADOQuery1.SQL.Clear;
      ADOQuery1.SQL.Add(strSQL);
      ADOQuery1.Open;
    end;procedure TForm1.TreeView1Click(Sender: TObject);
    var
      strID: string;
    begin
      //点击节点,获得ID(ID是唯一的)
      strID := PNodeData(TreeView1.Selected.Data).ID;
      MessageBox(Handle, PChar(strID), '节点的ID', MB_ICONINFORMATION);
      if TreeView1.Selected <> nil then
      begin
            ADOQuery1.Close;
            ADOQuery1.SQl.Clear;
            if TreeView1.Selected.Level = 0 then
              ADOQuery1.SQl.Add('select * from tree')
            else
              ADOQuery1.SQL.Add('select * from tree where ID like '+QuotedStr(strID)+'');
            ADOQuery1.Open;
        end
    end;procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
    begin
      Dispose(PNodeData(Node.Data));  //关闭窗口后释放内存
    end;procedure TForm1.CreateNode(BootNode: TTreeNode);
    var
      ADOQuery1: TADOQuery;
      strSQL: string;
      PChildNode: PNodeData;
      ChildNode: TTreeNode;
    begin
      ADOQuery1 := TADOQuery.Create(nil); // 创建ADOQuery1
      try
        ADOQuery1.Connection := ADOConnection1; // 连接ADOConnection1(添加的控件)
        // 用ID做条件查询记录
        strSQL := Format('select * from tree where Name <> ''中华人民共和国'' and parID = %s', [QuotedStr(PNodeData(BootNode.Data)^.ID)]);
        SQL(strSQL, ADOQuery1); // 调用
        ADOQuery1.First;
        while not ADOQuery1.Eof do
        begin
          New(PChildNode); // 分配内存(记得用完后要释放内存)
          PChildNode^.ID := ADOQuery1.FieldByName('ID').AsString; // ID
          PChildNode^.Name := ADOQuery1.FieldByName('Name').AsString; // Name
          ChildNode := TreeView1.Items.AddChildObject(BootNode, PChildNode^.Name, PChildNode); // 添加子节点
          CreateNode(ChildNode); // 开始递归
          ChildNode.Data := PChildNode; // 赋给节点的Data属性,里面存着ID、Name
          ADOQuery1.Next; // 跳转到下一条记录
        end;
      finally
        FreeAndNil(ADOQuery1); // 用完后释放并置空
      end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    var
      BootNode: TTreeNode; // 根节点
      PBootNode: PNodeData; // 根节点数据,用于存储ID
    begin
      New(PBootNode); // 分配内存
      PBootNode^.ID := '0';
      BootNode := TreeView1.Items.AddObject(nil, '中华人民共和国', PBootNode); // 添加根节点
      CreateNode(BootNode); // 开始创建子节点
      TreeView1.FullExpand; // 展开所有节点
    end;end.
    Delphi 2010环境下完好(电脑上只有D5,运行出错)。
      

  3.   


    这是运行之前,有ADOConnection1、ADOQuery1、DBGrid1、DataSource(这些控件的连接我就不说了)
      

  4.   

    20分,大家就把源码都贴出来了。
    我也来一个,看这里:http://blog.csdn.net/js0001/article/details/4377154
      

  5.   

    将ParentID排序,然后改一下算法,速度可以提高好多倍。