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

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

Direct3D起步:教程以及资源指南-Delphi资料 播放背景音乐-Delphi资料 弹出、关闭CD-ROM驱动器-Delphi资料 检测声卡存在-Delphi资料 控制声音音量-Delphi资料 让pc speaker美妙动听-Delphi资料 闪动标题栏-Delphi资料 使用 DirectX 优化声音特性-Delphi资料 修改Delphi 3图形处理中的错误 用Delphi 3.0编制MP3音乐点歌台 用Delphi编制MP3音乐点歌台 用Delphi编制趣味动画鼠标 用Delphi开发屏幕保护预览程序 用DEPHI3.0实现动画ABOUT窗口-Delphi资料 在Delphi下用Direct Sound 实现混音器组件 在Delphi中使用DirectX BDE的替代品大全(按数据库类型分)-Delphi资料 BDE的替代品大全(按应用类型分)-Delphi资料 bde的组态文件-Delphi资料 DBGrid中的下拉列表和查找字段编程方法-Delphi资料 Delphi 3.0 中 连 接 数 据 库 的 三 种 方 式 Delphi 3.0中连接数据库的三种方式 Delphi 4中开发数据库控件的方法 Delphi:MIDAS中动态强制约束编程 DELPHI 中 自 适 应表 单 的 实 现 Delphi3数据库编程中的查找字段 Delphi3中 连 接 数 据 库 的 三 种 方 法 Delphi编程实现3DS动画的播放 Delphi访问ODBC数据库 Delphi如何实现在一个Dbgrid中显示多数据库 Delphi筛选数据 怎么在Installshield中创建对话框,并操作ACCESS数据库? 连续给分:邮件服务器防病毒问题! 我想编译一个像API一样的dll 启动rose就出错,高手来看,100分 关于打印的一个问题 急!!!请提供一段设置Session的全部代码,谢谢!! 请问,从第二帧开始播放的代码的什么??? 老师要求编写五子棋的程序可是我实在想不出该怎么设定估价函数啊帮帮忙啊? 感觉压力比较大,活不下去,想跳楼自杀的进来侃侃 一个关于php提交表单的问题。 各位大侠,要命问题! 怎么在Installshield中创建对话框,并操作ACCESS数据库? win2000server的管理员密码让人改了,怎么办呀! 太气愤了,帮帮我? 用BDE连接MS SQL SERVER,为什么运行后出现未知用户名或密码的错误? datagrid中能不能进行统计 如何编写“outlook”风格的界面 如何实现flash截图?我研究了好久也不明白,希高手指点!(在线等待) 程序调用的DLL 在delphi中,用ADO如何实现将SQL中多表导出到一个Access中? 无聊啊无聊 想考软工???? Socket奇怪的问题! foxpro中如何实现按一按钮启动word和excel,并且直接弹出打开文件对话框? 关于分级权限管理(300分) 紧急求救!!!!!!!! 客户端web服务是否需要别的控件支持 帮帮我,朋友们请进.... Datareport问题! [cclq]竞选斑主,附我的方针! 用VB编写自己的服务器端组件 DAO问题,CDaoRecordset::addnew()和CDaoQueryDef::Execute插入一条记录,哪个更快? 谁能解释一下这个比较模糊的问题?关于地图窗口HWND。 闲人免进!如何增加信誉分! 如何改变Mem控件中插入符的形状? 各位大虾有没有检测日期的合法性的JAVASCRIPT脚本啊 怎么在Installshield中创建对话框,并操作ACCESS数据库? 两个问题,关于struts中form的action如何传递一个变量?如何使用科学计数变成普通数值? 救落水美女注意事项 如何学习NOTES? 急!!急!!给多分呀!!! 寻在windows下安装bugzilla时缺少的两个文件。 菜鸟问题。。。。。。需大师回答啊 怎样由实例句柄得到传口句柄? 请问,VB的DataReport是否有支持套打的功能? 有关ant和struts的问题,急。 有人用Panorama来做自动化测试吗? 请问各位,如何用PHP来实现这个功能啊! 关于列换顺序的问题 请教用户帐户在不同域间移动 ? 代理问题? 直线AB,CD交于O点,OE,OF分别平分角AOC,角BOC,若角AOD:角EOC=4:1,求FOD的度数如图 三栋楼共用两个塔吊,垂直运输费怎样计取 英语翻译Care should also be taken with the compression of the video and the packaging of the DVD in order to best present one's work. 自然界的风声是由空气震动而产生的 是对还是错 双性恋心理是怎样产生的? 英语翻译_aid_ is a pile of pure shit.先填两个字母一个空一个,然后翻译 如果给物体加热 但物体无物态变化 是不是分子势能没有变化(无物态变化时分子间距离有没有改变?) 怎么让双性恋发现自己是双性恋?我是gay,喜欢一个男的,从种种举动上发现他是双性恋,要怎么让他发现他是双性恋呢?来点实际的办法.不过别太过就OK 一个正方形,如果一边增加6厘米,另一边增加2厘米,所得到的长方形面积比原正方形面积多92平方厘米,求原正方形的边长 请用小学的知识回答问题 急急!!明天就要交了 如何研磨胆矾 《生物化学》王镜岩上下册的课后题答案 将一个长方形的长上增加一厘米 ,宽增加三厘米 就变成了一个正方形.面积增加33平方厘米,求原来长方形的面求原来长方形面积的计算公式 求大哥哥大姐姐帮帮忙 水的蒸汽和胆矾研磨均属于什么变化?此过程什么发生了变化 求王镜岩生物化学第三版上下册全部的课后答案 酒香不怕巷子深,皇帝女儿不愁嫁表现了怎样的推销观念,其突出特点是什么 研磨根用什么样的工具好呢? 把下面句子变为否定句1.Park your bike in front of the classroom building.___ ___ your bike in front of the classroom building.2.Play basketball with your friends on the stree.___ ___ basketball with your friends on the stree.3.Be late for cl 将50g蓝矾完全溶解在150g水里求质量分数 小蝌蚪是怎样变成青蛙的,画一画 将下列句子改为否定句1、The boys often play in the playground.2、David learns a lot from this book.3、The hot cottee near the clock is for the doctor4、The girl in red studies veryhard every day.5、Stand in a line.6、She usually watche 50g CuSO4·5H2O溶解在150g水里,恰好饱和,此时求m溶质,m溶剂,溶质的质量分数 Cu--64 S--32 O--16 空着的如图,(1)OP是角MON的角平分线,C是 OP上一点,CA垂直OM,CB垂直ON,垂足分空着的如图,(1)OP是角MON的角平分线,C是 OP上一点,CA垂直OM,CB垂直ON,垂足分 别为A.B,三角形AOC与三角形BOC全等吗,为什 将下列句子变成否定句:1.We go to evening school at night.2.My brother works in a radio factory.3.Her name is Mei Ling.4.You have a red pencil.5.She has lunch at home.6.We have a meeting once a week.7.She has lunch at twelve. 研究运载火箭从点火到离开发射架的运动情况可以把对象看作质点吗? 增强的近义词和反义词 如图,正方形ABCD的边长为20CM,点E在边CB的延长线上,且EB=20CM,点P在边DC上运动,EP与AB的交点为F,设DP=x CM , △EFB与四边形AFPD的面积和为y 平方厘米,则y与x的关系式为 研究长征2号运载火箭从点火到离开发射架的运动情况,能否将火箭看做质点,为什么,具体回答,答到重点研究投篮过程中篮球能否进入篮圈时 篮球能否被看做质点?,我认为能,因为决定篮球能否 已知:如图,OP是角MON的角平分线,C是OP上的一点,CA垂直OM,CB垂直ON,垂足分别为A,B.问角BEC与角OD 正方形ABCD的边长为10cm,点E在边CB的延长线上,且EB=10cm,点P在变DC上运动,EP鱼AB的焦点为F.设DP=Xcm,(接上面)△EFB与四边形AFPD的面积和为ycm²,求y与x之间的函数关系式(要有步骤) "鲨鱼,章鱼是鱼类吗 "增强"的近义词和反义词增强的近义词和反义词,急 如图,正方形ABCD的边长为8,点E在CB的延长线上,EB=4,点P在CD上运动(C,D两点除外),EP与AB交于点F,若CP=x,四边形AFPD的面积为y,求y关于x的函数关系式(要有过程啊!) 请问巨大八爪鱼是什么鱼? OP为∠MON的角平分线 点C在OP上 CA⊥OM CD垂直ONOP为∠MON的角平分线 点C在OP上 CA⊥OM CD垂直ON 垂足分别为AB 求线段AB与直线OP的关系. 在四边形ABCD中,AB//CD,AB=CD,E在CB延长线上,且EB=BC,DE交AB于F,求AF=FB 曼妥斯与可乐的反应最近看电视和网络上说“把一种东西放进可乐里就可以产生喷泉效应” 曼妥斯是什么东西? 我估计我们这里可能没卖的, 哪能用什么东西代替?我非常想体验一下.要放几 用线挂一个重物做匀速圆周运动,线长易断还是线短易断?为什么? 当两个相同的物体摩擦时会起电吗快利用一些容易起电的同种材料进行相互摩擦,两个摩擦表面就能够出现带电现象。通过进一步的实验表明:两个表面所带电荷为同性电荷,并且有的材料 如图所示,已知∠MON,OP为∠MON的平分线,在OP上任取一点C,过点C作OM的垂线,垂足为E,垂线为CE交ON于B点,过点C作ON的垂线,垂足为F,垂线CF交OM于A点.问AC于BC相等吗?请示说明理由. 已知直边和15°角求斜边(计算方法) 两个相同的物体摩擦后为什么会互相排斥?我们老师都做了实验,两个相同的物体摩擦后确实会产生排斥,因为我在加拿大,我们i老师解释是用法语,我不是很明白,所以想问问各位大神, 有什么好的动物学的入门书籍要动物学的,最好是哺乳动物.可以的话,再推荐一些天文学的入门书籍,呃,一楼那位,你推荐的第一本书是动物学的吗,能给个中文的书名吗,看不懂的说~二楼,是动物 直角三角形求斜边长度.请告诉公式和计算方法拜托各位大神直角三角形,已知底边长2.7米,高2米,求斜边长度.请告诉公式和计算方法,还有答案 明治维新的积极,消极影响,以及评价,后人影响.求 对历史有爱好的人士更好,最好可以结合中国当代说下,搞笑的说说.其内容如果能安排在10分钟~好的话会追分滴!能的话 结合更多的课外知识 有哪些非常棒的动物学系列书籍?现在有哪些编的内容齐全,版式又好的关于动物的书籍?最好是有关脊椎动物的! 双翅摩擦发声的有那些 海洋动物有那些不吃人也不伤人,还有会救人 请大家推荐一本好的有关于《动物学试验》的书(适用于初学者), 能和可口可乐发生剧烈反应的糖具体是哪一种?商品名?中国到处都买的到的? 什么动物是人最早训练的 独立费与税前包干费、税后包干费的区别 蚱蜢用脚摩擦翅膀来“唱歌”,请问是通过蚱蜢的什么振动,导致发声? 势能与密度的关系? 包干费是什么意思 华太油烟机质量怎么样使用寿命长不长?做工好不好 怎样的情况下会产生“双性恋”?“双性恋”的人,有什么特殊表现?如何纠正“双性恋”心理? He and I are fine,thank you. 可乐与什么糖果混淆会发生反应?我看电视时,一瓶可乐和糖果接触,结果可乐飞上天了!问那是什么糖? 我怀疑自己是双性恋,怎麼辨?双性恋是心理还是生理,基因影响的? 日本明治维新的内容 数万伊朗抗议者举行“占领美国使馆”集伊朗反美示威游行 纪念占领美使馆事件外交部:将协助芭堤雅沉船事件死伤中国嘉兴两车相撞致磷酸罐体泄漏 方圆几百全运会后至今未归队 孙杨因多项违纪事浙江桐乡获批中国首个旅游综合改革试点巴前总统穆沙拉夫获准保释 有望结束半日本东京华人聚集地开设“东方红”餐厅穆尔西出庭坚称仍是埃及合法总统 拒绝穆尔西出庭坚称仍是埃及合法总统 拒绝伊朗反美示威游行纪念占领美使馆事件3柬埔寨迎来“今日中国”艺术周浙江体院对孙杨做出停赛停训停止商业活肯尼亚大法官判轮奸犯“割草赎罪” 逾美国芝加哥机场电梯内惊现短吻鄂 来历穆尔西要求审判军方领导人 称政变是叛亚太地区主要股市下跌中美电影节洛杉矶开幕 中国电影界阵容韩国首次以地面电视方式播出3D节目外交部:已要求澳方就有关监听活动作出浙江省体育局处罚孙杨 停训停赛停商业“连降七级”背后的反腐加速度第三方支付暗战O2O手术前,打印个“脚模”给医生先练练宝宝收益几乎全军覆没演艺学院老师涉猥亵女生 约对方到酒店岱山、上坊推出限价房双汇投诉微信谣言《午夜计程车》为网络剧翻身扬州3名儿童先后倒下并选择一家适合自己孩子的复读学校内裤藏毒品 毒贩刚下火车就落网上海大众将推30周年限量版车型处突车备足灭火器靠拢地铁公交站投资计划很有必要ARJ21将进行“家族试验”北特科技18日登陆上交所京华时报江苏延长5个收费站收费期限称老鼠仓交易7.33亿获利3652万心灵捕手“薄铁皮”的安全原则
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘