如何遍历TreeView中某个TreeNode节点的所有子节点,并且将所有子节点的Text属性存储到一个动态字符数组 (50分)

  • 主题发起人 主题发起人 units
  • 开始时间 开始时间
U

units

Unregistered / Unconfirmed
GUEST, unregistred user!
如题,要求做成一个函数,返回值为动态字符数组,遍历的程序我有了,可当我尝试加上
存储动态数组的功能时总是有些问题,源程序如下,请大侠指教!!
-----------------
TSubNodeText = array of string;
function GetAllSubNode(SelNode: TTreeNode): TSubNodeText;
var
ChildNode, TempNode:TTreeNode;
SubNodeText: TSubNodeText;
begin
ChildNode := SelNode.getFirstChild;
while ChildNode <> nildo
//找到第一个子节点了
begin
SetLength(SubNodeText,Length(SubNodeText)+1);
SubNodeText[High(SubNodeText)] := ChildNode.Text;//添加Node的Text到字符数组
TempNode := ChildNode.getFirstChild;
if TempNode <> nil then
//如果还有子节点,则递归
begin
GetAllSubNode(ChildNode);
end;
TempNode := ChildNode;
ChildNode := SelNode.GetNextChild(TempNode);
end;
Result := SubNodeText;
end;
 

SubNodeText: TSubNodeText;
声明为全局变量,或是作为参数传递进去,现在每次第归都清除了,当然不行
另外
SubNodeText[High(SubNodeText)] := Node.Text;//添加Node的Text到字符数组
这一句应该是
SubNodeText[High(SubNodeText)] := ChildNode.Text;//添加Node的Text到字符数组
吧??
 
全局变量这个我也想到了,不过觉得不是很好,清萍大侠可否给一个传参数地
函数呢?请教
 
何必这么麻烦,一个循环就搞定了
procedure GetAllSubNode(SelNode: TTreeNode;
var
TNode: TTreeNode;
ary: Array of string;
i: integer;
begin
i :=0;
Setlength(ary,i);
TNode :=SelNode.getNext;
while (TNode<>Nil) and (TNode.Level>SelNode.Level)do
begin
SetLength(ary,i+1);
ary :=TNode.Text;
inc(i);
ShowMessage(TNode.Text);
TNode :=TNode.GetNext;
end;

要灵活使用Node的各种属性
 
另外,青萍大侠说得对,是ChildNode.Text,好眼力!
 
to tianjh007:
你的使用level来比较的方法我都考虑过了,事实使用时还是有些问题的,比如属状结构
如下
--a
--a1
--a2
--a3
--b
--b1
--b2
--c
--c2
--c21
--c1
--d
--e
这时,针对b节点的函数会把--c--c2--c21节点也算进去的
 
你把我的代码时一下就知道了,
TNode.Level>Node.Level
这个条件就把你的问题解决了
我刚刚才测试过
 
>全局变量这个我也想到了,不过觉得不是很好,清萍大侠可否给一个传参数地
我一般把这种变量放在form的private中,对其他模块没什么影响的。
楼上的代码确实是对的,呵呵,不明白。
 
TSubNodeText = array of string;
function GetAllSubNode(SelNode: TTreeNode): TSubNodeText;
var
ChildNode, TempNode:TTreeNode;
SubNodeText: TSubNodeText;
begin
ChildNode := SelNode.getFirstChild;
while ChildNode <> nildo
//找到第一个子节点了
begin
SetLength(SubNodeText,Length(SubNodeText)+1);
SubNodeText[High(SubNodeText)] := ChildNode.Text;//添加Node的Text到字符数组
if ChildNode.haschild then

GetAllSubNode(ChildNode)
else

ChildNode := SelNode.GetNextChild(ChildNode) ;

end;

Result := SubNodeText;
end;
试试这个,比你的代码要简单易懂!而且也没有错误!
 
没太仔细看,大概你要的功能这样改就行了.:
TSubNodeText = array of string;
procedure GetAllSubNode(SelNode: TTreeNode;var SubNodeText: TSubNodeText);<<
var
ChildNode, TempNode:TTreeNode;
// SubNodeText: TSubNodeText;<<
begin
ChildNode := SelNode.getFirstChild;
while ChildNode <> nildo
//找到第一个子节点了
begin
SetLength(SubNodeText,Length(SubNodeText)+1);
SubNodeText[High(SubNodeText)] := ChildNode.Text;//添加Node的Text到字符数组
TempNode := ChildNode.getFirstChild;
if TempNode <> nil then
//如果还有子节点,则递归
begin
GetAllSubNode(ChildNode,SubNodeText);<<
end;
TempNode := ChildNode;
ChildNode := SelNode.GetNextChild(TempNode);
end;
// Result := SubNodeText;<<
end;
 
to tianjh007大侠:
你的程序是对的,很奇怪刚才我用这个level比较作为条件结果就是不行,应该是我
写错了,不过原来的程序已经删除,要不可以找出来对比一下
 
哈哈,我也碰到了一个相关的问题,请教各位大侠了.楼主,借宝地一用,不好意思啦.[:)]
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1781312
 

function GetAllSubNode(SelNode: TTreeNode): TSubNodeText;
声明成
proceure GetAllSubNode(SelNode: TTreeNode;
var SubNodeText: TSubNodeText);

GetAllSubNode(ChildNode);
改成
GetAllSubNode(ChildNode, SubNodeText);
去掉
SubNodeText: TSubNodeText;
声明和最后一句
Result := SubNodeText;
 
接受答案,感谢!微薄分数,不成敬意
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
928
SUNSTONE的Delphi笔记
S
后退
顶部