下面是我用delphi 写的显示树状图的代码,只能显示一个部门,不知那里错了:
  qryexec(qry1,'select * from bumen order by bmm');
  TreeView1.Items.Clear ; //TreeView1是中文,TreeView2是ID,隐藏的
  TreeView2.Items.Clear ;
  inittree(qry1,TreeView1,TreeView2,0,true);procedure inittree(qry:tadoquery;treeview:ttreeview;treeview1:ttreeview;parentid:integer;isExpanded:boolean);
var i:integer;
  MyTreeNode,MyTreeNode1: TTreeNode;
  tmpqry:tadoquery;
  abc:string;
begin
 if parentid=0 then
 begin
  MyTreeNode:=treeview.Items.Add(nil,'所有部门');
  MyTreeNode.SelectedIndex :=1;
  MyTreeNode1:=treeview1.Items.Add(nil,'id部门');
  MyTreeNode1.SelectedIndex :=1;
 end;
  tmpqry:=tadoquery.Create(nil);
  tmpqry:=qry;
  tmpqry.Filter:='dirid='''+inttostr(parentid)+'''';
  tmpqry.Filtered:=true;
  tmpqry.first;
  while not tmpqry.Eof do
  begin
  MyTreeNode:=treeview.Items.AddChild(MyTreeNode,tmpqry.fieldbyname('bm').asstring);
  MyTreeNode1:=treeview1.Items.AddChild(MyTreeNode1,tmpqry.fieldbyname('id').asstring);
  MyTreeNode.SelectedIndex:=1;
  MyTreeNode1.SelectedIndex:=1;
  inittree(tmpqry,treeview,treeview1,tmpqry.fieldbyname('id').AsInteger ,true);
  tmpqry.Next;
 end;
end;

解决方案 »

  1.   

    每次执行时,都会tmpqry.first;永远在第一条
      

  2.   

    去掉这句也是一样的:tmpqry.first;
      

  3.   

    不必自己写了,用Ehlib 5.2直接显示树形结构记录。
      

  4.   

    請參考以下代碼再作修改:1.自定義生成樹的過程:
    procedure TRES_BOM_VIEW_F.CREATETREEVIEWMODEL;
    var
      iLoop:Integer;
      Master,MasterNode:TTreeNode;
    begin
      adoq_getop.Close;
      //SELECT distinct PARN_TYP FROM WWW where parn_typ<>'.' and parn_typ is not null order by PARN_TYP desc
      adoq_getop.SQL.Text:='SELECT distinct PARN_TYP FROM WWW where parn_typ<>''.'' and parn_typ is not null order by PARN_TYP desc';
      adoq_getop.Open;
      adoq_getop.First;
      cx_TV.Items.BeginUpdate;
      cx_TV.Items.Clear;
      Master:=cx_TV.Items.Add(nil,'昆盈BOM表檢視');
      while not adoq_getop.Eof do
      begin
        if adoq_getop.FieldByName('PARN_TYP').AsString<>'' then
        begin
          Screen.Cursor:=crSQLWait;
          MasterNode:=cx_TV.Items.AddChild(Master,VarToStr(adoq_getop.FieldValues['PARN_TYP']));
          Application.ProcessMessages;
          qry_op.Close;
          qry_op.SQL.Text:='SELECT DISTINCT PARN_LITM FROM WWW WHERE PARN_TYP='''+ VarToStr(adoq_getop.FieldValues['PARN_TYP'])+''' GROUP BY PARN_LITM';
          qry_op.Open;
          for iLoop:=0 to qry_op.RecordCount -1 do
          begin
            cx_TV.Items.AddChild(MasterNode,VarToStr(qry_op.FieldValues['PARN_LITM']));
            qry_op.Next;
          end;
          Application.ProcessMessages;
          cx_TV.Items.EndUpdate;
          Screen.Cursor:=crDefault;
        end;
        adoq_getop.Next;
        Application.ProcessMessages;
      end;
     {
      ThreadTView:=cx_TV;
      ViewThread:=TExpandLH.Create;
      ViewThread.Resume;
      }
    end;
      

  5.   

    2.調用過程並生成樹:procedure TRES_BOM_VIEW_F.btnSB_SearchClick(Sender: TObject);
    begin
      inherited;
      try
        RES_LOADING_F:=TRES_LOADING_F.Create(Self);
        RES_LOADING_F.Label1.Caption:='正在檢索相關數據......';
        RES_LOADING_F.Show;
        RES_LOADING_F.Update;
        CREATETREEVIEWMODEL;
      finally
        RES_LOADING_F.Close;
      end;
    end;
      

  6.   

    Filter 以后
    First
    Next
    也是我喜欢的写法。不过上次失败的时候,是我用 D2010 了。那个版本下,对这种做法貌似会无法执行。
    D7下应该不会有问题。你的版本是?