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

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

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

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秒左右, 数据和上边那段代码处理一样的数据

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

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

浅谈Delphi高效使用TreeView的更多相关文章

  1. 浅谈delphi创建Windows服务程序与窗体实现交互

    我想实现的功能是创建一个服务程序,然后在服务Start时动态创建一个窗体Form,然后把Form缩小时变成TrayIcon放在Windows托盘上. 我在服务程序的OnStart事件中写到 Start ...

  2. iOS开发之浅谈MVVM的架构设计与团队协作

    今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...

  3. Linux特殊符号浅谈

    Linux特殊字符浅谈 我们经常跟键盘上面那些特殊符号比如(?.!.~...)打交道,其实在Linux有其独特的含义,大致可以分为三类:Linux特殊符号.通配符.正则表达式. Linux特殊符号又可 ...

  4. 浅谈Nginx负载均衡和F5的区别

    前言 笔者最近在负责某集团网站时,同时用到了Nginx与F5,如图所示,负载均衡器F5作为处理外界请求的第一道"墙",将请求分发到web服务器后,web服务器上的Nginx再进行处 ...

  5. 浅谈大型web系统架构

    动态应用,是相对于网站静态内容而言,是指以c/c++.php.Java.perl..net等服务器端语言开发的网络应用软件,比如论坛.网络相册.交友.BLOG等常见应用.动态应用系统通常与数据库系统. ...

  6. 浅谈算法和数据结构: 七 二叉查找树 八 平衡查找树之2-3树 九 平衡查找树之红黑树 十 平衡查找树之B树

    http://www.cnblogs.com/yangecnu/p/Introduce-Binary-Search-Tree.html 前文介绍了符号表的两种实现,无序链表和有序数组,无序链表在插入的 ...

  7. 转:浅谈大型web系统架构

    浅谈大型web系统架构 动态应用,是相对于网站静态内容而言,是指以c/c++.php.Java.perl..net等服务器端语言开发的网络应用软件,比如论坛.网络相册.交友.BLOG等常见应用.动态应 ...

  8. 浅谈iOS中MVVM的架构设计与团队协作

    说到架构设计和团队协作,这个对App的开发还是比较重要的.即使作为一个专业的搬砖者,前提是你这砖搬完放在哪?不只是Code有框架,其他的东西都是有框架的,比如桥梁等等神马的~在这儿就不往外扯了.一个好 ...

  9. 【转】Windows SDK入门浅谈

    前言 如果你是一个编程初学者,如果你刚刚结束C语言的课程.你可能会有点失望和怀疑:这就是C语言吗?靠它就能编出软件?无法想象Windows桌面上一个普通的窗口是怎样出现在眼前的.从C语言的上机作业到W ...

随机推荐

  1. 使用springboot和easypoi进行的数据导出的小案例

    在这个案例中使用的有springboot和easypoi进行数据导出到excel中 yml文件是这样的: server: port: 8080 spring: datasource: url: jdb ...

  2. [51Nod 1237] 最大公约数之和 (杜教筛+莫比乌斯反演)

    题目描述 求∑i=1n∑j=1n(i,j) mod (1e9+7)n<=1010\sum_{i=1}^n\sum_{j=1}^n(i,j)~mod~(1e9+7)\\n<=10^{10}i ...

  3. TDOA 之 基站逻辑代码实现

    在前一篇博文里描述了基站的逻辑部分,这里贴出来具体代码实现.https://www.cnblogs.com/tuzhuke/p/11689881.html 1 Sync 信息部分 case 'S': ...

  4. javascript权威指南第15章 使用Canvas绘图

    HTML <!DOCTYPE html> <html> <head> <title>canvas</title> </head> ...

  5. C++类的介绍

    最近在学习SLAM,顺便将C++类的知识复习一下.(其中部分官方定义和程序设计方法来源于西北工业大学魏英老师)   1.类的定义: 是用户自定义的数据类型. C++一个类定义的形式如下: class ...

  6. [vsftpd] ubuntu14.04 ansible剧本安装vsftpd流程及报错排查

    需求: 在ubuntu14.04机器上搭建ftp服务,ftp账号通过winscp软件登录后,仅可增删改/data/wwwroot目录. 一.安装步骤 1.apt 安装vsftpd apt-get in ...

  7. Thift初探 (一)

    Maven pox.xml: <dependency> <groupId>org.apache.thrift</groupId> <artifactId> ...

  8. (转)hadoop balancer(重新平衡)

    借鉴:https://blog.csdn.net/mnasd/article/details/80369603?utm_source=blogxgwz2 参考文档:  http://blog.csdn ...

  9. (转)shell调试方法

    ---恢复内容开始--- 转载:https://www.ibm.com/developerworks/cn/linux/l-cn-shell-debug/ Shell脚本调试技术 曹 羽中2007 年 ...

  10. RK3399 focaltech敦泰触摸屏移植调试

    CPU:RK3399 系统:Android 7.1 IC:FT5406 focaltech(敦泰)触摸屏也是比较常用的,但是相对汇顶,就比较少用 RK的源码中虽然有 focaltech 的代码,但没有 ...