Posted to microsoft.public.excel.programming
|
|
Why doesn't this function return TRUE?
Your free to do whatever you want.
Regards,
Tom Ogilvy
RB Smissaert wrote in message
...
Tom, Daniel,
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" wrote in message
...
I had the same two thoughts. I noted that the function never set the
value
to false, but overlooked the fact that it implicitly returned false when
a
true condition was not found, so it is as you state.
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 wrote in message
...
Tom, RBS,
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" wrote in message
...
It may be shorter to write, but it doesn't exit your function as
soon
as
a
True condition is encountered so you could continue to loop and do
needless
checks - thus shorter to write, longer to execute.
Regards,
Tom Ogilvy
RB Smissaert wrote in message
...
Thanks, it works fine now.
Used Daniel's suggestion as it is a bit shorter.
Wasn't sure about the Call keyword, but it was used in the example
I
mentioned.
RBS
"Daniel.M" wrote in message
...
Hi 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" wrote in message
...
Using Excel XP.
Made a function (from an example pointed out by Tom Ogilvy)
that
checks
for
missing ticked checkboxes in a Treeview.
It should return TRUE if a particular node is found (with a
particular
image) and no ticks have been found yet.
The function does work when I check it with a messagebox, but
it
still
returns FALSE when it should be TRUE.
This is the function:
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
|