一个自己写的有关数据库的treeview.

自己写的一个有关树形结构的函数,与大家共享.

procedure MakeTreeEx(Query: TadoQuery; TreeView: TTreeView;
  DisplayName:string;Id:string;pid:string);
type
  recNode=record
    Id:string;
    Name:string;
    PId:string;
  end;
  PRecNode=^recnode;
  {递归算法要有终止的条件}
  procedure AppendChild(var treeview:TTreeView;node:TTreeNode;
    var strlst:TStringList);
  var
    strTmp:string;
    i:Integer;
    nodeTmp:TTreeNode; {子结点}
    ps:pstring;
  begin

      //ShowMessage(strlst.Text+'要查找的PID是:'+pstring(node.Data)^);

    while strlst.IndexOf(trim(pstring(node.Data)^))<>-1 do
    begin
      i:=strlst.IndexOf(pstring(node.Data)^);
      ps:=NewStr(precnode(strlst.Objects[i])^.Id);
      nodetmp:=TreeView.Items.AddChildObject(node,precnode(strLst.Objects[i])^.Name,
        ps);
      Dispose(precnode(strlst.objects[i]));
      strlst.Delete(i);
      {原先此处误写成node,让我调试了半天,郁闷}
      AppendChild(treeview,nodetmp,strlst);
    end;  
  end;
var
  List: TStringList;
  Node: TTreeNode;
  Index: Integer;
  ps:pstring;//指针
  prec:PRecNode;
  i:Integer;
begin
  TreeView.Items.BeginUpdate;
  try
    TreeView.Items.Clear;

    List := TStringList.Create;
    try
      List.Sorted := True;
      {此句非常重要,默认为dupIgnore,如有重复记录则忽略}
      list.Duplicates:=dupAccept;
      {先遍历一边query,获取所有记录}
      Query.First;
      while not Query.Eof do
      begin
        {保存数据}
        New(prec); {每删除一条记录时,要保证将其保存的数据也一同删除}
        prec^.Id:=Query.fieldbyname(Id).AsString;
        prec^.PId:=Query.fieldbyname(pid).asstring;
        prec^.Name:=Query.fieldbyname(DisplayName).asstring;
        List.AddObject(Query.FieldByName(pid).AsString,TObject(prec));
        Query.Next;
      end;
      showint(list.count);
      while List.IndexOf('0')<>-1 do
      begin
        i:=List.IndexOf('0');

        ps:=NewStr(Trim(precnode(List.Objects[i])^.Id));
        node:=TreeView.Items.AddChildObject(nil,precnode(List.Objects[i])^.Name,
          ps);
        Dispose(precnode(List.Objects[i]));
        List.Delete(i);
        AppendChild(TreeView,node,list);
        //AppendChild(list,node);
      end;

    finally
      for i:=0 to List.Count-1 do
      begin
        Dispose(precnode(List.objects[i]));
      end;
      List.Free;
    end;
  finally
    TreeView.Items.EndUpdate;
  end;
end;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值