我写的treeview的遍历 ,欢迎交流(0分)

  • 主题发起人 轻音乐
  • 开始时间
好的程序是:
简洁:不需要任何多余的一句代码。
易懂:结构逻辑都很清晰很规范,在没有注释的情况下有经验的程序员一般都可以看懂。
……
就这么两点最基本的能做到的话你的功力已经算是合格了。
 
delphilai,你自己检查一下吧,
你写的那段能遍历全部的树吗
 
楼上的你问的什么问题啊?我听不懂啊?我的只能遍历树的节点,不能遍历“树”。
通常用树做导航的程序都是在从数据库中 Load 节点的时候,先给树添加一个TopItem,以便后面的控制。之后把该TopItem最为参数调用递归函数就OK了。当然程序是死的,人是活的,我写的代码只是一个思路,万变不离其踪,如果你拘泥于某段代码,你就只能做“技工”。
 
Delphi自己的例子

var
CurItem: TTreeNode;
begin
CurItem := TreeView1.Items.GetFirstNode;
while CurItem <> nil do
CurItem := CurItem.GetNext;
end;
 
delphilai,你看清楚楼主写的帖子再说
我不想做什么人身攻击,可你有点太骄傲了,就算
你写的是遍历一个节点,也有问题,不信你测试一下,我是测试了才说的。
做技工也好,做项目负责人也好,只有谦虚和敬业才是最重要的
做程序之前先把人做好吧
 
楼主的意思是进行交流,DFW的宗旨也是交流学习,我们在这里就是相互学习,相互提高嘛!我要向各位学习!谢谢。
 
我在贴出这个主题的时候也看了一些别人写的遍历,但是讨论的都不是很详细,
比如有的帖子很简洁,但对于没有topnode或多个topnode的树就不能完全遍历,
也不能按顺序遍历。象‘delphilai’兄贴出来的就是这样。

其实我写这段代码是我在处理dxTreelist中用的,但叫dxtreelist遍历可能交流的人会少,
因而我的代码里没有TreeView1的一些属性。如:.Items。
至于用不用递归和会不会递归是两回事,不一定用了递归就是最好的,不用递归就很差。
有人看见goto就想吐,虽然goto不符合oo,但却可以增加程序的灵活性,谁知道不用goto能
跳出多重循环,我就改他的办法。
我开这个帖的目的就是想将这个问题好好讨论一下,老弟我已经撒出一把土了,
还请各位高人继续…………
建议各位贴出代码时最好把你代码的优缺点说出来,以利大家共同进步。
 
delphilai 那段递归改改,然后加上根节点的循环就可以了。
本来刚才想贴一个写好的,但是看到 menxin的,就算了,那
已经很好了
 
不知道是深度还是广度,没看出来,呵
 
to:yanyandt2,
------------
通常用树做导航的程序都是在从数据库中 Load 节点的时候,先给树添加一个TopItem,以便后面的控制。之后把该TopItem最为参数调用递归函数就OK了。当然程序是死的,人是活的,我写的代码只是一个思路,万变不离其踪,如果你拘泥于某段代码,你就只能做“技工”。
------------
我都懒得理你。

menxin 的例子跟大富翁WW的效果其实是一样的。

程序是人的思想,程序就象钞票一样,只是一种工具,是为人服务的,而不是人去服务程序。
 
看样子 delphilai 是个高手啊
有什么伟大的作品啊?拿出来牛一下吧
也让我心服
你自己测试一下你的东西,问题多着呢
还好意思在这里炫耀自己?不知天高地厚
 
yanyandt2:
我哪有你厉害啊,你的解法是最好的(不过我好像没看见),你很知到天高地厚 ,算了,我可不想跟你斗嘴。无聊之极。
 
就技术角度来讲,我比较认同delphilai的看法.
下面的过程是我在一个管理系统中的一个过程,与delphilai的写法基本一致(递归).
procedure SetChildStates(Node: TTreeNode);
var
ChildNode:TTreeNode;
begin
if Node = nil then Exit;
ChildNode:=Node.getFirstChild;
while ChildNode <> nil do
begin
ChildNode.StateIndex:=Node.StateIndex;
UpdateRight(ChildNode.Data,ChildNode.StateIndex = ICON_CHECKED);
if ChildNode.HasChildren then
SetChildStates(ChildNode);
ChildNode:=Node.GetNextChild(ChildNode);
end;
end;

 
你们的力气真多!

这不是闲得吗
 
我同意menxin的观点
 
同意menxin和WW的观点,递归也有其自身的弱点。
delphilai多数观点是正确的,但也用不着过分贬低与你不同意见的人。
至少我是不用TOPNODE的。
 
smokingroom,兄的与delphilai的类似也必须有topnode,
但输出的结果要比delphilai的工整一些
 
不用那么麻烦,看下面的:
var
i,level: Integer;
Node: TTreeNode;
begin
level:=TreeView1.Selected.Level;
for i :=TreeView1.Selected.AbsoluteIndex+1 to TreeView1.Items.Count - 1 do
begin
if level=TreeView1.Items.Level then
break
else
TreeView1.Items.Selected:=True;
end;
end;
 
To 轻音乐
两个问题:
1. Node.IsLast????
2. Goto为什么不用Exit?
 
还是 大富翁WW有眼力,
这里的goto这是为了减少一次node := node.GetNextSibling;
如果node已经是最后一个的话用exit会多执行一次node := node.GetNextSibling;
ISLast:是在dxtreelist里用的,判断是否是最后节点的
 
顶部