有现成的DBTreeView组件,好好去找找吧,

解决方案 »

  1.   

    这是别人的代码,可能对你有帮助。
    数据库里不同的表读出数据生成Tree,如下;
    名单
      ---市场部  //1
        --经理
          --AA
          --BB
        --员工
          --aa
          --bb
      ---计划部  //2
        --经理
          --CC
          --DD
        --员工
          --cc
          --dd
      ........如上类同 
      .........
    同时定义了全局变量
    type
      PMyRec=^TMyRec;
      TMyRec=record
        Eid:string;  //id号
        EName:string; //名称
        EDuty:string;//岗位
    end;
    var
      MyRec:PMyRec;
    实现如下:
    procedure MakeEmpNode(DNode,DName);根据传入的节点,和部门名称,生成员工节点。
          员工Query.Sql.Text:='select * from Employee Where D_Name='''+DName+''';      
          员工Query.Open;
          ZNode:=TV.items.addChild(DNode,'经理'); //增加经理节点
          While not 员工Query.Eof do
            being
              EName:=员工Query.Fieldbyname('E_Name').AsString;
              ZW:=员工Query.Fieldbyname('E_ZW').AsString;
              if ZW='经理'  then
                  begin
                  New(MyRed);///////
                  MyRec^.Eid=员工Query.Fieldbyname('E_id').AsString;
                  MyRec^.EName:=员工Query.Fieldbyname('E_Name').AsString;
                  MyRec^.EDuty;=员工Query.Fieldbyname('E_Duty').AsString;
                  ENode:=TV.items.AddChildObject(ZNode,EName,MyRec);
                  end;
              员工Query.Next;
            end; 
            ZNode:=TV.items.addChild(DNode,'员工');//增加员工节点
            员工Query.First ;  //记录移到第一条
            While not 员工Query.Eof do
            bein
              EName:=员工Query.Fieldbyname('E_Name').AsString;
              ZW:=员工Query.Fieldbyname('E_ZW').AsString;
              if ZW='员工'  then    
                  begin
                  New(MyRec);///////////
                  MyRec^.Eid=员工Query.Fieldbyname('E_id').AsString;
                  MyRec^.EName:=员工Query.Fieldbyname('E_Name').AsString;
                  MyRec^.EDuty;=员工Query.Fieldbyname('E_Duty').AsString;
                  ENode:=TV.items.AddChildObject(ZNode,EName,MyRec);
                  end;
              员工Query.Next;
            end; 
    你是不是加在这两个地方??溢出,创建是溢出,还是点击时?
    要一个动作,那你遍历整个treeview即可我的步骤大概如上,不知各位看的明白么?现在是我想通过选择节点,可以得到不同节点的  TV.OnClick
        begin
          if TV.Selected<>nil then  
            TempDuty:=PMyRec(TV.Selected.Data)^.EDuty; 
        end;
    程序可以运行得到想要的Tree,可是在选择节点时,不能很好完成,分析觉的错误原因是
    1.在增加经理,员工节点时是用AddChile,没有赋予Data值。
    2.是过程1的New(MyRec)是否传递到过程2中,过程1与过程2的MyRec的传递问题,MyRec应该如何在过程1与过程2中实现分配,传递。请大侠指点,应该怎样改正??谢谢