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

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

企业号热问热答——来深圳微信开发者大会聆听一线讲师的实战分享 AngularJS 1.3.0正式发布 超光速发展! 学个痛快!十款不容错过的Swift iOS开源项目 HTML5:助力智能电视生态实现新跃迁 MDCC 2014移动开发者大会公布全部议程 求更密集!Apple Watch SDK将于11月正式开放 【答疑】微信开放平台开发者资质认证 专访Informatica亚太和日本区副总裁Murray Sargant:中国公司正考虑数据资产货币化 Facebook又开源:让iOS应用界面极致流畅的ASDK框架 一周消息树:盘点史上最具毁灭性的软件Bug 微信公众平台设备功能支持个人开发者接入 2014中国移动开发者大调查第三批获奖名单曝光 微信企业号上线,带你看看它的真面目! OpenStack Juno版本发布——支持Spark和NFV 【十问十答】对话Go语言开发团队 苹果要求、Android开始,64位时代真的来了! MDCC 2014产品与设计论坛:带你发现产品之美 Java开发者值得关注的7款新工具 助力国产移动产品出海,UCloud部署北美节点 Zack Parker:用EC2在Cotap上打桩 用卫生棉杀敌冲关!两个高中女生的创意游戏 专访《Java程序员修炼之道》作者Ben Evans:保守的设计思想是Java的最大优势 Google收购Firebase 帮助程序员快速开发出移动App和Web App 微信支付开发关键点技术解析 游戏任玩!开源虚拟现实头戴式设备Open DoVision MDCC大会召开倒数10天 看Twitter、Facebook和国内“BAT”三大巨头最新动态 《近匠》Wijmo 5 CTO:从Web到移动,我的25年编程生涯 重复充电、防丢失!多功能智能行李箱Bluesmart 【设计经验传承】图标设计初阶要先型 “光年”光纤路由 支持千兆网络的家居中心 MDCC 2014移动开发技术与平台峰会:知名应用技术大牛传授实战经验 如何编程来获知某一进程从产生到结束期间所有的系统调用 初學者請大家幫我看一下這個問題了,謝謝! NetBios名与Dns名的问题,请教 win2000或XP环境下的打印走纸问题 pl/sql 中 delete 记录 请问大家有谁知道北京市软考的报名时间吗?在什么地方报名?先谢了! delphi中的字体问题 高分求救,关于数据库图象保存的问题?? 计算机网络可以虚拟现实,但不能虚拟感情。 关于注册表的几个问题? (高分!!!) 我的vc6为什么不支持模板特化 怎么实现这个对话框的功能?谢谢 如何判断表单没有某个对象??? 怎样删除ListBox所选的内容??? 问大家一个超级难的问题,来者有分啊 请问如何把string类型转换为int类型啊? 我的msdn怎么了! C语言 在局域网中怎么才能使linux访问Internet? 我要问一个烂问题哈哈! 打印 华泰贝通,北京创智你去那家? 学习vc++,我离不开书,或者说了开书后,我什末也做不了,我该如何继续学习? 华泰贝通,北京创智你去那家? 简单问题:PB6.5中调用SQLSERVER的procedure! 打印 怎么去掉单文档视图中的菜单 华泰贝通,北京创智你去那家? 哪里有IDE技术规范的中文资料下载? 华泰贝通,北京创智你去那家? 哪里有IDE技术规范的中文资料下载? 如何把从文本登录该为Xwindow登录方式呢? 华泰贝通,北京创智你去那家? /***VC 6.0 的两个操作*/ 有关编译错误,百思不得其解!!(菜鸟那分) 怎么实现程序的换肤功能呢?? 怎样实现左连接(left outer join),右连接 这个网站制作费能值多少?? 怎样处理异质链表? 报表打开的时候缺省为最大化状态,怎么样为设计时候状态? 除了梅尔森式外,还有哪个比较好用的质数生成式?(要100位左右的) 如何在英文版的WINDOWS2k上输入中文? 为了提高大家专家分的质量,希望大家不要再散分了! 我在sun的网站上下了jdk1.4,请问怎么把JBuilder6的jdk升级到jdk1.4? 大家给推荐windows程序,sdk编程的入门好书(不是MFC的)言者有分 我在http://soft.jx163.com/上下载了JBuilder7但不知道怎样得到注册码 有没有其它免费空间(要支持ASP的) 为什么每次打开水晶报表都要求输入oricle数据库的密码和用户名,这些可以在程序里面完成吗?可以再crystalreportviewer空间里面实现翻页 请解释一下ASSERT()函数的作用 informix问题,紧急求救 求救!高手请进来 太平天国运动的作用和局限性有哪些? 举例说明正义的可能的局限性 含有赞扬和喜爱的感情色彩的成语 哪的薯类淀粉设备最好 举例说明"公平是相对的" 如图,已知菱形ABCD的边长为3,延长AB到E,使BE=2A,连接EC并延长AD交延长线于F,求AF的长. 薯类算菜还是淀粉? 举例说明公平与效率矛盾,谢谢. 如图,菱形ABCD边长为3,延长AB到E使BE=2AB,连结EC并延长交AD延长线于点F,如果△EBC~△EAF,试求AF的长 这张图是什么意思.你们的理解是什么. 正义之师必胜 举例说明!嘻嘻~ 有一批货物,第一天运走1/4,第二天运的是第一天的3/5,还剩180t没运,货物共多少t 这个图的意思. 在word中怎么画出角的符号标?看图! 有一批货物,第一天运了这批货物的1/4,第二天运的是第一天的3/5,还剩下90吨没有运,这批货物共有多少吨不要用方程 有谁知道,此图的意思?成语…… 如图,已知○O中弦CD与直径AB交于点P,角APC=45°,AP=1,BP=3,则弦CD=多少 有一批货物,第一天运走了这批货物的1/4,第二天运的是第一天的3/5,还剩下180吨没有运.这批货物有多少吨甲、乙两人原来的钱数比是7:3,现在甲拿出60元给乙,这时甲、乙两人的钱数比是2:3,求 有人理解这张内涵图的意思不? 如图,AB是圆O的直径,弦CD和AB相交于P,且APC=45,若BP=2,AP=8,求CD的长如图,AB是圆O的直径,弦CD和AB相交于P,且∠APC=45°若BP=2,AP=8,求CD的长 有一堆货物,第一天运走了这批货物的4分之3,第二天运的是第一天的5分之4,还剩下180吨没运.这批货物有? 我想问下《气瓶安全监察规程》,不是《规定》!最新版是不是2000年的, 文明礼仪的诗句有那些? 按不同的感情色彩给成语分类两袖清风 闻风丧胆 义正词严 夸大其词 以生作则 得意洋洋 张牙舞爪德高望重 有头无尾 埋头苦干 填褒义词和贬义词的分类 举一个生活中可以体现比较优势理论的例子,是生活中的哦 一道数学立体几何题在三棱锥S-ABC中,SA、SB、SC两两垂直,且SA=1,SB=根2,SC=根3,则空间一点O到S、A、B、C等距离d的值是多少? 感情色彩不同的一对成语 怎样理解李嘉图的比较优势理论李嘉图的比较优势理论和亚当 斯密斯的绝对优势理论的相同和不同点 什么可以物质可以被氢气还原?最好举多点有机物的例子,什么有机团可以被氢气还原最好举一些有机物 描写感情色彩不同的两对成语 比较优势理论英文定义 圆锥的高与母线的夹角是45°,圆锥底面半径是3,求;圆锥的高,母线的长和轴截面所谓面积 可乐混薄荷糖会引起化学反应,实验中很多人用的都是曼妥思薄荷味糖和口香糖.那能用别的薄荷糖吗?比如:普通的薄荷硬糖、薄荷凉糖等,徐福记的薄荷硬糖什么的. 将这类薄荷味硬糖加入 斯密的绝对优势理论和李嘉图的比较优势理论的区别与联系尽可能的详细点.... 氢气还原氧化铜生成什么物质 感情色彩不同的成语 数学立体几何一题 用足量氢气还原氧化铜后留下的红色物质是什么若试管内部附着它,为何不能用稀盐酸浸泡除去? 可乐与曼妥思是发生的化学反应么? 过已知点M画已知直线AB的垂线EF,标上垂直符号,有几种情况? 语言是不是文化传播交流的重要途径之一? 4个感情色彩安全一样的表示“笑”的成语 2Rt三角形ABC所在的平面外一点S,且SA=SB=SC,D为斜边AC中点,(1)求证:SD⊥平面ABC(2):若AB=BC求证BD⊥面SAC 【文化的交流传播是文化创新的重要形式】这句话对不对? 还有什么像曼妥思加可乐的化学反应 食品中淀粉的测定,样品水解处理时应选用下列(A) 洄流 (B) 蒸馏 (C) 分馏 (D) 提取 两条垂线相交的点叫( ),画垂线时要标注直角符号. 甲乙丙三人打水甲打一桶3分钟 乙大一桶2分钟 丙大一统1分钟,他们打完水最少一共等待多少分钟 图乘法计算位移的原理是:A. 叠加法计算位移;B. 积分法计算位移;C. 虚功原理计算位移;D. 位移法 甲乙丙3人同时到1个自来水龙头前打水,甲打满一桶水的时间是4分钟,乙是2分钟,丙是1分钟,他们按定顺序打水,从开始打水到三人都打完水,按怎样的顺序排列,才能使等候的总时间最短?总时间是 甲、乙丙三人分别拿着2、3、1、个热水瓶去打水,打满要用1分钟,怎样安排他们打水次序使他们所花时间最少包括等候时间 荷载作用下的位移计算,图乘法? 六个人各自拿一个水桶在自来水龙头前等侯打水,他们打水所需要的时间分别是1分 2分 3分 4分 5分和6分,试问怎样适当安排他们打水顺序才能使每个人排队和打水时间的总和最少?并求出最小值 硫的化学方程式 《气瓶安全监察规定》最新版是那一年的 向下排空气法收集氨气所得气体的密度是相同条件下氢气的10倍将此气体倒置于水中,瓶内液体的高度将上升A 1/2 B 3/4 C 2/3 D 1/3 一道数学立体几何大题正三棱柱ABC-A1B1C1的底面边长为2,侧棱长为√3,D为BC上的一点,在截面ADC1中,∠ADC1=90°.求:(1)二面角C1-AD-C的大小;(2)点B1到平面ADC1的距离. 如何理解法的局限性法理学方面的, 用向下排空气法手机一瓶氨气,气体密度是氢气的10.5倍,若将瓶倒置于水槽中(按极易溶于水),水上升到容器的( )处A3/4 B1/3 C2/3 D充满这整个容器 薄荷糖放在可乐里就会象喷泉一样喷出,什么原因
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘