我弄的一个,把有递归关系的数据显示在树形结构中.思路是:遇到任何一个记录,就不停找父结点,找到就写出来,直到根结点显示出来.跟你的要求可能是相反的,写的有点乱,不知道你能看明白不.///////////////////////////////////////////////////////////////////////////////function TForm1.searchnode(Q: TADOQuery; list: TStringlist; tv1: Ttreeview): Ttreenode;var node: TTreenode; BM: TBookMark; PID: integer;begin result := nil; BM := Q.GetBookmark; PID := Q.fieldbyname('PID').AsInteger; Q.Locate('ID', Pid, []); //找到当前结点的父结点 //当前结点的父结点的父结点是根结点; if (Q.FieldByName('PID').AsInteger = 0) and (list.IndexOf(ExecQ.FieldByName('ID').AsString) = -1) then begin result := tv1.Items.AddObjectFirst(nil, Q.fieldbyname('姓名').AsString, Q.GetBookmark); list.AddObject(Q.fieldbyname('ID').AsString, result); end; if (list.IndexOf(Q.fieldbyname('PID').AsString) > -1) and (list.IndexOf(Q.FieldByName('ID').AsString) = -1) then begin //当前结点的父结点的父结点在里面,而当前结点的父结点不在里面的 ,就加入当前结点的父结点; showmessage('ok'); result := tv1.Items.AddChildObject(Ttreenode(list.Objects[list.IndexOf(Q.fieldbyname('PID').AsString)]), Q.fieldbyname('姓名').AsString, Q.GetBookmark); end; //当前结点的父结点的父结点不在列表里面,而它又是存在的; while (list.IndexOf(Q.fieldbyname('PID').AsString) = -1) and (Q.FieldByName('PID').AsInteger <> 0) do searchnode(ExecQ, list, tv1); list.AddObject(Q.fieldbyname('ID').AsString, result); //保存当前结点的ID Q.GotoBookmark(BM); //回到当前位置 //当前结点有父结点而且自己没被加进去 if (list.IndexOf(ExecQ.FieldByName('PID').AsString) > -1) and (list.IndexOf(ExecQ.FieldByName('ID').AsString) = -1) then begin node := tv1.Items.AddChildObject(Ttreenode(list.Objects[list.IndexOf(ExecQ.FieldByName('PID').AsString)]), ExecQ.fieldbyname('姓名').AsString, ExecQ.GetBookmark); list.AddObject(ExecQ.fieldbyname('ID').AsString, node); end;end;