动态从数据表中(结构未知)读取数据,然后构成TreeView树(多级,且级数未知),望高手不吝赐教:最优算法及数据存储方法??不是最优的也行,只能给我点启示就好!希望来点完整的源代码,如果必要请发到,非常谢谢!   :)

解决方案 »

  1.   

    前些日子做了一个加载树的,Delphi7+Access 2000,给你发过去了,收一下,希望对你有些帮助
      

  2.   

    这个还可以吧
    主要是设置构成树的两个节点字段就可以了
    可以从TTreeView继承出来,生成一个新的树节点
    看看Virtual Control里面的树形组件,好快!
      

  3.   

    设置表结构:
    id
    parentidparentid与id关联起来就可以了。
      

  4.   

    直接把TreeView的方法aveToStream保存文件到数据库中,然后用LoadFromFile转载。
    呵呵。这个好像不是算法:)但是满足你的数据库表未知等要求。
      

  5.   

    //添加树状列表子节点(RefreshOrganizeTree里调用)
    procedure Tfrm_OrganizeM.AddChildNode(CurrentNode: TTreeNode) ;
    var
      ChildNode : TTreeNode;
      Q_Temp :  TADOQuery;
      NodeText ,Dep06 ,tvDepCaption: String;
    begin
      NodeText := CurrentNode.Text;
      Dep06 := Copy(NodeText,Pos('[',NodeText)+1,Pos(']',NodeText)-Pos('[',NodeText)-1);//父节点
      Q_Temp :=TADOQuery.Create(nil);
      Q_Temp.Connection := DMEnterpriseInfo.Q_DepTemp.Connection;
      Q_Temp.SQL.Add('Select Dep01,Dep02 From Dep Where Dep06 ='+ Dep06);
      Q_Temp.Open;
      if  Q_Temp.IsEmpty then
      begin
        Q_Temp.Free;
        Exit;
      end;
      while not Q_Temp.Eof do
      begin
        tvDepCaption := Q_Temp.FieldbyName('Dep02').AsString  +'['+ Q_Temp.FieldbyName('Dep01').AsString+']';
        ChildNode := tvOrganize.Items.AddChild(CurrentNode,tvDepCaption);
        AddChildNode(ChildNode);//递归调用
        Q_Temp.Next;
      end;
      Q_Temp.Free;
    end;
      

  6.   

    用TdbTreeview只要加个主ID和副ID,无无论多少级都可以啊
      

  7.   

    TO: weizi2000(秋风啊-秋的叹息)谢谢!
      

  8.   

    weizi2000(秋风啊-秋的叹息) ,能否也给我发一份?[email protected]
      

  9.   

    我一般都是给数的节点定义代码和级,如
    name1  0 root 1
      name2  00  0 2
      name3  01  0 2
        name4 010 01 3
    name5  1 root 1
      name6 10 1 2
    ..................
    也就是说第一个记录节点名称(name),第二个记录节点代码(code),第三个记录父节点代码(parent),第四个记录节点级别(grade)
    用这个函数来读入treeview:function GradeToSpace(SpaceCount: Integer): string;
    var
      I: Integer;
      S: string;
    begin
      S := ' ';
      result := '';
      if SpaceCount <> 1 then
        for I := 1 to SpaceCount - 1 do
          begin
            result := result + S;
          end;
    end;procedure DeptToText(LsQuery: TQuery; LoadView: TTreeView; LsGrade, LsName,LsCode:string);
    var
      FileId: Integer;
      f: textfile;
    begin
      FileId := FileCreate(ExtractFilePath(ParamStr(0)) + 'Dept.txt');
      FileClose(FileId);
      assignfile(f, ExtractFilePath(ParamStr(0)) + 'Dept.Txt');
      Append(f);
      with LsQuery do
        begin
          DisableControls;
          First;
          while not Eof do
            begin
              Writeln(f, GradeToSpace(FieldByName(LsGrade).asinteger)
                + FieldByName(LsName).AsString+'[' + FieldByName(lscode).AsString + ']');
             Next;
            end;
          First;
          EnableControls;
        end;
      Flush(f);
      closefile(f);
      LoadView.Items.Clear;
      LoadView.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Dept.Txt');
      DeleteFile(Pchar((ExtractFilePath(ParamStr(0)) + 'Dept.Txt')));
    end;使用时:
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      adoquery1.sql.text :='select * from tablename order by code';
      adoquery1.open;
      DeptToText(adoquery1,treeview1,'grade','name','code');
    end;