依据数据集 进行 树 的构造(treeview & dataset) 方法一

type

  PDepData=^DepData;

  DepData = record

    ID: Integer;

    DepID: string;

    DepName: string;

  end;


procedure FreeTV(tv: TTreeview);

var

  i: Integer;

begin

  for i := 0 to tv.Items.Count - 1 do

  begin

    dispose(tv.Items[i].Data);

  end;

  tv.Items.Clear;

end;


procedure LoadTree(tv: TTreeview; dst: TDataset);

  function GetNodeData: PDepData;

  begin

    new(result);

    with result^ do begin

      ID := dst.FieldByName('ID').AsInteger;

      DepID := dst.FieldByName('DepID').AsString;

      DepName := dst.FieldByName('DepName').AsString;

    end;

  end;

var

  ParentNode, NewNode: TTreeNode;

  p: PDepData;

  found: Boolean;

  i: Integer;

begin

  FreeTV(tv); // 释放树视图

  dst.First;

  ParentNode := nil;

  while not dst.Eof do begin

    p := GetNodeData;

    found := false;

    for i := tv.Items.Count-1 downto 0 do begin // 找 双亲节点

      if pos(PDepData(tv.Items[i].Data).DepID, p.DepID) = 1 then begin

        ParentNode := tv.Items[i];

        found := true;

        break;

      end;

    end;

    if not found then begin // 未找到双亲节点,加到树根下

      ParentNode := tv.Items.Add(nil, p.DepName);

      ParentNode.Data := p;

    end else           // 找到双亲节点,加到双亲节点下

      tv.Items.AddChild(ParentNode, p.DepName).Data := p;

    dst.Next;

  end;

end;


procedure TForm1.Button1Click(Sender: TObject);

var

  t: Cardinal;

begin

  t := gettickcount;

  LoadTree(tv, MyQuery1);

  t := gettickcount - t;

  caption := inttostr(t);

end;



转载于:https://my.oschina.net/u/582827/blog/530244

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值