求一个类似于TTreeNodes的类,但是他不关联到界面

trainbox 2010-06-11 10:24:56
如题
...全文
106 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
haitao 2010-06-12
  • 打赏
  • 举报
回复
jcl的代码有点晕,还是接着自己写吧:

const
Tnil=0;

type
Pnode=Integer;
Tnode=packed record
pF,pS,pN:Pnode; //father,first son,next
//level,index:Integer;
//count:Integer;
dataIni:String; //可以放一个字符串,也可以放:a=123;b=xyz;c=... Ttreenode没这个只有data,经常要分配空间
dataInt:Integer;
bFree:Boolean;
end;
Ttree=class
private
nodes:array of Tnode; //[0]==nil; [1..n]
i0free:Integer; //它之前的单元都使用了
procedure useNode(p:Pnode); //初始化一个单元节点
procedure freeNode(p:Pnode); //释放一个单元节点
function newNode:Pnode; //取得一个可用的单元节点
public
constructor create;
destructor destroy; override;
procedure packdata; //使得空间与 实际使用单元数 一致,没有任何浪费 -尚未实现

function NodeAddBrother(p:Pnode):Pnode; //为p增加一个弟节点
function NodeAddSonLast(p:Pnode):Pnode; //为p增加一个子节点,作为最小的儿子
function NodeAddSonFirst(p:Pnode):Pnode; //为p增加一个子节点,作为最大的儿子

procedure NodeDelete(p:Pnode); //删除节点p,及其所有的各级子节点
procedure NodeMoveSon(f,t:Pnode); //把节点f搬移作为节点t的最小的子节点
procedure NodeMoveOver(f,t:Pnode); //把节点f搬移作为节点t的最小的哥节点

function NodeRoot:Pnode; //第一层(根)第一个节点
function NodeSon(p:Pnode;i:Integer):Pnode; //取得p的第i个儿子(从0算起)
function NodeLevel(p:Pnode):Integer; //取得p的层次级别(从1算起)
function NodeSonCount(p:Pnode):Integer; //取得p的儿子数量
function NodeSonCountAll(p:Pnode):Integer; //取得p的各级子节点数量
function NodeBrotherUp(p:Pnode):Pnode; //取得p的最小的哥节点
function NodeBrotherDown(p:Pnode):Pnode; //取得p的最大的弟节点
function NodeFather(p:Pnode):Pnode; //取得p的父节点

function NodeIni(p:Pnode):String; //取节点的字符串内容
function NodeInt(p:Pnode):Integer; //取节点的整数内容
procedure NodeSetIni(p:Pnode;s:String); //设置节点的字符串内容
procedure NodeSetInt(p:Pnode;i:Integer); //设置节点的整数内容
end;
haitao 2010-06-12
  • 打赏
  • 举报
回复
item[i]好像还好,取节点的AbsoluteIndex很慢。。。。。。。
Harryfin 2010-06-12
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 bigbiga 的回复:]

是需要一个tree吧?
建议自己写一个,锻炼一下自己的数据结构,
TreeNode 操作起来性能不是很好,特别 item[i], 如果结点多,又在for 里面,会非常慢。
[/Quote]
性能方面完全没感觉,TreeNode层面的遍历又不会导致界面的重绘。
iamduo 2010-06-11
  • 打赏
  • 举报
回复
其实我也想要一个这种东西。
有谁有兴趣的写一下。
拿出来大家用用。
希望能有效率的执行。
麦客来了 2010-06-11
  • 打赏
  • 举报
回复
类库永远不可能直接拿来作为业务类来使用。

需要的话,直接写一个就好了。
Harryfin 2010-06-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bdmh 的回复:]

先说明想要做什么,这个类要干嘛,不关联到界面是什么意思,单独的tTreenode也不关联界面
[/Quote]
TTreeNode是界面相关的,因为它必须依赖于TTreeNodes,而TTreeNodes又和TCustomTreeView耦合了。

楼主要表达的意思很简单,就是想找一种通用的树结构的类或接口。
Harryfin 2010-06-11
  • 打赏
  • 举报
回复
delphi这方面做得不好,没有把这种常用的结构单独分出来。

楼主需要自己写代码实现这种结构,其实也不难,用一个ObjectList记录下子节点,然后循环访问和释放就行了。
limingzhao 2010-06-11
  • 打赏
  • 举报
回复
问题不够具体啊,至少贴些代码出来分析下吧。
trainbox 2010-06-11
  • 打赏
  • 举报
回复
就是类似于TTreeNodes类,但delphi里,TTreeNodes类是关联到一个TTreeView组件的,我这里需要的是去掉TTreeView的TTreeNodes类,实现一个无界面的树形类
bdmh 2010-06-11
  • 打赏
  • 举报
回复
先说明想要做什么,这个类要干嘛,不关联到界面是什么意思,单独的tTreenode也不关联界面
bigbiga 2010-06-11
  • 打赏
  • 举报
回复
是需要一个tree吧?
建议自己写一个,锻炼一下自己的数据结构,
TreeNode 操作起来性能不是很好,特别 item[i], 如果结点多,又在for 里面,会非常慢。
myy 2010-06-11
  • 打赏
  • 举报
回复
jcl 中就有...
Catkin0502 2010-06-11
  • 打赏
  • 举报
回复
>.<
filec75 2010-06-11
  • 打赏
  • 举报
回复
帮 顶
filec75 2010-06-11
  • 打赏
  • 举报
回复
不懂,up
haitao 2010-06-11
  • 打赏
  • 举报
回复
const
Tnil=0;

type
Tnode=packed record
pF,pS,pN:Integer; //father,son,next
//count:Integer;
dataStr:String;
dataInt:Integer;
bFree:Boolean;
end;
Ttree=class
private
nodes:array of Tnode; //[0]==nil; [1..n]
i0free:Integer;
procedure useNode(p:Integer);
procedure freeNode(p:Integer);
function newNode:Integer;
procedure initnode(p: Integer);
public
constructor create;
destructor destroy;
procedure packdata;

function NodeAddBrother(p:Integer):Integer;
function NodeAddSonLast(p:Integer):Integer;
function NodeAddSonFirst(p:Integer):Integer;

procedure NodeDelete(p:Integer);
procedure NodeMoveSon(f,t:Integer);

function NodeSon(p,i:Integer):Integer;
function NodeSonCount(p:Integer):Integer;
function NodeSonCountAll(p:Integer):Integer;
function NodeSonUp(p:Integer):Integer;
function NodeSonDown(p:Integer):Integer;
function NodeFather(p:Integer):Integer;
end;
haitao 2010-06-11
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 qiume 的回复:]
自己写一个是不错的选择......
[/Quote]

有写的冲动,不过,感觉肯定有至少几十人写过了。。。。。。。。。
只是不知道拿什么词去搜才能搜到
qiume 2010-06-11
  • 打赏
  • 举报
回复
自己写一个是不错的选择......
haitao 2010-06-11
  • 打赏
  • 举报
回复
哦,业务类里啊。。。。。。。
Treeview的确好用,可惜是基于win32的系统控件。。。。。。

纯粹的树形数据结构,好像Tstack/Tqueue都有了,还真没有树。。。。。
Harryfin 2010-06-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 sz_haitao 的回复:]

把Treeview隐藏掉就可以了
[/Quote]
没有人会在业务类里隐藏个TreeView的
加载更多回复(3)

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧