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

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

【问底】Michael G. Noll:整合Kafka到Spark Streaming——代码示例和挑战 2014年手游和社交游戏行业重要趋势解读 腾讯副总裁罗道锋:共建全国最大安全云库 5分钟内数据精准共享 Connected Cycle 一举两得的智能自行车踏板 CES可穿戴产品前瞻:汽车厂商入局智能手表领域 果断Mark!国外程序员收集整理的PHP资源大全 Google 2015项目前瞻:智能隐形眼镜、Google X、Ara Swift的坑:如何实现enum的多选? Swift,其实没那么任性 如何利用单台服务器实现10万多个Git仓库托管 Swift的初始化方法 TIOBE 2015年1月编程语言排行榜:JavaScript成大赢家 为什么iOS开发不需要Storyboard? 仅有纽扣大小的开发板 Intel Curie “撒娇”的豌豆荚?被百度手机助手屏蔽太糟心! 【工具推荐】Pgcli—自动完成和语法高亮的Postgres命令行工具 CES 2015:挑一款机器人带回家? 夜行、睡眠与健康:CES 2015十款酷炫的可穿戴产品 Java 9中新的货币API 唯“简”不破,Apple Watch App的设计之道 Google Glass从X labs“毕业”,更换项目负责人 不进化,则消亡——互联网时代企业管理的十项实践 RedMonk 2015年1月编程语言排行榜:进击的Swift! 微信开放JS SDK,这场web巨变意味着什么? 盘点一些iOS开发技巧:Swift和Objective-C 2014年,那些“颜值”爆表的UI动画 《近匠》爱加密:谁说iOS应用不需要保护? SwiftColorArt:开源易用的Swift图片类库 人气爆棚 干货满满 中国电信天翼开放平台开放日圆满落幕 必须Mark!43个优秀的Swift开源项目推荐 治拖延、疗懒癌!安利12款提高工作效率工具 编程男友和淘气女友!绝配!!!! 企业管理器很慢? 关于窗体的问题 我明年打算考中程,到底难吗? 网络编程 为什么我的mdb数据库不能设置对象指针可以移动啊? 急啊!!!有没有做过论坛发帖机啊能否帮我一下就是怎样提交CSDN论坛的注册信息然后得到左边的树列表和右边的列表 本人做系统时有一个操作员列表,为使每个操作员的密码保密,想在数据表据中将密码用*号代替,怎么办? 怎么檢測一個線程是否已經創建? 解密软件,哪里找 美萍VOD是怎么实现不用网络共享而完成点播的呢? com入门问题2 jb8+Weblogic配置后,在jb8中不能编译jsp文件,但java文件可以编译 哪里有好的控件下载,介绍几个好的网站!!! 一个很久没有解决的问题,请各位指教。 高分求救程序 我装RASPPP软件的时候,他要我的数字签名怎么办? javaBean 是否能在应用程序里面调用??怎么调用?? 企业管理器很慢? 100分求解,急!请大家帮忙 请教:新建论坛在客户机上能访问,在服务器上却报“Microsoft VBScript 编译器错误 错误 '800a03f6'” 怎么把别人的代码窗体文件,加到自己的工程里? 权限问题 怎么用一控件去调用另一控件? 请教~~~~ Struts中的事件 如何在点击鼠标左键的时候,弹出一个弹出菜单? 求JBuilder8的下载地址,下完给分! Help!各位大俠,關于SQL查詢專業性的問題.....多多指教,在線送分! 两个菜鸟问题 急!急!急! 能不能用Socket类来实现广播,怎么实现发送和接收 为什么在98系统下Ado控件就不能用了,在线等! 关于在c++ builder中定义的类的编译时的问题 关于网络的简单问题 real media 插件哪里有急!! Tomcat连接池 请问一下哪里有Lotus5.11的下载啊! 怎樣使CrystalReportViewer里選擇打印機後可以預覽(200分) 怎么在一个控件中去调用另一个控件 小弟公司的项目用vss管理,请大家给小弟一个vss电子书好吗,大送分啊~~~~谢谢! MM求教各位 寻<<the c++ programming language>>中文电子版 请问各位,本人有C/C++的基础,学习C++ Builder 好学吗 请教关于Date 的一个问题 我在前台管理记录的时候误删除了几条记录,怎么样才能找回来 我在数据库里的记录是这样的,“ test",每行的前面有若干空格,为什么在网页上显示时,把我前面的空格给去掉了 [劲爆]关于小仙妹的秘密!雍亲王首次披露!!! 着急~~~~~~~~~~ 求crm开发方案一套!!! Bios改不了,哪位大佬帮帮忙? 对frame窗口传参的问题 从0,1,2.9十个数任意取出三个数,三个数包括0但不包括5,求概率 我们可以很容易地看清别人,而很难甚至无法真正看清自己,进而摆不清楚自己的位置和态度,无论是刚入社会的职场新人,还是已打拼了十几二十几年的老鸟.看清自己,才能更好地掌握自己的情 1.It ( )again A.rains b.raining c.is rains d.to rains 2.There()get much sunshine a.don'tb.doesn't c.also d.to rains 3.We don't want you to() a.go away b.goes away c.going away d.away 为什么猫要吃老鼠?如题 闪闪发光的意思 闪闪发光的意思是什么? 你回家了吗?说说你的幸福感吧!温馨是形容家的!幸福是形容人的!说说回家的幸福感!内容不限、但不少于七百字! 用一张长25厘米,宽18厘米的长方形纸围成一个圆柱.这个圆柱的底面周长是()厘米,高是()厘米.还可以围成一个底面周长是()厘米,高是()厘米的圆柱,这个圆柱的侧面积是()平方厘米 用什么精美的词语介绍好一件衣服 为什么9成的女人比男人长命 用where提问地点时,什么时候在句尾加介词 美媒:失业者重找工作需要做的五件事外媒曝查尔斯不想当国王 王位或将越代美媒:中国能成为生物技术领域领导者吗美霸主地位逐渐丧失 “去美国化”引争港媒:华人强烈抗议“杀光中国人”言论俄外长与联合国叙问题特使讨论筹备叙问联合国-阿盟叙特使称伊朗应参加叙问题法国正式要求美国停止监听行为 希望低中国养老困局难解 老人:不知十几万够求同存异破壁垒 两岸携手打造中华文化日本欲解禁武器出口 妄图“一箭三雕”中国气象局以风险防控管理推进反腐倡廉老广扎堆去新加坡过年 节前个人签证办北京:加快清洁能源改造 改善空气质量浙江企业品牌建设需两轮并驱 十年或迎西藏将立法保护布达拉宫韩国士兵因用洗衣机清洗步枪被判监禁6泰陆军总司令:军方不会发动军事政变“行走日光城”将启动 陈坤成拉萨首位成都市十六届人大二次会议举行第二次全国际足球周末直播计划:尤文米兰皇马出美国拒绝日本TPP会谈请求 或与安倍天命游戏最后一份心灵留给我瞳印带着技能槽闯世界天南星血狼眼熊猫的异世界之旅此去江湖天玄战魂龙翔天地间天心神道巴松湖国家森林公园旅游世界柏树王园林旅游桃花沟旅游香山鹭岛旅游友谊大桥旅游天目湖山水园旅游满陇桂雨旅游松州古城旅游万名塔旅游百年城雕旅游陆水湖旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘