首页 > 解决方案 > 仅从父信息构建 TreeView

问题描述

我正在尝试建造一棵树。对于每个元素,我拥有的唯一信息是他所指的父级的 id。

我有三个不同的记录:

Type TRecord1 = Record
                  ID            : Integer;                
                  Name          : String255;
                  Res           : Array[1..500] Of Byte;
                 End;

//------------------------------------------------------------------------------

Type TRecord2 = Record
                   ID            : Integer;                   
                   Parents       : Array [0..4] of Integer; 
                   Customer      : String100;
                   Res           : Array[1..500] Of Byte;
                 End;

//------------------------------------------------------------------------------

Type TRecord3 = Record
                   ID            : Integer;                   
                   Parents       : Array [0..4] of Integer; 
                   Datas         : String20;
                   Res           : Array[1..500] Of Byte;
                 End;

对于数据存储:我有一个文件用于一种记录,它存储该记录的所有数据

Record1 始终没有父级。Record2 和 Record3 始终至少有 1 个父级(最多 5 个 => 父级数组)

在此处输入图像描述

Record2 可以是 Record2 的父节点,等等......它们之间没有层次结构,除了 Record1 始终是根节点。

如何有效地构建相关的树视图?

我可以首先构建 Record1 节点,这将是树的第一个节点。然后对于每个这个节点,我必须找到与这个节点相关联的 Record3 的 Record2,等等,等等......这似乎会花费太多时间。

任何想法从另一种方式创建树?

目前,我将 TreeView 保存在文本文件中,并在节点和相关记录之间建立了链接。但是我想从数据中创建 TreeView 而不是在一侧有一个 TreeView 而在另一侧有一个数据

标签: delphitreetreeview

解决方案


我猜您的记录项的 ID 是唯一的,因此可能会逐渐分配给每条记录。这意味着旧记录的 ID 号低于新记录。

因此,您可以先按 ID 对所有记录进行排序,然后从 ID 最低的记录开始,向 ID 最高的记录进行。

现在,如果您的所有记录都可能只有一个父记录,那么这肯定会假设您始终在其任何子记录之前创建父记录。

但是,由于您的记录可能有多个父项,因此您可能会遇到当前记录中的一个父项引用您尚未添加到树中的另一条记录的情况。

我猜您可以通过分两次执行此操作来避免这种情况,在第一次通过时,您尝试将当前记录的节点相对于第一个父节点定位。然后在第二遍中,为其余的父母添加连接。


推荐阅读