Function CheckMissingTicks(ByRef nodCurrent As Node, _
ByVal intDepth As Integer) As Boolean
Dim nodChild As Node
Dim HasTick As Boolean
If nodCurrent.Children > 0 Then
For Each nodChild In MainForm.TreeView1.Nodes
If Not nodChild.Parent Is Nothing Then
If nodChild.Parent Is nodCurrent Then
If nodChild.Checked = True And _
Not nodChild.Image = 9 Then
HasTick = True
End If
If HasTick = False And _
nodChild.Image = 9 Then
'collection node, but no tick found yet
CheckMissingTicks = True
Exit Function
End If
Call CheckMissingTicks(nodChild, intDepth + 1)
End If
End If
Next nodChild
End If
End Function
And this is how the function is called:
If CheckMissingTicks(TreeView1.Nodes(1), 0) = True Then .............
I solved it for now by declaring a variable that will be true if the
particular conditions are met and checking for this variable, but I am just
puzzled by what is wrong here. Most likely I am overlooking something really
simple and somebody could help me out easily.
RBS
For one thing:
Instead of
Call CheckMissingTicks(nodChild, intDepth + 1)
put
CheckMissingTicks=CheckMissingTicks(nodChild, intDepth +
1)
Don't know if it solves all your problems.
Regards,
Daniel M.
"RB Smissaert" <bartsm...@blueyonder.co.uk> wrote in message
news:u2nA02RS...@TK2MSFTNGP10.phx.gbl...
if CheckMissingTicks(nodChild, intDepth +1) Then
CheckMissingTicks = True
Exit Function
End if
Not tested since I don't a treeview control set up.
Regards,
Tom Ogilvy
Daniel.M <daniel...@bigfoot.com> wrote in message
news:eY$G4hUSD...@TK2MSFTNGP12.phx.gbl...
RBS
"Daniel.M" <daniel...@bigfoot.com> wrote in message
news:eY$G4hUSD...@TK2MSFTNGP12.phx.gbl...
Regards,
Tom Ogilvy
RB Smissaert <bartsm...@blueyonder.co.uk> wrote in message
news:#EgisKVS...@TK2MSFTNGP10.phx.gbl...
Agreed.
More than that, it will continue and potentialy find other Nodes (in the For
Each) for which the call to CheckMissingTicks=CheckMissingTicks(nodChild,
intDepth +1) will return False, thus overwriting a True previously found.
So, apart of the speed issue, I think you SHOULD exit.
That being said, the key issue here is in understanding :
"It should return TRUE if a particular node is found (with a particular
image) and no ticks have been found yet."
What the 'yet' means? What is the ORDER (pre-order, post-order) of the tree
traversal?
I've never used the Treeview control (so beware! ;-)) but I don't understand
why you would do an all nodes search "For each" loop (recall that ALL the
nodes, not level by level, are counted with the current "For each") and then
include a recursive call in it.
I'm sure there is a way to optimize this search if the OP explains what he
means by 'no ticks have been found yet'. If this is what I think, the OP
doesn't need the recursive call at all.
Regards,
Daniel M.
"Tom Ogilvy" <twog...@msn.com> wrote in message
news:OqI1UqV...@TK2MSFTNGP10.phx.gbl...
I haven't used a treeview either, and I noted as well the check about
parent - indicating that the loop was around all nodes, but did't know what
is in that collection, so I didn't raise that. If this routine came from my
suggestion as he indicated, I just provided a link to a book that provided
the code.
---- < my post with the link > -----
See this link:
http://www.nuvisionmiami.com/books/vb6/files/ch03.pdf
go to section 3.4.3 on page 25 of 48.
------------------------
In Visual Basic Controls in a Nutshell - Evan s. Dictor, he says all items
are nodes and thus members of the nodes collection.
I didn't go back and check the above reference, but I suspect the recursive
approach is provided for traversing the structure of the control and as you
suggest, to just check all nodes for a condition, as RB is doing, a simple
loop through the collection of nodes would be sufficient.
--
Regards,
Tom Ogilvy
Daniel.M <daniel...@bigfoot.com> wrote in message
news:#lo3f4VS...@TK2MSFTNGP12.phx.gbl...
It has to be a recursive function as in the code I gave as it is the only
way I can be sure the Treeview is traversed from top to bottom as it shows
on the screen.
For my application I have to check if there is a particular node (with a
particular image) not preceded (as showing on the screen) by a node with a
ticked checkbox. For example I can't traverse the Treeview by the indices of
the nodes as they may not correspond with the order as shown on the screen,
for example when nodes are added later, higher than the bottom node.
Haven't looked into the other point yet, that is not exiting the function
when the condition is met, and I will do this.
Thanks again for the assistance.
RBS
"Tom Ogilvy" <twog...@msn.com> wrote in message
news:OMKUqZWS...@TK2MSFTNGP12.phx.gbl...
Regards,
Tom Ogilvy
RB Smissaert <bartsm...@blueyonder.co.uk> wrote in message
news:e#G55yWSD...@TK2MSFTNGP10.phx.gbl...
One thing I forgot to mention is that HasTick has to be declared at module
level, otherwise a TRUE won't be retained when doing a recursion.
About the other point. I don't think there is a difference between the 2
ways as indicated by option 1 and option 2:
Public Function CheckMissingTicks(ByRef nodCurrent As Node, _
ByVal intDepth As Integer) As Boolean
Dim nodChild As Node
'HasTick has been declared at module level
'to retain the variable when doing a recursion
If nodCurrent.Children > 0 Then
For Each nodChild In MainForm.TreeView1.Nodes
If Not nodChild.Parent Is Nothing Then
If nodChild.Parent Is nodCurrent Then
If nodChild.Checked = True And _
Not nodChild.Image = 9 Then
HasTick = True
End If
MsgBox "nodChild.Text: " & nodChild.Text & _
vbCrLf & _
"HasTick: " & HasTick
If HasTick = False And _
nodChild.Image = 9 Then
'collection node, but no tick found yet
CheckMissingTicks = True
Exit Function
End If
'option 1
CheckMissingTicks = _
CheckMissingTicks(nodChild, intDepth + 1)
'option 2
'If CheckMissingTicks(nodChild, intDepth + 1) Then
'CheckMissingTicks = True
'Exit Function
'End If
End If
End If
Next nodChild
End If
End Function
RBS
"Tom Ogilvy" <twog...@msn.com> wrote in message
news:OMKUqZWS...@TK2MSFTNGP12.phx.gbl...
> It has to be a recursive function as in the code I gave as it is the only
> way I can be sure the Treeview is traversed from top to bottom as it shows
> on the screen.
One way. Not the only way :-)
AFAIK, in the pdf file (thanks Tom for the link), the recursive call is just
a fancy (and inefficient) way of incrementing the level number (called
intDepth) appropriately so as to print it correctly with the Write cmd. It's
a bad attempt of putting a preorder traversal algo on a 'serial' collection
with added tests with children/parent (sorry to be so heavy).
That being said, why don't you start with your aNode, verify if it's checked
and use the .Parent property to find if any of the parents (a simple loop,
jumping from parent to parent's parent to parent's parent's parent, etc
until the Root .) have their checkbox set or not.
I would do it this way:
Function CheckMissingTicks2(ByRef aNode As Node) As Boolean
Dim n As Node
Set n = aNode
Do While True
If n.Image = 9 Then ' don't bother except if at the root
If n.Checked = False Then ' you're missing one!
CheckMissingTicks2 = True
Exit Do
End If
End If
Set n = n.Parent
If n Is Nothing Then Exit Do ' at the root : exit
Loop
End Function
Again, I don't know what I'm talking about (never used that control before)
;-)
However, I'm still interested in knowing (briefly) how this specific code
fails with respect to your specs.
Regards,
Daniel M.
Regards,
Tom Ogilvy
RB Smissaert <bartsm...@blueyonder.co.uk> wrote in message
news:#NEzx#WSDHA...@TK2MSFTNGP11.phx.gbl...
Tried your function, but it doesn't work. It doesn't return TRUE when it
should.
I checked it with a Msgbox and it exits on the first node returning a FALSE,
no matter whether this node is ticked or not.
Although the recursive function may seem inefficient it passes every node
only once until the condition is met.
I would think that one could come up with a non-recursive function that
traverses the Treeview the way I described and I tried that at first, but is
not as easy as it seems. That is why I used the function in the book Tom
mentioned.
I am actually not sure you understand the problem. Forgive me if I am wrong.
The Treeview has to be traversed from top to bottom that is starting with
the root node and then nodes with increasing actual physical distance away
from the top of the screen.
RBS
"Daniel.M" <daniel...@bigfoot.com> wrote in message
news:O7AC9VXS...@tk2msftngp13.phx.gbl...