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

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下调试通过。

2013,谷歌的数据科学家都将干什么呢? Facebook“也”对服务器进行浸泡冷却 日本最大电脑商:Windows 8表现并不好 日均新增415个应用,Windows 8应用总数突破35000 百度推出图像搜索引擎“百度识图” 可基于图像实现全网人脸搜索 解决专利纠纷 RIM向诺基亚预付6500万 巨头的得意与失落:2012移动游戏十大收购案 Mozilla或许将发布iOS平台浏览器Junior Mozilla:Facebook手机将采用Firefox OS Anonymous2013年将放慢脚步,McAfee预测遭质疑 一周消息树:Facebook公布2012年Hackathon大赛顶级“黑客作品” HTML+CSS+JS 开发 Firefox OS 应用编程实战 前端开发工程师如何在2013年里提升自己 Java受Objective-C影响很大 而不是C++ Instagram回击报告指责:用户仍保持增长态势 回顾:2012年科技行业十大败笔 苹果地图入选 Amazon CEO Jeff Bezos:好年景,大挑战 2012年度盘点:移动互联网大事件回顾 详解Amazon Redshift 移动周报:再见,2012!你好,2013! 英特尔或在2月宣布其电视计划:提供分类频道 Prismatic:用机器学习分析用户兴趣只需10秒钟 谷歌布局亚太地区数据中心建设 服务响应速度有望提升30% 2013年移动互联网行业技术趋势前瞻 老骥伏枥志在千里:回顾微软这一年 2013或将崛起 水落石出:在与谷歌苹果竞购创业公司中微软胜出 用扁平化的界面设计吸引用户 2012年12月份全球主流浏览器市场份额排行榜 冲榜不一定要刷榜:增加游戏曝光度的7大杀手锏 科技vs政治:FTC对Google的反垄断调查结束背后 威胁百度:奇虎360确认将与谷歌达成合作关系 哪里有Rose2000? MMGG Redhat7.2Ftp,硬盘安装问题求救! 请问怎样设置phpmyadmin带用户名和密码的登陆界面? 本来打算跳楼的,想想还是先来这试试...... 下面代码有什么用? 想问一下关于BDE和ADO组件的对应关系 就是这本《VC++技术内幕》……哎……我认了…… MSSQL2000 为什么我的log文件拼命往上涨 如何将用jsp得到的数据用javascript显示出来? 关于画声音波形曲线的问题.高手请帮帮忙(效果像flash加入声音时那样) TNND , 连个回复都不行 , 真恶心 (yeti_lee) 信用卡代理网站的可靠性 关于sqlserver联接问题帮一下了在线等待 小问题,高分啦!!:) 真的没有高手么,真的没人会么? 我为了使鼠标指向SpeedButton上时它的Caption颜色改变,在SpeedButtonMouseMove()和PanleMouseMove()中写了代码,但是很不敏感,鼠标移动快一点,就会有延时? 如何在Delphi5种调用windows自身的拨号网络实现点到点通过modem连接 回贴老是出错(该页无法显示。。。),试试发主贴怎么样。 哎!!!!帮帮忙吧!!!!!!! 高分求助!!!谁能告诉我在ASP下上传任意文件? 一个很菜的问题,和var有关 关于其他数据表/库文件转换进MySQL库的问题 请问在win98 下面安装 SQL Server 7.0 DESKTOP版 需不需要哪台机有网卡?? 关于网络设计师考试? 再发一次吧。昨天发晚了,人少.比较BCB和DELPHI我差点哭了,原来是这样,我以前的看法错了。BCB,你的路还长.BCB真比DELPHI慢得多,你们认为呢,有谁一起比过呢?来说说吧 对于SDK(win32 api)精通、熟悉、了解或者正在努力中的同志,希望能多多交流.qq:4911756 如何控制2000域用户上网权限 有没有用来关闭计算机的函数或消息呀! 很菜的问题,不要错过机会阿。拿分把 请问从哪里可以下载到免费的jsp的编译软件,谢谢帮忙!! 难得问问题,给个高一点的分,win95下的驱动程序怎么移植到windows me下面?(问题圆满解决可以加到400分,剩这么点了,呵呵) 谁能告诉我几个Activex控件的下载网址,我给他分 关于dll在代理中的运行问题?(H) 分在里面拿!http://www.csdn.net/expert/topic/374/374827.shtm 在程序员大本营的2001borland版上有一个插件叫maxspace,谁帮忙破解一下时间限制? 救命啊!sos..sos.. 我快不行拉! 哪里有wise for windows installer的使用说明? 遍历表字段名的问题? 上传文件是否可以设置默认文件? 谁能告诉我几个Activex控件的下载网址,我给他分!!!! 能否提供些,好书(数据库方面),好的学习DELPHI的网站 怎样判断闰年,有原代码吗 怎么样获得鼠标是否在一个控件上的事件。 我用的是RetHat7.2的Gnome桌面,问题多多? 求救!!!请问怎样实现用电脑给手机发送短消息! 送分啦:怎么改变Static Text 的背景颜色? Linux下的JDK,问题大,谢谢帮忙?50送上 有关VB中的操作系统的版本的判断 再来一次,那次人太少.比较BCB和DELPHI我差点哭了,原来是这样,我以前的看法错了。BCB,你的路还长.BCB真比DELPHI慢得多,你们认为呢,有谁一起比过呢?来说说吧 我的程序把DBE改为ADO连接的后就不能识别parambyname了,why? 怎样以《生命的最后一分钟》为话题写一篇作文~如题 十万火急!求会写的来? 点歌 作文或春天的对联作文1000字 不要抄袭有没有好一点 餐桌上的语文(作文) 怎么写 一名公交车司机行车途中突发心脏病,在生命的最后一分钟里,做了三件事这个话题怎么写一篇800字的作文 作文《点歌》《春天的对联》在今天回答对了问题的再追计加50分.顺便问一下隋、唐中武将排名前十名是哪几个?3Q 读书心得和读后感一样吗?老师让写读书心得,我不知道是不是指写某书的读后感还是写自己看书的感受. 成功的秘诀是什么? 安徒生童话集读后感400字以上 《点歌》《春天的对联》的作文要怎么写啊,我的作业就靠你们了, 用英文写“读《安徒生的童话》有感”200字左右.要中文 《安徒生童话集》读后感400字以上 有没有关于"点歌"“春天的对联”的作文? 感悟自信 短文300字左右 优美句段300字 请以“家”为话题,写一篇作文,不少于600字. 我渴望自信 300字作文 用10个成语写一句300字的句子!就是句子了啊! 我要找关于伞的600字作文 求初中作文《我的好朋友》!急求初中作文《我的好朋友》!要写有营养的!不要千篇一律的! 西游记的优美句子 300字 以 生命 为话题的作文 我的好朋友1000字初中作文怎么写还有和她最难忘的事 精彩句子,不少于300字给我8份,我们是每天摘抄精彩句子(300字)好的会追加的.不用一段300字.但是要写明几个字,比如:请将您的疑问告诉我们吧(11字) 800字以上,题目分别是说伞和餐桌上的语文,请大家给点思路啊 令我难忘的一天 800字范文要有点内含的啊.至少是初三学生的水平. 《因为有你》作文800字 作文 我的好朋友500字左右 文明礼仪我先行 初中作文1000字 因为有你,所以美丽作文800字写人叙事 800-----900字之间 英语散文一篇...快乐为主题..300词左右..好的追加分.. 有关于奉献生命的作文题目 有关鼓励的作文800字,在百度里找不到的额这在百度里都看过了 怎样写关于生命为话题的作文 生命因什么而精彩怎么写 《在生命的最后一分钟》作文按要求作文:一名公交车司机行车途中突发心脏病,在生命的最后一分钟里,做了三件事:—— 把车缓缓地停在马路边,并用生命的最后力气拉下了手动刹车闸; 读后感和读书征文是否一样?读后感和读书征文啊一样?要准确的.另外,原文有一句话是“做一个道德高尚的人是需要毅力的,道德高尚的人绝对不是一朝一夕就能够培养出来的。”如果我认 最顽强的生命 作文要500字 在生命的最后一分钟 扩写怎么写,400作文,急在生命的最后一分钟 扩鞋怎么写5 - 解决时间:2008-6-11 20:27 一名公交车司机行车途中突发心脏病,在生命的最后一分钟里,做了三件事:——把车缓 求篇关于军训的英语文章120词以内 懂英语的来不要写得太好 简单点就行了 因为我要交上去的 我本人水平不高 又没时间写 不要复制的要当场写的 关于“生命”的内容的作文题目星期一要交, 童话大师安徒生读后感100字张士骏的《童话大师安徒生》的读后感,100字左右就行了.只要100字!写的好的, 心得体会和读...有感的区别是什么?在给我一篇1000字的心得体会,读名著的 读了张士俊的《童话大师安徒生》的读后感急,500字,一小时内有效. 急!求一篇关于党的作文,必须是读后感,最好以“在党的阳光下”为题,字数一千字左右.一定要是原创啊!必须是读后感! 读了此文有何体会和感想 找回自信 我的好朋友作文 读后感共读心得怎么写?这个暑假老师要求我们和家长一齐写五篇读后感,现在读后已经写完了,还差评论,我按照那里的要求写:应征作品须附有学生家长对孩子的阅读成长经历或者亲自共读心 这件事真____ 作文400字 什么是我的好朋友 作文 以成长为话题的作文600字,要写男生的!解决了有重谢! 自信的作文400字 对读书的认识与感想 以“收获”为话题的600字作文,有谁知道?不要太深奥,谁知道,我真是佩服他!寒假快完了,5555.各位同胞们,为了咱们祖国的未来,一定要加油哈~ 爱,给我信心,作文,急———————啊————————快,400字 读一本书的读后感和阅读心得(200字左右) 餐桌上的语文 1000字作文怎么写 以《点歌》和《春天的对联》为题目各写一篇500字以上的作文.字数别太多了只写《点歌》! 餐桌上的语文,
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn