头大不会用树型控件请指教!

解决方案 »

  1.   

    http://community.csdn.net/Expert/topicview.asp?id=3095462
      

  2.   

    可用递归算法
    procedure CreateTree(AId: integer; FatherNode: TTreeNode);
    var
      QryTmp: TADOQuery;
      myNode: TTreeNode;
    begin
      QryTmp := TADOQuery.Create(self);
      QryTmp.Connection:=alldata.AdoConn;
      QryTmp.SQL.Add('select * from t_Item');
      QryTmp.SQL.Add('where FParentID=' + inttostr(AId));
      QryTmp.Open;
      while not QryTmp.Eof do
      begin
        myNode := CategoryTree.Items.AddChild(FatherNode,QryTmp.fieldbyname('FName').AsString);
        myNode.StateIndex:=QryTmp.FieldByName('FitemId').AsInteger;
        CreateTree(QryTmp.fieldbyname('FitemId').AsInteger, myNode); //递归调用过程
        QryTmp.Next;
      end;
      QryTmp.Free;
    end;
    或者用第三方空间DBTree
      

  3.   

    能否帮忙顶一下?
    http://community.csdn.net/Expert/topic/3095/3095447.xml?temp=.3237879
      

  4.   

    帮你顶一下吧!
    现在有好多DBTreeview的,连接非常方便,可以去下载的
    帮你贴篇文章,你可以参考
    一. 如何初始化一个TreeView? 
    弄一个窗口,放上一个TreeView和一个Button,分别取名为TV1和Btn1。如果需要 
    在每个节点前有个图,请在窗口上放上一个ImageList,取名为ImageList1,双击 
    它,加入六个图标。还要记得记得将TV1的Images属性改为ImageList1噢。双击按 
    钮Btn1,在里面填入以下代码,然后按F9运行,点击Btn1就可以看到效果了。 
    procedure TForm1.Btn1Click(Sender: TObject); 
    Const 
    MyDocDir = 'C:\My Documents'; 
    PersonDir = '3hSoft'; 
    Var 
    Var 
    I : Word; 
    SubNodeName : array [1..5] of ShortString; 
    RootNode, SubNode : TTreeNode; 
    P : PString; 
    begin 
    SubNodeName[1] := '便笺'; 
    SubNodeName[2] := '发件箱'; 
    SubNodeName[3] := '联系人'; 
    SubNodeName[4] := '任务'; 
    SubNodeName[5] := '日记'; 
    TV1.Items.Clear; 
    TV1.Items.BeginUpdate; 
    New(P); 
    P^ := MyDocDir + '\' + PersonDir; 
    RootNode := TV1.Items.AddObject(Nil, '个人文件夹', P); 
    // 此 Node 的图标已对 Images 属性中取第 0 个了。 
    For I := 1 to 5 do 
    begin 
    New(P); 
    P^ := MyDocDir + '\' + PersonDir + '\' + SubNodeName[I]; 
    SubNode := TV1.Items.AddChildObject(RootNode, SubNodeName[I], P) 


    // 如果不想使用图标的话请删除以下两行 
    SubNode.ImageIndex := I; 
    SubNode.SelectedIndex := I; 
    end; 
    TV1.Items.EndUpdate; 
    end; 
    二.在TreeView中如何设置选中结点 
    var 
    i:integer; {i为设置的选中结点的索引值} 
    begin 
    if i>treeview1.items.count then 
    treeview1.items[i].selected:=true; 
    或 
    treeview1.selected:=treeview1.items[i]; 
    三。设置TreeView结点的图形 
    1. 设置TreeView的images属性为已存在的images对象 
    treeview1.images:=imagelist1; 
    2. 在加入结点后执行: 
    var 
    anode:TTreeNode; 
    begein 
    anode:=Treeview1.add(nil,'item1'); 
    anode.imageindex:=0; {结点未选中时显示的图标} 
    anode.selectedindex:=1; {结点选中时显示的图标} 
    end 
    3. 如果结点图形在改变后未发生变化,可以执行: 
    treeview1.refresh; 
    四。如何批量处理TreeView结点 
    使用TreeView的items属性的BeginUpdate和EndUpdate方法,例: 
    TreeView1.items.BeginUpdate; 
    for i:=0 to TreeView1.items.count-1 do 
    begin 
    //将每个结点的文字改成为小写字母 
    TreeView1.items[i].text:=lowercase(TreeView1.items[i].text); 
    end; 
    TreeView1.items.EndUpdate; 五。实现TreeView结点拖拽的实例 
    下面的程序片段演示了如何实现拖拽treeview构件结点的例子 
    {鼠标按下时执行的语句} 
    procedure TForm1.Treeview1MouseDown(Sender: TObject; 
    Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
    begin 
    {判断左键按下并且鼠标点在一个结点上开始实现拖拽} 
    if ( Button = mbLeft ) and 
    ( htOnItem in Treeview1.GetHitTestInfoAt( X, Y ) ) then 
    begin 
    Treeview1.BeginDrag( False ); 
    end; 
    end; 
    {鼠标拖动执行语句} 
    procedure TForm1.Treeview1DragOver( Sender, Source: TObject; 
    X, Y: Integer; State: TDragState; var Accept: Boolean); 
    var 
    Node : TTreeNode; 
    begin 
    if Source = Treeview1 then 
    begin 
    Node := Treeview1.GetNodeAt( X, Y ); {取当前结点} 
    if Node <> nil then {当前结点不为空才能实现拖拽,accept:=true} 
    Accept := true; 
    end; 
    end; 
    {鼠标释放时执行的语句} 
    procedure TForm1.Treeview1DragDrop( Sender, Source: TObject; 
    X, Y : Integer ); 
    var 
    TempNode : TTreeNode; 
    AttachMode : TNodeAttachMode; 
    begin 
    if Treeview1.Selected = nil then 
    Exit; 
    AttachMode := naAddChild; {设置结点移动模式,设移动结点为子结点} 
    { 注意在这里存在一个bug,当移动结点时,如果目标结点没有子结点,} 
    { 则加入的新的子结点会失败,所以先在当前目标结点的下面 } 
    { 加入一个临时子结点,移动完毕后,再将临时结点删除 } 
    Treeview1.Items.BeginUpdate; 
    try 
    TempNode := Treeview1.Items.AddChild( Treeview1.DropTarget, 
    'Temp' ); 
    try 
    { 移动选中的结点到目标结点 } 
    Treeview1.Selected.MoveTo( Treeview1.DropTarget, AttachMode ); 
    finally 
    TempNode.Free; { 不要忘了释放临时结点 } 
    end; 
    finally 
    Treeview1.Items.EndUpdate; 
    end; 
    end; 
      

  5.   

    我觉得可以不用这么复杂吧,我最近也在学用treeview。最好从顶部开始一层一层的建立树,每新增加一节点先寻找父节点,然后再添加。我试验了一下,还挺好使。