Home |
Search |
Today's Posts |
|
#1
![]()
Posted to microsoft.public.excel.programming
|
|||
|
|||
![]()
Hi,
I think the problem might be that your statement: For Each nodChild in MainForm.TreeView1.Nodes is wrong. This will direct the routine to start at the top of the tree each time. I would imagine you want something like: Option Explicit Dim sItems() As String Dim nItem As Long Private Sub Command1_Click() Dim i As Long nItem = 0 IterateTreeView tv1.Nodes(1) For i = 0 To UBound(sItems) Debug.Print sItems(i) Next i End Sub Private Sub Form_Load() ' Fill the tree for testing purposes Dim X As Node, Y As Node Set X = tv1.Nodes.Add(, , "N1", "N1") Set Y = tv1.Nodes.Add(X, tvwChild, "N11", "N11") tv1.Nodes.Add Y, tvwChild, "N111", "N111" tv1.Nodes.Add Y, tvwChild, "N112", "N112" Set X = tv1.Nodes.Add(, , "N2", "N2") tv1.Nodes.Add X, tvwChild, "N21", "N21" tv1.Nodes.Add X, tvwChild, "N22", "N22" End Sub Sub IterateTreeView(a_oNode As Node) Dim X As Node ReDim Preserve sItems(nItem) As String sItems(nItem) = a_oNode.Text Set X = a_oNode.Child If Not X Is Nothing Then nItem = nItem + 1 IterateTreeView X End If Set X = a_oNode.Next Do While Not X Is Nothing nItem = nItem + 1 IterateTreeView X Set X = X.Next Loop End Sub HTH Peter Beach "RB Smissaert" wrote in message ... Use a recursive Sub to traverse the nodes of a Treeview control from top to bottom. Noticed that there is a problem if 2 nodes in the Treeview have the same text. Rather than ending at the lowest node the sub returns to the higher node with the same text and the Sub doesn't exit. This are the 2 Subs that demonstrate it: Sub Tester(ByRef nodcurrent As Node, _ ByVal intdepth As Integer) Dim nodChild As Node If nodcurrent.Children 0 Then For Each nodChild In MainForm.TreeView1.Nodes If Not nodChild.Parent Is Nothing Then If nodChild.Parent = nodcurrent Then MsgBox nodChild.Text Call Tester(nodChild, (intdepth + 1)) End If End If Next nodChild End If End Sub Sub DoTester() Tester MainForm.TreeView1.Nodes(1), 0 End Sub Is this a known bug, or am I doing something wrong? One way to solve this problem is to fill an array with the indeces of the visited nodes and make sure the same node doesn't get visited twice, but perhaps there is a better solution for this. Thanks for any advice. RBS |
#2
![]()
Posted to microsoft.public.excel.programming
|
|||
|
|||
![]()
Peter,
The Sub is fine. It was just the typo as stated in my previous post. RBS "Peter Beach" wrote in message ... Hi, I think the problem might be that your statement: For Each nodChild in MainForm.TreeView1.Nodes is wrong. This will direct the routine to start at the top of the tree each time. I would imagine you want something like: Option Explicit Dim sItems() As String Dim nItem As Long Private Sub Command1_Click() Dim i As Long nItem = 0 IterateTreeView tv1.Nodes(1) For i = 0 To UBound(sItems) Debug.Print sItems(i) Next i End Sub Private Sub Form_Load() ' Fill the tree for testing purposes Dim X As Node, Y As Node Set X = tv1.Nodes.Add(, , "N1", "N1") Set Y = tv1.Nodes.Add(X, tvwChild, "N11", "N11") tv1.Nodes.Add Y, tvwChild, "N111", "N111" tv1.Nodes.Add Y, tvwChild, "N112", "N112" Set X = tv1.Nodes.Add(, , "N2", "N2") tv1.Nodes.Add X, tvwChild, "N21", "N21" tv1.Nodes.Add X, tvwChild, "N22", "N22" End Sub Sub IterateTreeView(a_oNode As Node) Dim X As Node ReDim Preserve sItems(nItem) As String sItems(nItem) = a_oNode.Text Set X = a_oNode.Child If Not X Is Nothing Then nItem = nItem + 1 IterateTreeView X End If Set X = a_oNode.Next Do While Not X Is Nothing nItem = nItem + 1 IterateTreeView X Set X = X.Next Loop End Sub HTH Peter Beach "RB Smissaert" wrote in message ... Use a recursive Sub to traverse the nodes of a Treeview control from top to bottom. Noticed that there is a problem if 2 nodes in the Treeview have the same text. Rather than ending at the lowest node the sub returns to the higher node with the same text and the Sub doesn't exit. This are the 2 Subs that demonstrate it: Sub Tester(ByRef nodcurrent As Node, _ ByVal intdepth As Integer) Dim nodChild As Node If nodcurrent.Children 0 Then For Each nodChild In MainForm.TreeView1.Nodes If Not nodChild.Parent Is Nothing Then If nodChild.Parent = nodcurrent Then MsgBox nodChild.Text Call Tester(nodChild, (intdepth + 1)) End If End If Next nodChild End If End Sub Sub DoTester() Tester MainForm.TreeView1.Nodes(1), 0 End Sub Is this a known bug, or am I doing something wrong? One way to solve this problem is to fill an array with the indeces of the visited nodes and make sure the same node doesn't get visited twice, but perhaps there is a better solution for this. Thanks for any advice. RBS |
#3
![]()
Posted to microsoft.public.excel.programming
|
|||
|
|||
![]()
Hi,
Glad you got it worked out. I'm still a bit puzzled by your code, as you seem to iterate through the entire tree each time, searching for your target node whereas it is surely more efficient simply to work down and across from the target node. The code I posted earlier only traverses the tree a single time which would seem to be more efficient. Regards, Peter Beach "RB Smissaert" wrote in message ... Peter, The Sub is fine. It was just the typo as stated in my previous post. RBS |
#4
![]()
Posted to microsoft.public.excel.programming
|
|||
|
|||
![]()
Peter,
Will give your code a try. RBS "Peter Beach" wrote in message ... Hi, Glad you got it worked out. I'm still a bit puzzled by your code, as you seem to iterate through the entire tree each time, searching for your target node whereas it is surely more efficient simply to work down and across from the target node. The code I posted earlier only traverses the tree a single time which would seem to be more efficient. Regards, Peter Beach "RB Smissaert" wrote in message ... Peter, The Sub is fine. It was just the typo as stated in my previous post. RBS |
#5
![]()
Posted to microsoft.public.excel.programming
|
|||
|
|||
![]()
Peter,
Given your code a try, but it doesn't work. UBound(sItems) gives 67000, which I presume is the limit of what the array can hold and it gets into an endless loop. The code I use now is actually very efficient as it passes every node only once. Have you tried both ways? RBS "Peter Beach" wrote in message ... Hi, Glad you got it worked out. I'm still a bit puzzled by your code, as you seem to iterate through the entire tree each time, searching for your target node whereas it is surely more efficient simply to work down and across from the target node. The code I posted earlier only traverses the tree a single time which would seem to be more efficient. Regards, Peter Beach "RB Smissaert" wrote in message ... Peter, The Sub is fine. It was just the typo as stated in my previous post. RBS |
#6
![]()
Posted to microsoft.public.excel.programming
|
|||
|
|||
![]()
Hi,
Odd. My code worked fine for me. The point I was making was that I can't see the purpose of the lines: For Each nodChild in MainForm.TreeView1.Nodes If Not nodChild.Parent Is Nothing Then If nodChild.Parent = nodcurrent Then which would seem to iterate through the tree until the target node is reached. But you already know what the target node is - it's either the first node (for the initial call) or the it's the node currently being inspected, so it seems to me that you don't need to go iterating through the tree looking for it. You can from the node recursively call the routine for the first child and then iterate through all its siblings. However programming is that art of achieving results, if your code works, stick with it. Regards, Peter Beach "RB Smissaert" wrote in message ... Peter, Given your code a try, but it doesn't work. UBound(sItems) gives 67000, which I presume is the limit of what the array can hold and it gets into an endless loop. The code I use now is actually very efficient as it passes every node only once. Have you tried both ways? RBS "Peter Beach" wrote in message ... Hi, Glad you got it worked out. I'm still a bit puzzled by your code, as you seem to iterate through the entire tree each time, searching for your target node whereas it is surely more efficient simply to work down and across from the target node. The code I posted earlier only traverses the tree a single time which would seem to be more efficient. Regards, Peter Beach "RB Smissaert" wrote in message ... Peter, The Sub is fine. It was just the typo as stated in my previous post. RBS |
#7
![]()
Posted to microsoft.public.excel.programming
|
|||
|
|||
![]()
Hi Peter,
I formulated the same comment (others have also agreed) to the almost the same question a month ago and got the same answer.. Basically, it is NOT efficient to iterate through all nodes of a Tree structure AND ALSO having recursive calls on each iteration. http://groups.google.com/groups?hl=f...TNGP12.phx.gbl (the thread is interesting too as it replicates this one!) BTW, your code works fine for me too. :-) Regards, Daniel M. "Peter Beach" wrote in message ... Hi, Odd. My code worked fine for me. The point I was making was that I can't see the purpose of the lines: For Each nodChild in MainForm.TreeView1.Nodes If Not nodChild.Parent Is Nothing Then If nodChild.Parent = nodcurrent Then which would seem to iterate through the tree until the target node is reached. But you already know what the target node is - it's either the first node (for the initial call) or the it's the node currently being inspected, so it seems to me that you don't need to go iterating through the tree looking for it. You can from the node recursively call the routine for the first child and then iterate through all its siblings. However programming is that art of achieving results, if your code works, stick with it. Regards, Peter Beach |
#8
![]()
Posted to microsoft.public.excel.programming
|
|||
|
|||
![]()
Peter,
Just tried your code on a tree with a structure as you gave in your code and on that tree it works fine. So it seems it doesn't work with me as I used a different tree. It seems therefor that your code needs altering somehow. RBS "Peter Beach" wrote in message ... Hi, Odd. My code worked fine for me. The point I was making was that I can't see the purpose of the lines: For Each nodChild in MainForm.TreeView1.Nodes If Not nodChild.Parent Is Nothing Then If nodChild.Parent = nodcurrent Then which would seem to iterate through the tree until the target node is reached. But you already know what the target node is - it's either the first node (for the initial call) or the it's the node currently being inspected, so it seems to me that you don't need to go iterating through the tree looking for it. You can from the node recursively call the routine for the first child and then iterate through all its siblings. However programming is that art of achieving results, if your code works, stick with it. Regards, Peter Beach "RB Smissaert" wrote in message ... Peter, Given your code a try, but it doesn't work. UBound(sItems) gives 67000, which I presume is the limit of what the array can hold and it gets into an endless loop. The code I use now is actually very efficient as it passes every node only once. Have you tried both ways? RBS "Peter Beach" wrote in message ... Hi, Glad you got it worked out. I'm still a bit puzzled by your code, as you seem to iterate through the entire tree each time, searching for your target node whereas it is surely more efficient simply to work down and across from the target node. The code I posted earlier only traverses the tree a single time which would seem to be more efficient. Regards, Peter Beach "RB Smissaert" wrote in message ... Peter, The Sub is fine. It was just the typo as stated in my previous post. RBS |
#9
![]()
Posted to microsoft.public.excel.programming
|
|||
|
|||
![]()
Peter,
The tree I used was actually one level deeper, like this: R _N _ _N _ _N _ _ _N _ _ _ _ N _ _ _ _ N _ _ _ _ _ N _ _ _ _ N _ _ _ _ N _ _ _ _ _ N _ _ _ _ _ _ N I have tried your code on a few more tree structures and it works fine, but not on this one. Hopefully you are not getting too bored with this. RBS "Peter Beach" wrote in message ... Hi, Odd. My code worked fine for me. The point I was making was that I can't see the purpose of the lines: For Each nodChild in MainForm.TreeView1.Nodes If Not nodChild.Parent Is Nothing Then If nodChild.Parent = nodcurrent Then which would seem to iterate through the tree until the target node is reached. But you already know what the target node is - it's either the first node (for the initial call) or the it's the node currently being inspected, so it seems to me that you don't need to go iterating through the tree looking for it. You can from the node recursively call the routine for the first child and then iterate through all its siblings. However programming is that art of achieving results, if your code works, stick with it. Regards, Peter Beach "RB Smissaert" wrote in message ... Peter, Given your code a try, but it doesn't work. UBound(sItems) gives 67000, which I presume is the limit of what the array can hold and it gets into an endless loop. The code I use now is actually very efficient as it passes every node only once. Have you tried both ways? RBS "Peter Beach" wrote in message ... Hi, Glad you got it worked out. I'm still a bit puzzled by your code, as you seem to iterate through the entire tree each time, searching for your target node whereas it is surely more efficient simply to work down and across from the target node. The code I posted earlier only traverses the tree a single time which would seem to be more efficient. Regards, Peter Beach "RB Smissaert" wrote in message ... Peter, The Sub is fine. It was just the typo as stated in my previous post. RBS |
Reply |
Thread Tools | Search this Thread |
Display Modes | |
|
|
![]() |
||||
Thread | Forum | |||
strange problem | Excel Discussion (Misc queries) | |||
Strange VLOOKUP Problem | Excel Discussion (Misc queries) | |||
Strange Problem | Excel Discussion (Misc queries) | |||
Strange Problem... | Excel Discussion (Misc queries) | |||
strange problem For Each loop in Treeview | Excel Programming |