本帖最后由 chadwick 于 2012-11-26 11:35:35 编辑

解决方案 »

  1.   

    数据库的树型结构,最理想的是2个控制字段
    ID   ParentID (Name and more..)
    int  int如果ParentID=0则是顶级目录,如果ParentID>0,则归属于该ID的目录下,这样无论是显示还是调整结构都非常方便.
    显示时,
    procedure ShowToTreeView(Tree : TTreeView; ParentNode : TTreeNode; ParentID : integer);
    然后用这个函数递归,整个树就显示出来了.
      

  2.   

    给你一个数据库的部门树生成:数据库:
    AutoID  ID      Dname          ParentID leave   ShortName
    141 01 北京公司 0 1 A
    142 02 深圳公司 0 1 B
    143 03 上海公司 0 1 C
    144 0301 资讯部 03 2 F
    149 030101 硬件组 0301 3
    150 030102 软件组 0301 3
    145 04 香港公司 0 1 D
    146 05 武汉仓库 0 1 E
    {--------------------------读树-----------------------------}
    procedure TMainForm.ReadTree(tnode:TTreeNode;Fvalue: String);
    Var
    i: integer;
    Flist:TStringList;
    Flist1:TStringList;
    str,s:string;
        snode:TTreeNode;
    begin
    qryTree.close;
    qryTree.sql.clear;
    qryTree.sql.add('select did,dname,Parentid from depart where isnull(Parentid,'''')='''+Fvalue+'''  '+Fittree+' ');
    qryTree.Open;
    qryTree.First;
    Flist:=TStringList.Create;
    Flist1:=TStringList.Create;
    while not qryTree.eof do
        begin 
           Flist.Add(trim(qryTree.fieldbyname('dname').asstring));
           Flist1.Add(qryTree.fieldbyname('did').asstring);
           qryTree.next;
        end;
        
        for i:= 0 to flist.Count-1 do
        begin
           s:=flist1.Strings[i];
           str:=flist.Strings[i];
           snode:=Treeview1.items.addchild(tnode,str);
           ReadTree(snode,s);
        end;
    flist.free;
    flist1.free;
    end;
    //调用
     ReadTree(RootNode1,'0'); 
      

  3.   

    就是个递归吗,你可以参考treeview的loadfile
      

  4.   

    随机生成一棵树?只要循环扫描treeview.items,随机决定要不要对treeview.items[i].addchild
    或者先生成一个层次缩进文本,再treeview.loadfromfile(文本文件)
      

  5.   

    id, parent是可以使用构建树方法,有递归的,有非递归的,递归的效率不高,非递归的网上介绍也很多。有种使用stringlist二分查找的效率较高。