unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,db,
  ComCtrls, StdCtrls, Buttons, ADODB, ImgList;type
  TForm1 = class(TForm)
    TreeView1: TTreeView;
    BitBtn1: TBitBtn;
    ADOConnection1: TADOConnection;
    ADODataSet1: TADODataSet;
    ImageList1: TImageList;
    ADOQuery1: TADOQuery;
    procedure BitBtn1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    procedure DataSetToTreeView(DataSet: TDataSet; var TreeView: TTreeView; NodeRoot: string);
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.DFM}//==============================================================================
//数据集解构成树****************************************************************
//==============================================================================
procedure Tform1.DataSetToTreeView(DataSet: TDataSet; var TreeView: TTreeView; NodeRoot: string);
var Nodes: array of TTreeNode;
    Strs: array of string;
    i: integer;
begin
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  with DataSet do
  begin
    Close;
    Open;
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    SetLength(Nodes, FieldCount+1);
    SetLength(Strs, FieldCount);
    Nodes[0] := TreeView.Items.AddChild(nil, NodeRoot);
    for i:=Low(Strs) to High(Strs) do Strs[i] := #255;
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    First;
    while not Eof do
    begin
      for i:=Low(Strs) to High(Strs) do
        if Strs[i]<>Fields[i].AsString then
        begin
          Strs[i] := Fields[i].AsString;
          Nodes[i+1] := TreeView.Items.AddChild(Nodes[i],Fields[i].AsString);
        end;
      Next;
    end;
    Close;
  end;
end;procedure TForm1.BitBtn1Click(Sender: TObject);
begin
datasettotreeview(adodataset1,treeview1,'a');
end;

解决方案 »

  1.   

    看看我的例子
    http://www.csdn.net/expert/topic/675/675849.xml?temp=.4498712
    其中
    //-------------------------------------------------------------------------
    //  本子程式为添充TREEVIEW菜单树的子程序。
    //  结点.TEXT 为MENU_FILE中的MENU_NAME字段.
    //  结点.DATA 为指向一个记录类型.它包括MENU_FILE中一条记录的所有信息.
    //-------------------------------------------------------------------------
    procedure tmainfrm.filltree(midnode:ttreenode;midfilter:integer);
    var
      curmidnode:ttreenode;
      count:integer;
      Pcurrec:pmenu_file;
    begin
      dmshare.TVmenuQry.filter:='PARENT_ID='+inttostr(midfilter);
      dmshare.TVmenuQry.filtered:=true;
      dmshare.TVmenuQry.First;
      count:=0;
      while count<dmshare.TVmenuQry.RecordCount do
        begin
          inc(count);
          new(pcurrec);
          pcurrec^.MENU_NODEID :=dmshare.TVmenuQry.fieldbyname('MENU_NODEID').asinteger;
          pcurrec^.MENU_NAME :=dmshare.TVmenuQry.fieldbyname('MENU_NAME').asstring;
          pcurrec^.PARENT_ID :=dmshare.TVmenuQry.fieldbyname('PARENT_ID').asinteger;
          pcurrec^.REMARK :=dmshare.TVmenuQry.fieldbyname('REMARK').asstring;
          pcurrec^.MENU_PACKAGE :=dmshare.TVmenuQry.fieldbyname('MENU_PACKAGE').asstring;
          if  midnode=nil   then
            curmidnode:=TVmenu.Items.addobject(nil,pcurrec^.MENU_NAME,pcurrec)
          else
            curmidnode:=TVmenu.Items.addchildobject(midnode,pcurrec^.MENU_NAME,pcurrec);
            curmidnode.selectedindex:=0;
            curmidnode.ImageIndex :=1;
            dmshare.TVmenuQry.Next;
        end;end;
      

  2.   

    procedure TForm5.LoadTreeView;
    var
      strsql:string;
    begin
      trystrsql:='select * from T where NodeType="bs"';
        DQ.Active :=false;
        DQ.SQL.Clear ;
        DQ.SQL.Add(strsql);
        DQ.Active :=true;
        DQ.Filtered :=true;
        DQ.Filter := 'Parent=0';
        U_DiGui(0,RzTreeView1.TopItem );//从当前0层开始递归建树
      except
        showmessage('字典里没有数据!');
      end;
    end;
    procedure TForm5.U_DiGui(parentID:Cardinal;ParentNode:TTreeNode);
    var
      tmpTBData:array of TableData;
      i,j:integer;
      tmpNode:TTreeNode;begin
      j:=DQ.RecordCount;
      setlength(tmpTBData,j);//保存递规上一层结点值
      for i:=0 to j-1 do begin
        tmpTBData[i].ID := Cardinal(DQ.fieldbyname('ID').value);
        tmpTBData[i].Name  := DQ.fieldbyname('Name').value;
        tmpTBData[i].ParentID  := Cardinal(DQ.fieldbyname('Parent').value);
        DQ.Next;
      end;
      for i:=0 to j-1 do begin //递规调用建立所有结点
        tmpNode:=RzTreeView1.Items.AddChild(ParentNode,tmpTBData[i].Name);
     //   tmpNode.ImageIndex:=2;
        new(pData);
        pData^.ID:=tmpTBData[i].ID;
        tmpNode.Data:=pData;
        DQ.Filter := 'Parent=' + IntToStr(Integer(tmpTBData[i].ID));
        if DQ.RecordCount >0 then begin
          U_DiGui(tmpTBData[i].ID,tmpNode );
        end;
      end;
    end;procedure TForm5.FormShow(Sender: TObject);
    begin
      LoadTreeView;
      rzTreeView1.TopItem.Expanded:=true;
    end;