• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

(原创)浅谈Delphi高效使用TreeView

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

本来我一直都是使用递归算法, 效率很低

下边这段代码是我原来写的

-----------------------------------------------------------------------------------------------------

 

procedure TForm1.GetDepartmentMsg;
var
  Test, Test2 : TTreeNode;
  procedure NodeAdd(Test : TTreeNode; DepartmentId : string);
  var
    Testlevel : TTreeNode;
    TestQuery : TADOQuery;
  begin
    try
      TestQuery := TADOQuery.Create(Nil);
      TestQuery.Connection := ADOConnection1;
      With TestQuery do
      begin
        Close;
        SQL.Text := \'Select  DepartmentID  ,NAME from  Department where DepartmentID like \'\'\'+DepartmentId+\'%\'\' and Len(DepartmentId) = \' + IntToStr(Length (DepartmentId) + 2) +  \'Group by DepartmentID ,name order by DepartmentID \'  ;
        Open;
        if Not IsEmpty then
        begin
          while not Eof do
          begin
            Testlevel := TreeView1.Items.AddChild(Test,TestQuery.fieldbyName(\'Name\').AsString + \' | \'+ TestQuery.fieldbyName(\'DepartmentId\').AsString);
            NodeAdd(Testlevel,TestQuery.fieldbyName(\'DepartmentId\').AsString);
            Testlevel.ImageIndex := Testlevel.Level -1;
            Testlevel.SelectedIndex := Testlevel.Level -1;
            Next;
          end;
        end;
      end;
    finally
      TestQuery.free;
    end;
end;

begin
  Test := TreeView1.Items.Add(nil,\' ***** | 00\');
  Test.ImageIndex := 1;
  with Query1 do
  begin
    Close;
    Sql.Text := \'Select * from Department where State = \'\'正常\'\' and DepartmentLevel = \'\'1\'\' \';
    Open;
  end;
  Query1.First;
  TreeView1.Items.BeginUpdate;
  while not Query1.Eof do
  begin
    Test2 := TreeView1.Items.AddChild(Test,Query1.fieldbyName(\'Name\').AsString + \' | \'+ Query1.fieldbyName(\'DepartmentId\').AsString) ;
    NodeAdd(Test2,Query1.fieldbyName(\'DepartmentId\').AsString);
    Query1.Next;
  end;

  TreeView1.Items.EndUpdate;
  Query1.Close;
end;

今天无事测试了这段代码 时间是6-7秒左右

下边这段改进后的,不使用递归

 

procedure TForm1.NewGetDepartmentMsg;
const
  DivNum = 2;
var
  nLevel: Integer;
  pNodes: array[0..1023] of TTreeNode;
  DepartmentID, Name: string;
  Str: string;
begin
  Str := \'Select DepartmentID, Name from Department  order by DepartmentID\';
  with adoquery1 do
  begin
    Close;
    Sql.clear;
    Sql.add(Str);
    Open;
  end;

  TreeView1.Items.Clear;
  TreeView1.Items.BeginUpdate;
  pNodes[0] := TreeView1.Items.Add(nil, \'***\');
  if Not ADOQuery1.IsEmpty then
    while not ADOQuery1.Eof do
    begin
      DepartmentID := ADOQuery1.fieldbyName(\'DepartmentID\').AsString;
      Name := ADOQuery1.fieldbyName(\'Name\').AsString;
      nLevel := Length(DepartmentID) div DivNum ;
      pNodes[nLevel] := TreeView1.Items.AddChild(pNodes[nLevel - 1], DepartmentID + \' | \' + Name);
      ADOQuery1.Next;
    end;
  TreeView1.Items.EndUpdate;
  ADOQuery1.Close;
end;

这个算法主要合理利用了 \'Select DepartmentID, Name from Department  order by DepartmentID\' 来排序, 这就保证了 

pNodes[nLevel] := TreeView1.Items.AddChild(pNodes[nLevel - 1], DepartmentID + \' | \' + Name);

他的上级结点不为空

这段代码我一测试, 大概是0.2秒左右, 数据和上边那段代码处理一样的数据

这样写肯定是有缺陷的, 也不是什么情况下都能使用

写得不对的地方,欢迎批评和指正,谢谢

 


 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
AlteraSoC与Matlab的联合---第一步软件安装与硬件测试发布时间:2022-07-18
下一篇:
matlab关闭指定图例发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap