浅谈Delphi高效使用TreeView
本来我一直都是使用递归算法, 效率很低
下边这段代码是我原来写的
-----------------------------------------------------------------------------------------------------
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的更多相关文章
- 浅谈delphi创建Windows服务程序与窗体实现交互
我想实现的功能是创建一个服务程序,然后在服务Start时动态创建一个窗体Form,然后把Form缩小时变成TrayIcon放在Windows托盘上. 我在服务程序的OnStart事件中写到 Start ...
- iOS开发之浅谈MVVM的架构设计与团队协作
今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
- Linux特殊符号浅谈
Linux特殊字符浅谈 我们经常跟键盘上面那些特殊符号比如(?.!.~...)打交道,其实在Linux有其独特的含义,大致可以分为三类:Linux特殊符号.通配符.正则表达式. Linux特殊符号又可 ...
- 浅谈Nginx负载均衡和F5的区别
前言 笔者最近在负责某集团网站时,同时用到了Nginx与F5,如图所示,负载均衡器F5作为处理外界请求的第一道"墙",将请求分发到web服务器后,web服务器上的Nginx再进行处 ...
- 浅谈大型web系统架构
动态应用,是相对于网站静态内容而言,是指以c/c++.php.Java.perl..net等服务器端语言开发的网络应用软件,比如论坛.网络相册.交友.BLOG等常见应用.动态应用系统通常与数据库系统. ...
- 浅谈算法和数据结构: 七 二叉查找树 八 平衡查找树之2-3树 九 平衡查找树之红黑树 十 平衡查找树之B树
http://www.cnblogs.com/yangecnu/p/Introduce-Binary-Search-Tree.html 前文介绍了符号表的两种实现,无序链表和有序数组,无序链表在插入的 ...
- 转:浅谈大型web系统架构
浅谈大型web系统架构 动态应用,是相对于网站静态内容而言,是指以c/c++.php.Java.perl..net等服务器端语言开发的网络应用软件,比如论坛.网络相册.交友.BLOG等常见应用.动态应 ...
- 浅谈iOS中MVVM的架构设计与团队协作
说到架构设计和团队协作,这个对App的开发还是比较重要的.即使作为一个专业的搬砖者,前提是你这砖搬完放在哪?不只是Code有框架,其他的东西都是有框架的,比如桥梁等等神马的~在这儿就不往外扯了.一个好 ...
- 【转】Windows SDK入门浅谈
前言 如果你是一个编程初学者,如果你刚刚结束C语言的课程.你可能会有点失望和怀疑:这就是C语言吗?靠它就能编出软件?无法想象Windows桌面上一个普通的窗口是怎样出现在眼前的.从C语言的上机作业到W ...
随机推荐
- vue2 单一事件中心管理组件通信
- redis中对list类型某个元素的查找和删除
我们的信息都是放到redis的缓存中,结构为list,如果知道特定的值的话,通过LREM key count value这样就可以.对于redis的list结构,获取某个位置的值通过 LINDE ...
- Liunx - 命令整理
## Liunx 常用命令 ## ## 注意,在Linux中,文件没有创建时间. 1. ls : 查看当前文件夹下的所有文件 2. mkdir -- 创建一个新的文件夹 - mkdir 参数 文件名 ...
- 51nod 1577 异或凑数 线性基的妙用
\(OTZgengyf\)..当场被吊打\(QwQ\) 思路:线性基 提交:\(3\)次 错因:往里面加数时\(tmp.p\)与\(i\)区分不清(还是我太菜了) 题解: 我们对每个位置的线性基如此操 ...
- myeclipse不同版本共存破解办法
我自己破解的是myeclipse10+myeclipse2018: 方法是:先破解myeclipse10.7,使用破解工具,到最后一步不关闭破解工具,再进行替换文件那一步,路径不选择10版本的,换成M ...
- Postgresql pg_dump
pg_dump 命令详解 参数 描述 -h 指定服务器名称 -p 指定端口 -U 指定要连接的用户名 -w/--no-password 从不提示密码 -W/--password 强制pg_dump在连 ...
- snmp_trap/snmptt
Zabbix Snmp Trap 配置 1. Zabbix Server 操作 1.1 Snmp Trap 安装配置 yum install -y net-snmp net-snmp-utils vi ...
- DOM操作1
1.DOM文档对象模型:操作页面元素(标签) html文件看成一个文档,把文档看成一个对象 xml也是一种文档,标签自定义,系统不自带标签,偏向于存储数据 2.DOM树:由文档及文档中的所以元素(标签 ...
- Our Journey of Dalian Ends && Our Journey of Xian Ends 最小费用最大流
2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛Our Journey of Dalian Ends 题意:要求先从大连到上海,再从上海打西安,中途会经过其他城市,每个城市只能去一次,出一次, ...
- python 的单例
例子 class Singleton(object): _instance = None def __new__(cls, *args, **kw): if not cls._instance: cl ...