说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

TreeView在电信综合统计管理系统中的应用-Delphi资料

HTML文档下载 WORD文档下载 PDF文档下载
TreeView在电信综合统计管理系统中的应用-Delphi资料

前 言

树形图用于显示按照树形结构进行组织的数据,其用途比较广泛,如计算机中的文件系统(Windows95中的资源管理器)、企业或公司的组成结构等。VB、PB、Delphi等工具提供了一个功能很强的树型控件TTreeView,可以用来描述复杂的层次关系。由于树形图结构较复杂,使用起来常不知如何下手。笔者结合电信综合统计管理系统中指标维护这一具体实例,详细阐述在Delphi下如何将树型控件的使用与数据库联系起来,实现数据分任意多层显示,方便地进行增加、修改、删除操作,而且用拖放技术实现各层数据之间的移动、复制。笔者希望通过对该实例的阐述,达到抛砖引玉的效果,与各位同仁相互交流,共同进步。

一、指标树的建立

具体方法是:创建一个数据库,设计指标表t_pub_index,包含index_id、parent_id、index_name字段,其它字段根据实际业务而定,指标名称index_name将在树型控件的节点上显示,index_id字段保存节点的唯一标识号,parent_id表示当前节点的父节点号,标识号组成了一个“链表”,记录了树上节点的结构。设计一窗体Frm_sys_index,其上放置TreeView控件tv_zb、Query控件Query1及其它指标属性编辑显示控件。一个树的节点又包含文本(Text)和数据(Data)。Text为String类,用来显示指标或指标目录名称。Data则为无定形指针(Untyped Pointer),可以指向一个与节点相联系的数据结构,该结构与数据库指标表相应域关联,如指标ID、上级节点ID。

Query控件的表达式为:

select index_id

parent_id

index_name from t_pub_index

start with index_id=0 connect by prior index_id=parent_id

其中start with 和connect by 是Oracle的SQL语句的保留字,使一条记录的parent_id列的值等于前一记录的index_id列的值,并以parent_id等于0的记录开始。

建树的基本思路是:

procedure TFrm_sys_index.createtree;

var

curValue: indexPointer; //指向与节点相联系的数据结构的指针

curNode : TTreeNode; //当前节点

curid : integer; //当前节点标识号

begin

curNode := nil;

curid := -1;

Query_index.Open;

Query_index.first;

while not Query_index.Eof do

begin

new(curValue);

With curValue^ do

将数据库指标表t_pub_index各字段值赋curValue 所指数据结构

while(curid <> curValue.parent_id) do //当前节点的标识号不等于当前记录的父节点号

begin

curNode := curNode.parent;

curid:= indexPointer(curNode.data).index_id;

end;

curNode := tv_zb.Items.AddChildObject(curNode

curValue^.index_name

curValue); //在当前节点上添加子节点,显示节点指标名称,所带指针指向一个与指标数据相联系的数据结构

curid := indexPointer(curNode.data).index_id;

Query_index.next;

end;

Query_index.close;

end;

二、增加、删除、修改树节点

单纯在Treeview 上增加、删除、修改节点只需用它本身提供的Treeview.Items. AddChildObject、 Treeview.Selected.Delete、Treeview.Selected.EditText等方法即可,但要相应修改数据库中的数据,必须通过递归调用同一个函数(用于删除一个选项)来遍历所选节点下的所有子节点。下面以删除节点为例介绍具体实现流程:

function TFrm_sys_index.delnode(node1:TTreenode):TTreenode;

var

childnode:TTreenode;

begin

childnode:=node1.GetLastChild; //按倒序获得子项,因为删除选项时,列表会发生变化

while childnode<>nil do

childnode:=delnode(childnode); //如子项不为空,进行递归调用

index_id:=inttostr(indexpointer(node1.data).index_id);//获得该节点对应指标

在数据库删除相应指标;

result:=node1.parent.GetPrevChild(node1); //定位到该节点的上一节点

node1.delete; //删除树节点

end;

三、拖动树节点

拖动树节点基本上是通过建立目标项的新子项、向它复制源项、删除原项来移动选项。与上述删除操作相似,也是通过递归调用同一个函数(用于移动一个选项),按倒序移动所选节点下的所有子节点。下面是递归过程的代码:

procedure TFrm_sys_index.CopyNodeUnder(treeview:TTreeview;

sourcenode

targetnode:ttreenode);

var

newnode:ttreenode;

i:integer;

begin

newnode:=treeview.items.addchildfirst(targetnode

''); //建立目标项

newnode.assign(sourcenode); //复制源项属性

for i:=sourcenode.count-1 downto 0 do //递归调用,按倒序移动其所有子项

CopyNodeUnder (treeview

sourcenode.item[i]

newnode);

treeview.items.delete(sourcenode); //删除源项

end;

Treeview对拖动操作提供支持,我们将组件的DragKind属性设置为dkDrag,DragMode属性设置为dmAutomatic,并为OnDragOver与OnDragDrop事件编写了处理程序。OnDragOver事件处理程序对允许移动的条件进行判断,排除需要避免的特殊情况。代码如下:

procedure TFrm_sys_index.tv_zbDragOver(Sender

Source: TObject; X

Y: Integer; State: TDragState; var Accept: Boolean);

var

targetnode

sourcenode:TTreenode;

begin

targetnode:=tv_zb.getnodeat(x

y);

if (Source=Sender) and (targetnode<>nil) then //保证移动在TreeView上,且目标节点不为空

begin

Accept:=true;

sourcenode:=tv_zb.selected;

//以下代码防止用户将一个选项拖到其子项上(它会随着选项一起移动,导致死循环)

while (targetnode.parent<>nil) and (targetnode <> sourcenode) do

targetnode:=targetnode.parent;

if (targetnode = sourcenode) then Accept:=false;

end

else Accept:=false;

end;

OnDragDrop事件处理程序启动前述移动过程CopyNodeUnder,修改数据库数据。此外,在大批量添加数据到Treeview中时最好使用TreeView.Items.BeginUpdate和  TreeView.Items.EndUpdate,这样能加快显示速度。大致流程如下:

procedure TFrm_sys_index.tv_zbDragDrop(Sender

Source: TObject; X

Y: Integer);

var

targetnode

sourcenode:TTreenode;

begin

targetnode:=tv_zb.getnodeat(x

y); //获得源节点

sourcenode:=tv_zb.selected; //获得目标节点

修改数据库中当前节点的父节点号parent_id,使其等目标节点标识号;

tv_zb.items.beginupdate; //禁用TreeView重绘操作

try

copynodeunder(tv_zb

sourcenode

targetnode); //启动移动过程

tv_zb.selected:=targetnode;

finally

tv_zb.items.endupdate; //重新设置

end;

end;

四、结束语

以上阐述数据库的树状显示的基本方法,以及如何在对树节点进行维护(增加、删除、修改、拖动)的同时,修改数据库数据。由于篇幅所限,笔者在此只对基本思路和流程作了介绍,并未列出详细源代码,读者可自行完善。本文程序在Dlphi5.0、Oracle8.0、Windows 98下调试通过。

Mark走起!iOS开发最常用的第三方库 【CTO俱乐部读书会】《人件》译者肖然:软件工程是社会学 错过就要等一年 深圳微信开发者大会不容错过的十大理由 【干货】国外程序员整理的 C++ 资源大全 一周消息树:被投资人“送”入看守所,创业人汪洁有罪还是无罪? 聚焦五大主题 Atlassian Summit 2014精华PPT下载 2014中国移动开发者大调查第四期获奖名单曝光 【问底】许鹏:使用Spark+Cassandra打造高性能数据分析平台(一) 【特惠倒计时两天】参加深圳微信开发者大会赠书及全套讲师讲义 《英雄联盟》支撑最高750万同时在线用户的聊天服务打造 深圳云软技术副总黄榕振:招行信用卡微信公众号开发高级篇 来自未来的你,MDCC 2014新奇智能硬件揭秘 Twitter开源云环境时间序列数据断层检测工具BreakoutDetection 浅析Facebook软件架构:Tao和BLOB的实现原理 【图文实录】CTO俱乐部:走近Keen Team,走近智能设备Hack 2014聚合开发者大会(JDDC)在京召开 专访腾讯反病毒实验室:揭秘TAV引擎,哈勃分析系统两大利器 Cocos Studio v2.0 Beta0正式发布!多维升级,合三为一 环信即时通讯云获3000万融资 用于研发运维 苹果谷歌都无力?前员工开发跨设备无缝同步应用 带你看会带你飞!MDCC 2014移动开发者大会参会指南 Meteor 1.0发布 构建更好的Web应用 【专访】敏捷专家吴穹:敏捷测试的行业应用与实战解析 英特尔中国研究院最新成果亮相 展示智能衣服瓷杯机器人等创新作品 Node.js 打造实时多人游戏框架 深圳微信开发者大会购票企业特征分析 上门汽车服务“e保养”完成A轮500万美元融资 Docker之父Solomon Hykes谈项目开发的初衷和挑战 浪潮是如何实现单日5000台x86服务器交付互联网的? Bootstrap 3.3.0发布 版本4不再支持IE8 漏洞预警:FTP曝严重远程执行漏洞 影响多个版本Unix 关于组播问题,急急急! 求:IE5.50使用代理服务器/不使用代理服务器 之间进行切换的代码 送分20!!! 周五不好干什么,没女朋友,编程水平又菜,学校又不好,文凭又差自修室又不开放??? 各位同志,我有个问题搞不清楚.请不吝赐教. 如何在局域网中实现共享只读文件(没有共享密码)的写操作 杭州的朋友,请问........ 如何在explore显示的网页的文本框中设置正文??? 谁能告诉我学软件工程到底有多少用? 这里有20分,谁要? 大家来看,这就是别人对中国程序员的看法! 寻找图书~? 获取NT管理员权限创意 ?寻找图书~? 为什么运行时正常的程序,编译成可执行文件后运行过程中出错... 怎样填充按钮客户区? 寻找图书~?? 请问如果数据量很大,比如大型企业的即时采集数据,应该用什么数据库系统处理呢?oracle,sysbase,db2,sqlserver还是cobol?? 这么简单的问题,难道就没有人能帮我了吗?!太遗憾了! 敬一杯“情人醉”给MM_mimi(人淡如菊),别人不要进来呀! 谁有过同样的遭遇??? 长整数除法的算法?? 关于Java Plug-in和Applet的一个问题 请求推荐有关SDK的好书!!!!!!! 我受不了了 个人主页链接如何让鼠标变成手形?谢谢! 老话题:三层结构中blob字段的存取出问题了? run-time类是怎么回事? 当多个程序对同一个文件进行读写操作,如何防止同时写入造成混乱? 求银行家算法的c程序! 请问W2K下面鼠标阴影的效果是用哪个API实现的? 我提议有编程经验的朋友们,一起来研究一种真正符合我们实际开发工作的模板 我用上kylix了!!!!!!! 请教,关于NT域用户的问题!NT账号,怎么设定唯一性呀?比如有aa的用户,我用aa登陆后,别人不能用aa同时登陆了?应该在那儿设置呀? Mfm1992?是个什么东西呀! 如何在informix/esql c中使用大事物? 如何保存收下來的email呢???!!!!! 关于一个网站建设的问题,望高手指点。 求救;如何建立一个登陆页面? 谁能给出一个远程访问互联网ACCESS数据库的经典代码?有28分送上! 怎样将-个十六进制数转换为十进制? 如何将java程序编译成dll文件 cannot focus a disabled or invisible window 一表我想通过文本框来增加记录,为何不能发送到表中,不要告诉我是没有post的原因。 奇怪,borland的开发能力这么强,为什么几乎没有一个象office那样流行的应用软件呢?如果它的应用软件很多,就不会象现在这样穷了吧? Delphi 数据库不如Power Builder 吗? 请问怎么安装新的控件? B样条曲线:如何由经过点反算控制点? Berzer曲线:如何由经过点反算控制点? 关于activereport的字符集问题 有没有计算曲线长度和交点的好方法? 人教版数学六年级上册配套练习册71页答案. 苏教版小学数学六年级补充习题61页第二大题 六年级数学下册练习册很急啊 急、啊 五年级下册人教版数学练习册第四页第五大题的第二小题怎么写 苏教版小学数学补充习题(六年级上册)23页答案 人教版小学六年级数学下册配套练习册第108页第五题怎么计算,急需算式步骤. 五年级下册数学练习册点中典12页 五大题1小题 人教版六年级上册数学补充习题49 50页 1.一个数的6.4倍加上2.6,等于6.1,求这个数2.甲数的五分之二比它的⑦份之①多二分之三,甲数的½是多少?3.1.8的5倍,比一个数的75%少4.5,这个数是多少?4.35除40的商乘以¼与五分之一的差,是 五年级下册数学练习册56页五大题 六年级小学数学上册补充习题答案46到51页所有答案请你都告诉我! 5题 6题 7题列式 五年级下册数学练习册答案55-58 数学六年级下补充习题46——48答案拜托啦 六年级下册数学练习册90页答案,要列式的哦,好的加分! 苏教版数学补充习题66~68答案要算式 苏教版六年级下册数学配套练习册86---95页答案苏教版六年级下册配套练习册! 人教版六年级下册数学配套练习册答案10到12页 68答案要算式 小学六年级下册数学苏教版练习册的第102页10.1111(1):一个长方形的长减少6厘米,面积减少30平方厘米,剩下的部分正好是个正方形,求原来的长方形面积是多少? 要有意思,列式( 六年级下册数学配套练习册15——21页答案人教版最好有公式的,会答的答,不会答的,别说什么不让抄啊 苏教版六年级上册数学补充习题65 2010至2011六年级下册数学期中试卷苏教版 谁有北师大版六年级下册数学练习册72、73页答案我不确定我写的对不对,我想对一下题 小学六年级上册数学补充习题六十八页上的答案快帮帮我吧,给你们跪下了~~~~(>_ 六年级上册数学配套练习册64页 北师大版六年级下册数学练习册答案5页 小学数学苏教版补充习题六年级上册71-72答案 六年级上册小学语文配套家庭练习册11课第五大题第一小题答案老人是聋子吗?你是从哪里看出来的?用“波浪线”标一标……以后,每天清晨,我都到小树林去练琴,面对我唯一的听众,一位耳聋 小学6年级下册北师大版数学练习册答案(只要29 30 31 32页的) 人教版五年级上册数学书第67页第7题怎样做?快、、、、、、、、、 小学数学配套家庭练习册 六年级上册第10页第三大题第五小题答案. 六年级数学练习册下册北师大版86页答案 五年级上册数学书第6单元67页最后一题做怎么写? 1.甲、乙两数的比是5:6,甲比乙少2,甲数是( ),乙数是( ).这么算出来的. 篮球场长28米,宽15米.把它画在边长为30厘米的正方形纸上,选择怎样的比例尺比较合适?画好后的篮球场长和宽各是多少厘米?(要算式,有依据) (六年级下学期数学帮你学75页2题) 人教版五年级上册数学课本第67页第4题 小学数学配套家庭练习册(北师大版) 六年级下册的数学练习册答案 41页、42页、43页答案. 图上距离 实际距离 比例尺 25cm 50km 280km 1:400000还有 0.6cm 4:1人教版的,芝麻开花的快! 苏教版六年级上册数学练习册50到57页答案 苏教版六年级上册数学书第67页第九题小明、小华和小军分别用4元各买一种水果.小明所买的水果重五分之四千克,是小华所卖水果的五分之二,是小军所卖水果的五分之三.他们各买了什么水果 青岛版六年级数学上册配套练习册50页计算题答案! 六年级上册数学练习册【66页】折扣——能力扩展体育服装专卖店根据市场需要,决定调整某款运动套装的售价.调整的方案如下:运动衣打八折,运动裤提价20%.这样每件运动衣和每条运动裤 人教版八年级上册数学书第66页的14题 谁有青岛版六年级下册数学配套练习册49页综合练习答案? 1、一根长方体木料的横截面是边长为5厘米的正方形。已知该木料长120厘米,这跟木料的体积是多少立方厘米?2、一个长5米宽4、5米高2米的无盖木箱,容积是多少(木板厚度忽律不计)3、 五年级上册数学书最后一页应用题(算式也要) 青岛版小学五年级下册数学配套练习册42页答案 急! 果园里桃树和杏树共180棵,桃树的棵树是杏树的3倍,桃树和杏树各有多少课?甲、乙、丙三个数的和是490,甲是丙的4倍,乙是丙的2倍.甲、乙、丙各是多少?三个连续自然数的和是246,求这3个数甲、 66页应用题答案 谁能告诉我小学人教版数学六年级配套练习册第36页的答案? 数学练习册五年级上册76页答案 小学五年级数学上册课本应用题的答案 六年级下册数学配套练习册第六单元综合练习答案人教版会的帮帮忙,不会的别说一些废话啊!整个大题(四)算一算不用给,其他的. 五年级上册数学练习册60页 小学6年级上册数学课本66页答案 六年级数学下册练习册63 一个工地用汽车运土,每辆车运X吨.一天上午运了6车,下午运了5车.这一天共运土( )吨,上午比下午多运( )吨.商场上午卖出电视机10台,下午卖出去7台,每台电视机a元.全天买电视机一共收入 在一个长25厘米,宽12厘米,高20厘米的长方体玻璃缸中放入一个棱长9厘米的正方体铁块,然后在玻璃缸中加入一些水,使铁块完全浸没在水中,当铁块从水中取出时,玻璃缸中的水会下降多少厘米? 数学六年级下册练习册54页要的是那种皮子和教科书是一样的练习册哦!只有54页的!我要的是53页的答案
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn