Delphi中根据分类数据生成树形结构的最优方法

一、 引言:

TreeView控件适合于表示具有多层次关系的数据。它以简洁的界面,表现形式清晰、形象,操作简单而深受用户喜爱。而且用它可以实现ListView、ListBox所无法实现的很多功能,因而受到广大程序员的青睐。

树形结构在Windows环境中被普遍应用,但在数据库开发中面对层次多、结构复杂的数据,如何快速构造树形目录并实现导航呢?

二、 实现关键技术:

在Delphi提供的控件中包含了TreeView控件,但树的具体形成还需要用户编写代码。即它的列表项要在程序中动态添加,而这些列表数据通常由用户已录入在数据库表中,并作为数据库维护的一项内容。

许多人用TreeView构造树形目录时,通常都使用多个嵌套循环,或递归算法,将代码“编织”成树。这样不但算法复杂,且运行效率低下,不是最佳选择。这里介绍的是基于编码结构的高效算法。该算法的主要优点是:程序短小精悍,运行效率高,能快速实现数据库的树形结构,可以适应任何复杂的层次数据,实现方法简单,且树的内容有变动时,无需更改程序行。

算法的关键在于代码字典表中的代码字段的设计上一定要符合一定的代码设计要求,数据类型使用字符型。用户新增和修改代码时,必须有严格的约束,否则会导致程序出错。编码表的基本字段包括编码和编码名称,其编码规则是以数字、字母的位数来区分不同层次,同一层编码位数相同,层次按位数递增,程序通过判断编码位数来决定所在层数。

本例程中编码结构是“222”,编码格式为 “XX XX XX”。例如:第一层为10~99两位,第二层为1001~1099四位,用户需要做的是先要设计树的结构和对应编码,并录入相应名称,然后程序在读取这些数据时形成树。本例程不需要用户自己进行编码,程序中自动实现各层编码,保证了代码格式的正确性。

用TreeView导航表时,采用弹出式菜单,通过对话框操作数据表,同步更新树形控件和数据库。在所有操作中,树形控件不用重构,从而避免了重构时TreeView控件出现的闪动,也提高了程序的运行速度。

本示例程序为了使大家看清楚数据表中记录是否同步更新,用TDBGrid控件显示当前数据库表中所有记录。下面给出范例程序和主要代码分析。

三、 范例程序和主要代码分析:

我们以建立一个城市名称的树形结构为例来说明如何快速生成树形并实现导航数据表。

1. 先建立编码表:city_tree(bianma,cityname)。

2. 新建一个项目,按默认保存。

3. 新建一公共单元pubvar,在其中定义以下常量:

Const

cTreeCodeFormat = ‘222’;//编码格式为 XX XX XX

cTreeMaxLevel = 3;//最大编码层次

cTreeRootTxt = ‘城市’;//树根结点名称

这样做为了提高程序的通用性,以后用于其他代码字典的维护时,只需要更改这些特征常量。

时间: 2024-12-25 18:31:44

Delphi中根据分类数据生成树形结构的最优方法的相关文章

不用递归实现树形结构的一种方法

递归 不用递归实现树形结构的一种方法 主要的技巧在Level(帖子回复深度)的操作上 SunADM 于 2000.07.26____________________________________________演示表的结构____________________________________________ 表名:BBS 字段数据类型说明ID自动编号 RootIDInt根帖ID,本身为根帖则RootID = IDFIDInt父帖ID,上一层帖子的ID,如是根帖则FID = NULLLevel

生成树形结构根据数据库中的省市区数据

问题描述 我从数据库中已经得到json,怎么实现树形结构,我知道ztree但是它的json要求必须是idpid但是我的字段没有这些参数,怎么办呢 解决方案 解决方案二: 你的json数据是怎样的,实在不行自己封装个tree对象,jquery也有好多tree,但是个人觉得ztree还是比较不错解决方案三: 你要安装树形插件要求的数据格式去组装你的数据

jQuery EasyUI框架中的Datagrid数据表格组件结构详解_jquery

基础DOM结构什么叫"完整的基础DOM结构",这里"基础"的意思是指这个结构不依赖具体数据,不依赖Datagrid的view属性,只要存在Datagrid实例就会存在这样的基础DOM结构:而"完整"的意思是指在冻结列,冻结行,标题,footer,分页这些功能块都存在时候的DOM结构. 要搞清楚Datagrid的工作原理,这个DOM结构必须要烂熟于胸的,我们直接来看这个"基础完整DOM结构"是什么样子的: <!-- dat

在Delphi中使用DBF数据

Delphi是美国Inprise 公司开发的功能强大的Windows 应用程序开发工具.她是可视化应用程序开发环境.可重用性面向对象编程语言.快速编译器和数据库技术的完美结合. 由于Delphi具有运行速度快.功能强大.易于学习和使用且开发迅速等特点,并支持XML和HTML,支持 Web 和Internet的开发,一直受到广大用户的喜爱. 国内PC机上使用最普及历史最长的数据库是DBF格式的数据库,即是dBASE II.dBASE III和FoxPro中使用的数据库格式.为了充分利用已有的数据库

mysql 复制表数据,表结构的3种方法

 什么时候我们会用到复制表?例如:我现在对一张表进行操作,但是怕误删数据,所以在同一个数据库中建一个表结构一样,表数据也一样的表,以作备份.如果用mysqldump比较麻烦,备份.MYD,.MYI这样的文件呢,操作起来也还是麻烦. 一,复制表结构 方法1: mysql> create table a like users; //复制表结构 Query OK, 0 rows affected (0.50 sec)   mysql> show tables; +------+ | Tables_i

php中使用uniqid mt_rand 生成随机不重复字符串的方法

方法一: <?PHP      $str = uniqid(mt_rand(),1);      echo 'sha1: ',sha1($str);      echo '<br>';      echo 'MD5: ',md5($str); 采用uniqid函数,配合mt_rand随机函数,最后使用散列值得出最终唯一值. 但是通过测试中,发现随机数的唯一性有些相同部分,大概有11位相同的(但无大碍)   第二种方法:GUID <?PHP        echo sprintf('

Delphi中如何备份数据表为insert 脚本

unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Data.DB, Datasnap.DBClient; type TForm1 = class(TForm) cds: TClientDataSet

三层delphi中 mapx绑定数据的疑问

问题描述 使用ado控件绑定数据表到图层允许没问题,但三层的应用如何搞,有弄过的不一下使用ado时map1.datasets.add(midatasetado,adotable1.recordset,......)因改成了三层应用数据控件换成TClientDataset,怎么也搞不定这块了midatasetado肯定是不合适了,弹出异常,Thespecifiedsourceisnotanadorecordsetobject看文档说添加datasource换成midatasetdelphi比较合适

ASP.NET生成树形显示的GridView实现思路_实用技巧

目的:生成树形结构的表格数据(EasyUI也有TreeGrid,此处只是提供一个思路),可以扩展单击展开/收缩节点 图例: 类代码: 复制代码 代码如下: using System; using System.Data; /// <summary> ///GridViewHelper 的摘要说明 /// </summary> public class GridViewHelper { private string gridline; //连接线 private DataTable