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

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

云中游科技CEO张帆:畅谈“找你妹”的自营销 Oracle当心,MySQL原始团队已重整旗鼓! 优秀的Meteor学习资源 ThoughtWorks美女分析师:如何规划企业在线数字渠道战略? OpenStack将怎样影响软件行业? 知识产权日特稿:谁动了程序员的源代码版权? MIT技术评论评选2013十大突破性技术:深度学习居首 Chrome测试版添扩展程序 可直接浏览Office文档 Ubuntu 13.04携中文衍生版UbuntuKylin 13.04发布 Spark核心开发者:性能超Hadoop百倍,算法实现仅有其1/10或1/100 移动开发的碎片化时代,我们该怎么办? 谈应用分发控制力:还是渠道为王 Unity亚洲开发者大会:手游半衰期越短,开发者手中的机会越多 《割绳子》开发者:俄罗斯双胞胎的奋斗史 曾应聘Rovio未果 Win7系统上常见IE 10问题汇总 如果苹果推廉价手机,市场份额会不会超过安卓? 移动互联网下,如何做儿童新音乐? 第三届“中科杯”全国软件设计大赛正式启动 注重稳定性 Docker 0.2.0发布 何谓机器学习 机器学习能做些什么? 艰难的决定:EA裁员10%,殃及PopCap 或提前落地!Amazon和Facebook急聘SDN工程师(Python优先) 轻松完成网站提速:来自Google、淘宝等的Nginx PageSpeed模块 Touch-Pay发布 移动联通在手机游戏领域联合推融合计费SDK 如何组织大型JavaScript应用中的代码? Robert Scoble:戴Google Glass两周后 再也不想摘下它 赶时髦?Facebook CEO 2013年将领取1美元年薪 蓝港在线CEO王峰:我在网络游戏行业十年从业记 CMDN Club 27期:从儿童音乐教育到移动碎片化管理 聚焦全球移动市场——你所不知道的俄罗斯 MemSQL:号称世界上最快的内存-关系型数据库 兼容MySQL但快30倍 怎样恢复被损坏的"本地用户和组" 小弟在线等待,一小问题,,大家来帮忙?? 求jsp树的原代码 最好是jsp+js+xml 执行效率要高。(从数据库中动态生成的)在线 关于多层结构中事务处理的问题. VB6.0升级到VB.NET的问题。 在ASP中使用ActiveX Control ADOTable表名如何在运行时“递进” 这样的待遇能招到人吗? 不好意思,问个技术问题。其他版实在没人气!只好来这问! 不爽,辞职,散分! 在线等待(100)往一个表的字段赋值,怎么不行啊! 急!在线等待! 如何把一个窗体内嵌到另外一个窗体的指定位置? 电源键设置问题 假设有一个变量CString str,调用str.GetBuffer(ncount);上面函数的参数应该为多少,才能取得缓冲中的全部字串值? 如何做局域网中的机子通讯 有关Enumerations的问题 请教英文语法检查的算法. 给些提示或参考资料好吗? 简单的关于对话框关闭的问题 关于新闻联播! 哪位有USB1或2.0的开发文档或相关资料? 关于JAVA的问题!请教高手~! 在delphi中用什么样的函数可以将十六进制数转换成十进制? 在MotoSDK3.1的moto388c上模拟正常,但换成T720出现严重问题。 开发“办公小助手”,我准备用VB开发,各位给点思路! 在2000下telnet到Solaris机器,c++编译的问题 droplist 女人啊女人 无法进入系统了,请大家帮我看看怎么回事。谢谢! 如何通过串口来读写数据? 急!想要得到机器安装的物理内存数量!最好还能得到锁定的内存数量! 如何在编辑框中输入完后,按回车鍵能响应到一个确定按钮 在delphi 程序中 如何控制 sql server 服务器的启动与关闭,也就是把 sql server 的服务停止,也就是屏幕右下角的 sql server 服务器中的 [欢迎讨论]J2EE之EJB与MySQL 金山毒霸升级的注册码。。。。。。。 请PB高手来看看,因对我今后DW设计会有很大的影响,请尽量详细些。 关于分辨率的问题 发神经,送分了 请教:如何做屏幕保护程序? 如何让窗口自己记住一些东西,100分可以吗? 高手,请教局域网计算机被侵入的问题?(急) 一个很奇怪得问题,急需各位大虾得帮助 请教~~要分我给的 如何知道一个数是否在in一个动态数组中(不知数组的Length)? 我运行了一個程序,我所开的窗口在任务栏里就都不显示了,我該怎麼辦啊? 菜鸟问题: 请提供一个能学习 j2ee 开发的实例。 很简单的几行代码,为什么编译通不过? 如何捕捉动态控件的事件 FORTRAN程序转VB程序 关于打印机的问题, 为什么用writeprinter,已经加入打印任务, 但打印机没反应?代码如下 在盛有等质量且过量的镁粉和铁粉的烧杯中,分别加入质量和质量分数相同的稀硫酸,这个图正确吗 乃左手持卮中的乃是什么意思 同一种化合物中一种元素氧化另一种元素...有什么例子? 浊度和浓度有什么区别 乃左手持卮.乃的意思 孩子作业不认真该怎么办 大学英语4选择题题号:1 We have kept ___ our friendship by writing to each other,so we are true friends.a、upb、backc、offd、down题号:2 Wealthy as he is,he is not ___ with his money,unwilling to help others in troubles.a、carefulb、gen 乃左手持卮的“持”是什么意思? 古文欣赏 懂文言的朋友帮忙解释一下哦!既然有缘,何需誓言;今日种种,似水流年;昔我往矣,杨柳依依;今我来思,雨雪霏霏;明明如月,何时可掇;但为君故,沉吟至今;言即遂矣,至于暴矣;反是不思, 帮忙把这篇白话文翻译成文言文吧!跪求啊!我叫某某某,是某地的人.因为五行缺水,所以叫某某某.活泼好动,性情豪爽.喜好运动,技艺很高.遍地绿树红花,安逸自在. 喜跃抃舞,弗能自禁在古文的含义请尽快解决 色度 浑浊度 用英语怎么说?急 英语翻译其体源出於《国风》.陆机所拟十四首,文温以丽,意悲而远,惊心动魄,可谓几乎一字千金!其外“去者日以疏”四十五首,虽多哀怨,颇为总杂.旧疑是建安中曹氾王所制.“客从远方来”、 2A(g)=B(g)可逆反应,恒温恒容下,增加B气体,则A的体积分数怎么变 晨光一缕魁七彩,尔否俱汝观今朝. 英语翻译1.外婆家的那水,那房那人那请成为了我一生中的最美好的回忆,紧锁于心,此生珍藏.2.你是否还记得?那年夏天你拿着蒲葵扇,在月下为我讲革命年代的故事. 如何测试麦克风能否说话原来的不行 新买的耳机好像别人也听不见 只有杂音 急 孟子曰:“舜发于畎亩之中,傅说举于版筑之间,胶鬲举于鱼盐之中,管夷吾举于士,孙叔敖举于海,百里奚举于市.故天将降大任于是人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所 如何控制孩子完成作业的时间(培养孩子独立完成作业的能力) 用万用怎么测麦克风 求关于浮力的知识点及难题,及高二物理(人教版)目录及重点目录(仅目录) 配位化合物和金属有机化合物有什么区别? 怎样测试麦克风是好还是坏的 请会文言文懂文言文的朋友帮我个忙!在工作中,我一直以“高调做事,低调做人”为准则!但是,做事高调不代表我骄傲,做人低调不表示我软弱!只要问心无愧就够了!-------这句话用文言文怎么说! 有机酸根和金属组成的化合物是有机物吗 有关爱情的文章或经典语句,要是向往美好的那一面的...还有批评那些可恶的小人的高素质语句...有没有水准点的啊?好的有分加哦注意!:我是女生诶.. 我家的鸡怎么不下蛋了 金属的羰基化合物属于有机化合物吗 可逆反应与物质体积分数的变化!⒈在盛有足量A的体积可变的密闭容器中通入B,发生反应:A(s)+2B(g) 5C(g)+D(g);△H 显微镜的物镜成什么像?目镜成什么像?望远镜的物镜成什么像望远镜的物镜成什么像?目镜呢?通过哪3种颜色搭配,可以得到其他颜色蓝色是单色光吗将太阳分解成各色的光的现象是色散对吗一 询问化学反应等效平衡时会有的性质.例如:在恒温,定容的条件下,有A+BC+D,四者状态皆为气体.第一次:投放A 1MOL ,B1MOL.第二次:投放A 2MOL ,B2MOL.请问这两次等效平衡的反应,A的转化率是否相同? 超简单英语问题,高价请高手!呃呃呃,虽说简单却要认真哦~30分,加油啦,等一个小时几对问答(一组问答给五分)比如说:1.Which is bigger,the sun or the earth?The sun is bigger than the earth.2.which is the bigge 鸡不下蛋是为什么请养过下蛋母鸡的朋友作答,希望能解决问题.要多少多少.ps.已经检查过了,是母鸡. 化学反应平衡与等效平衡题已知可逆反应2X+2Y=(可逆号)z+2w,有2个连通的容器A、B其容积为开始时均为a,A容积不变,B容积可以变化.在B中放入2molX,7molY,A中放入4molX,14molY.开始时A、B间是用隔板隔 怎么判断可逆反应中各物质的体积分数变化 鸡不下蛋什么原因7个月大的鸡 就是不下蛋什么原因 化学反应限度中的等效平衡 古文本是什么东西呃 某种即热饭盒用混有少量的铁粉的镁粉与水反应提供热量.将该混合物分成四等分,进行实验,其中所得实验正确的是( )实验操作和现象 实验结论A 用磁铁充分接触混合物,磁体上附有少量黑 唐太宗觅人才 古文 氯化铜能和二氧化碳反应吗 怎样才能判定平衡移动后物质的百分含量是比原来增加还是减少 唐太宗觅人才的翻译 为什么多用电表测电阻时,要在指针指在表盘中间附近位置读数? 平衡正移,正反应反应物的百分含量一定下降么? 谁懂文言文 同学说说倍感世间苍凉 闲云野鹤也难逃浑浊之气息 纵有成天然之大气 飘渺风沙不见幽魂 诸不知上古悠悠也为此黯然伤神 凡绚烂璀璨之物大多都有独到之处 或是不为人知 或是 与人体从外界吸入的气体相比较,呼出气体中总是氧的含量减少,而二氧化碳含量增多,其根本原因是?A气体在血液中的运输 B肺泡内的气体交换 C气体在呼吸过程中的扩散作用D组织细胞氧化分解 为什么“当某一组分的百分含量不随时间变化时,不一定达到了平衡”?如题:为什么在判断一个可逆反应是否达到化学平衡状态时,“当‘某一组分’的百分含量不随时间变化时,不一定达到了 讨论函数f(x)=x/(x-3)在区间〔0.3〕上的连续性根开闭区间有关系么? 小孩子写作业时不认真怎么办 悬浮物和浊度有什么区别 补铁的维生素是多少维生素多少是补缺铁性贫血的: 孩子写作业太慢,上课不认真,怎么办才能明显见效 向一定质量的稀盐酸中加入镁粉至过量,若下面图像中横坐标表示镁粉的质量,则纵坐标表示A.溶液的质量 B.稀盐酸的质量C.氯化镁的质量 D.生成气体的质量这道题为什么选C不选Ded 要测R1电阻,R是已知道滑动变阻器(没画好) 滑片最大值时,电流表=I1最小时 为I2那为什么R=(I1*R1)/I2-I1 怎么办啊,孩子作业不认真写,也很浮躁. 浊度<1度什么意思?代表什么? 我问什么鸡不会下蛋? 小孩写作业不认真有哪些办法? 尼日尔逮捕127名拟穿越撒哈拉沙漠移奇数为男偶数是女?2013年是“男性斯里兰卡对新建赌场“亮红灯”抢滩自贸区浙商在行动 不少企业打算到杭马今天上午开跑 开车出行请注意临时瑞安公益组织要求会员缴费 质疑称交钱东京涩谷万圣节上演“僵尸袭城”(组图日本便衣警察街头扫黄被男妓围殴 打成美到令人窒息!日本人气观光地精选 第特稿:逐梦海外 情系祖国——改革开放朝鲜海军军官执行任务时殉职 金正恩前德媒:德美将达成互不监听协议 拟明年温州一电镀工业园内16家企业 350F1年度世界冠军塞巴斯蒂安座驾亮相沈德媒:德美将达成互不监听协议 拟明年“中国梦”拥有世界舞台德媒:德美将达成互不监听协议 拟明年奇数为男偶数是女?2013年是“男性不堪昂贵房租 伦敦上班族住巴塞罗那坐走进马达加斯加塔马塔夫华侨学校世界最贵“粉红之星”钻石亮相纽约 估为给儿子治病倒卖药品他获刑五年江苏职工、居民养老保险崔永元2亿天价代言家具是否继续延迟“对接”高铁,看周末的客下月起南京柴油升国V 每升涨0.45江苏“单独两孩”政策 28日起实施 基金调侃:再买就剁手不得无故缺会或请人代会13城市市树市花淋一场花瓣雨,观郁金香斗艳,美翻了李娜:不用场内指导因我足够强大 卡洛李娜期待结束连败北京1200万奖金没发出去 苏群:第绝处“新”生!夫妻俩在钱上做记号 钟点工被抓“现行于画于情 读于友善画作江苏省高速公路条例 8月1日起实施韩非艺术简历省级纪委书记由中纪委提名“自住型商品房”试点为整治受贿官员,汉文帝发明“羞愧疗法
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘