提供给你参考:
http://www.csdn.net/expert/topic/688/688364.xml?temp=4.366702E-02

解决方案 »

  1.   

    我程序里的一段,不知对你有没有用:
    procedure TForm5.LoadTreeView;
    var
      strsql:string;
    begin
      try
        strsql:='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;
      

  2.   

    function DataSetToTreeNode(mDataSet: TDataSet;
      mFieldNameParent: string; //父节点标识字段名
      mFieldNameTreeText: string; //节点文本字段名
      mFieldNameTreeId: string; //节点标识字段名
      mTreeView: TTreeView; mTreeNode: TTreeNode;
      mParentText: string): Boolean;
    var
      vTreeNode: TTreeNode;
      vFieldValues: Variant;
      vFieldNames: string;
    begin
      Result := False;
      if not Assigned(mDataSet) then Exit;
      if not Assigned(mTreeView) then Exit;
      if not mDataSet.Active then Exit;
      vFieldNames := Format('%s;%s;%s',
        [mFieldNameParent, mFieldNameTreeText, mFieldNameTreeId]);
      mDataSet.Filtered := False;
      mDataSet.Filter := Format('%s=%s', [mFieldNameParent, QuotedStr(mParentText)]);
      mDataSet.Filtered := True;
      if mDataSet.RecordCount = 0 then Exit;
      mDataSet.First;
      while not mDataSet.Eof do begin
        vTreeNode := mTreeView.Items.AddChild(mTreeNode,
          mDataSet.FieldByName(mFieldNameTreeText).AsString);
        vFieldValues := mDataSet[vFieldNames];
        DataSetToTreeNode(mDataSet, mFieldNameParent, mFieldNameTreeText,
          mFieldNameTreeId, mTreeView, vTreeNode,
          mDataSet.FieldByName(mFieldNameTreeID).AsString);
        ///////Begin 恢复位置
        mDataSet.Filtered := False;
        mDataSet.Filter := Format('%s=%s', [mFieldNameParent, QuotedStr(mParentText)]);
        mDataSet.Filtered := True;
        mDataSet.Locate(vFieldNames, vFieldValues, []);
        ///////End 恢复位置
        mDataSet.Next;
      end;
      Result := True;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      TreeView1.Items.Clear;
      DataSetToTreeNode(Table1, 'UpperTreeId', 'TreeName', 'TreeId',
        TreeView1, nil, 'NULL');(*//你用此调试
      DataSetToTreeNode(Table1, 'parent_id', 'id', 'id', TreeView1, nil, 'NULL');
    //*)
    end;
      

  3.   

    //参考
    http://kingron.myetang.com/zsfunc19.htm
      

  4.   

    到51Delphi找DevExpress DBTree有100%的源代码和例子!
      

  5.   

    你可以用WOLL2WOLL的1STCLASS控件,里面有了个DBTREEVIEW,完全实现树的功能,并且可控制性比TREEVIEW更强,编程更方便。