type
{------------TreeView 的数据记录-------------}
  PDataRec = ^DataRec;
  DataRec = Record
    name : string;
    ID   : integer;
    parent : integer;
  end;{--------------------------------生成树----------------------------------------}
procedure TForm1.DisTree(FId: integer; FNode: TTreeNode);
var
  i : integer;
  TNode : TTreeNode;
  q : TQuery;
  PData : PDataRec;
begin
  q:=TQuery.Create(self);
  q.DatabaseName:=database1.DatabaseName;
  with q do
  begin
  close;
  sql.Clear;
  sql.Add(format('select * from tree where parent=%d',[FId]));
  open;
  first;
    while not Eof do
    begin
      new(PData);
      with PData^ do
      begin
        name:=FieldByName('name').asstring;
        ID  :=FieldByName('ID').asinteger;
        Parent:=FieldByName('Parent').asinteger;
      end;
      TNode:=TreeView1.Items.AddChildObject(FNode,PData^.Name,PData);
      TNode.ImageIndex:=0;
      TNode.SelectedIndex:=1;
      DisTree(fieldbyname('id').asinteger,TNode);
      next;
    end;
  end;
end;//然后在
procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  TempNode : TTreeNode;
begin
    TempNode:=TreeView1.GetNodeAt(x,y);
    TempNode.Selected:=true;
end;
   
end;//我的意思是,你在生成树的时候把信息写进去了,然后读出来就可以了,就是这个思路

解决方案 »

  1.   

    楼上的办法很好,但是你有没有注意用SQL语句的速度问题。当你有5000条数据时且有多层时保证你会受不了的。
      

  2.   

    同意icehill(闲云幽步踏古来) 
      

  3.   

    icehill(闲云幽步踏古来) 方法正确,
    我也是这样实现的
    不过有一点差别
    1、首先使用递归sql语句将所有记录查出
    查找
    在表staff中有两个字段
    area_id,up_area
    up_area为area_id的上级字段
    数据表中记录入下
    area_id    up_area
    zq          
    aq         zq
    bq         zq
    cq         aq
    dq         bq
    eq         cq在查找上级为zq的所有子级的sql语句如下
             SELECT AREA_ID FROM AREA
    START WITH
    AREA.AREA_ID='ZQ'
    CONNECT BY PRIOR AREA.AREA_ID=AREA.UP_AREA 
    2、使用一个递归构造TreeView
      

  4.   

    icehill(闲云幽步踏古来):请问,new(pdata)是什么意思?我看了帮助也没明白,请指点。with PData^ do 这句,PData^指向什么呢?我对指针很差的。请指点。谢谢。
      

  5.   

    1.在FormShow事件中,添加上级id=-1的节点,同时判断PARENT有没有为-1的,如果有,使根结点可以expand,则显示+;
    2.在TreeView1Expanding事件中,根据所选取得node判断是否有children,如果就动态添加好了。(注:这种方法的效率较高,尤其在树结构较为复杂的情形)。