以下是我的程序里的一段,可以实现无限层导入:
procedure TForm8.LoadTreeView;
var
  strsql,tid:string;
begin
  try    DataModule3.ADOTable3.open;
    DataModule3.ADOTable3.Locate('DTname',RzComboBox1.Text,[lopartialkey]);
    tid:=inttostr(DataModule3.ADOTable3.FieldByName('id').value);
    strsql:='select * from T where TypeID='+tid;
    DQ.Active :=false;
    DQ.SQL.Clear ;
    DQ.SQL.Add(strsql);
    DQ.Active :=true;
    DQ.Filtered :=true;
    DQ.Filter := 'Parent=0';
    U_DiGui(0,seltv.TopItem );//从当前0层开始递归建树
  except
    showmessage('字典里没有数据!');
  end;
end;
procedure TForm8.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:=seltv.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;

解决方案 »

  1.   

    对于这种类型的树的遍历。我曾设计过一种算法,不必用递归,而采用队列数据结构来实现。
    队列在Delphi中可以借用TList或TStringList.
    具体过程是:
    1。搜索所有上级ID为0的结点记录,进入队列。
    2。当队列不空时:队头出队,同时搜索所有上级ID为队头ID的结点记录,进入队列。
    当队空时,就完成了所有树结点的遍历。你可在遍历过程中,建立一个TreeView。这样可以方便的进行统计计算。
      

  2.   

    详细一点,我对TREEVIEW不太熟悉,