Sign in to follow this  
Followers 0
kylomas

Listing TreeView Control Items Gives Unexpected Results

10 posts in this topic

I am trying to list items in a TreeView control using the following code.

#include <GUIConstantsEx.au3>
#include <GuiTreeView.au3>
#include <WindowsConstants.au3>
#include <array.au3>

local $gui010   =   guicreate('TreeView Test')
local $aSZE     =   wingetclientsize($gui010)
local $TV010    =   guictrlcreatetreeview(0,0,$aSZE[0],$aSZE[1]-40)
local $btn010   =   guictrlcreatebutton('Generate Treeview Debug Data To Console',20,$aSZE[1]-30,$aSZE[0]-40)

local $x,$y ; just for handle holders to create child elements
local $total_entries = 0

_GUICtrlTreeView_BeginUpdate($TV010)
;For $1 = 1 To Random(1, 10, 1)
For $1 = 1 To 5
    $x = GUICtrlCreateTreeViewItem(StringFormat("[%02d] Level 1", $1),$TV010)
    $total_entries += 1
    ;For $2 = 1 To Random(1, 10, 1)
    For $2 = 1 To 5
        $y = GUICtrlCreateTreeViewItem(StringFormat("[%02d] Level 2", $2),$x)
        $total_entries += 1
        ;for $3 = 1 to random(1, 10,1)
        for $3 = 1 to 5
            GUICtrlCreateTreeViewItem(StringFormat("[%02d] Level 3", $3),$y)
            $total_entries += 1
        next
    Next
Next
_GUICtrlTreeView_EndUpdate($TV010)

ConsoleWrite('Generated = ' & $total_entries & ' entries' & @LF)

guisetstate()

while 1
    switch guigetmsg()
        case $gui_event_close
            Exit
        case $btn010
            _out()
    EndSwitch
WEnd

func _out()

    local $str

    ConsoleWrite('GETCOUNT  = ' & _GUICtrlTreeView_GetCount($TV010) & @LF)

    for $1 = 0 to _GUICtrlTreeView_GetCount($TV010)

        $str &= stringformat( 'Text = %-15s Child Switch = %-5s CTLID = %03i Parent CTLID = %03i Parent Handle = %-8s Sibling Count = %03i Child Count = %03i', _
                    _GUICtrlTreeView_GetText($TV010, $1), _
                    _GUICtrlTreeView_GetChildren($TV010,$1), _
                    _GUICtrlTreeView_GetItemParam($tv010,$1), _
                    _GUICtrlTreeView_GetParentParam($TV010,$1), _
                    _GUICtrlTreeView_GetParentHandle($TV010,$1), _
                    _GUICtrlTreeView_GetSiblingCount($TV010,$1), _
                    _GUICtrlTreeView_GetChildCount($TV010,$1) ) & @lf
    next

    ConsoleWrite($str & @LF)

endfunc

When I action the button for console output I get

 

Generated = 155 entries
GETCOUNT  = 155
Text = [01] Level 1    Child Switch = True  CTLID = 005 Parent CTLID = 000 Parent Handle = 0x00000000 Sibling Count = 005 Child Count = 005
Text =                 Child Switch = False CTLID = 000 Parent CTLID = 000 Parent Handle = 0x00000000 Sibling Count = 005 Child Count = -01
Text =                 Child Switch = False CTLID = 000 Parent CTLID = 000 Parent Handle = 0x00000000 Sibling Count = 005 Child Count = -01
Text =                 Child Switch = False CTLID = 000 Parent CTLID = 000 Parent Handle = 0x00000000 Sibling Count = 005 Child Count = -01
Text =                 Child Switch = False CTLID = 000 Parent CTLID = 000 Parent Handle = 0x00000000 Sibling Count = 005 Child Count = -01
Text = [01] Level 1    Child Switch = True  CTLID = 005 Parent CTLID = 000 Parent Handle = 0x00000000 Sibling Count = 005 Child Count = 005
Text = [01] Level 2    Child Switch = True  CTLID = 006 Parent CTLID = 005 Parent Handle = 0x00ADA448 Sibling Count = 005 Child Count = 005
Text = [01] Level 3    Child Switch = False CTLID = 007 Parent CTLID = 006 Parent Handle = 0x00ADA490 Sibling Count = 005 Child Count = -01
Text = [02] Level 3    Child Switch = False CTLID = 008 Parent CTLID = 006 Parent Handle = 0x00ADA490 Sibling Count = 005 Child Count = -01
Text = [03] Level 3    Child Switch = False CTLID = 009 Parent CTLID = 006 Parent Handle = 0x00ADA490 Sibling Count = 005 Child Count = -01
Text = [04] Level 3    Child Switch = False CTLID = 010 Parent CTLID = 006 Parent Handle = 0x00ADA490 Sibling Count = 005 Child Count = -01
Text = [05] Level 3    Child Switch = False CTLID = 011 Parent CTLID = 006 Parent Handle = 0x00ADA490 Sibling Count = 005 Child Count = -01
Text = [02] Level 2    Child Switch = True  CTLID = 012 Parent CTLID = 005 Parent Handle = 0x00ADA448 Sibling Count = 005 Child Count = 005

 

I don't understand why the first element is followed by 4 blank elements and then repeated. 

The treeview displays fine.

Thanks,

kylomas

 

 

 

 


Forum Rules         Procedure for posting code

"I like pigs.  Dogs look up to us.  Cats look down on us.  Pigs treat us as equals."

- Sir Winston Churchill

Share this post


Link to post
Share on other sites



#2 ·  Posted (edited)

After much confusion I think it is quite simple.  Your for statement starts at 0 when I think it should start at 1.  I may be off-base here.

Should've tested first.  I was wrong.

When i've done treeview exports before I've always used GetNext and such funcs to retrieve the handles.  I notice in the help file funcs you are using call for Item ID or Handle, maybe the index ins't returning what you think it should.

Edited by spudw2k

Share this post


Link to post
Share on other sites

spudw2k,

Yes, thanks, I've pretty much came to that conclusion also.  I posted this question to see if it was something simple/stupid that I was missing (never used TreeView control before).  I started goofing around with this in response to a thread in GH&S.

kylomas


Forum Rules         Procedure for posting code

"I like pigs.  Dogs look up to us.  Cats look down on us.  Pigs treat us as equals."

- Sir Winston Churchill

Share this post


Link to post
Share on other sites

#4 ·  Posted (edited)

Well I'm no expert so there may in fact be a simple way to do it.  I was about to test your script by creating an array to hold the control id's returned from GUICtrlCreateTreeViewItem and see how it correlates to a straight index value (1-155).  Will post the findings.

edit:

The Controls IDs are consecutive, but they start at 5 instead of 0 (or 1).

#include <GUIConstantsEx.au3>
#include <GuiTreeView.au3>
#include <WindowsConstants.au3>
#include <array.au3>

local $gui010   =   guicreate('TreeView Test')
local $aSZE     =   wingetclientsize($gui010)
local $TV010    =   guictrlcreatetreeview(0,0,$aSZE[0],$aSZE[1]-40)
local $btn010   =   guictrlcreatebutton('Generate Treeview Debug Data To Console',20,$aSZE[1]-30,$aSZE[0]-40)

local $x,$y ; just for handle holders to create child elements
local $total_entries = 0

Local $arrIDs[155][2]
$IDindx = 1

_GUICtrlTreeView_BeginUpdate($TV010)
;For $1 = 1 To Random(1, 10, 1)
For $1 = 1 To 5
    $arrIDs[$IDindx-1][0] = $IDindx
    $x = GUICtrlCreateTreeViewItem(StringFormat("[%02d] Level 1", $1),$TV010)
    $arrIDs[$IDindx-1][1] = $x
    $IDindx += 1
    $total_entries += 1
    ;For $2 = 1 To Random(1, 10, 1)
    For $2 = 1 To 5
        $arrIDs[$IDindx-1][0] = $IDindx
        $y = GUICtrlCreateTreeViewItem(StringFormat("[%02d] Level 2", $2),$x)
        $arrIDs[$IDindx-1][1] = $y
        $IDindx += 1
        $total_entries += 1
        ;for $3 = 1 to random(1, 10,1)
        for $3 = 1 to 5
            $arrIDs[$IDindx-1][0] = $IDindx
            $arrIDs[$IDindx-1][1] = GUICtrlCreateTreeViewItem(StringFormat("[%02d] Level 3", $3),$y)
            $IDindx += 1
            $total_entries += 1
        next
    Next
Next
_GUICtrlTreeView_EndUpdate($TV010)

ConsoleWrite('Generated = ' & $total_entries & ' entries' & @LF)

guisetstate()

while 1
    switch guigetmsg()
        case $gui_event_close
            Exit
        case $btn010
            _out()
            _ArrayDisplay($arrIDs)
    EndSwitch
WEnd

func _out()

    local $str

    ConsoleWrite('GETCOUNT  = ' & _GUICtrlTreeView_GetCount($TV010) & @LF)

    for $1 = 0 to _GUICtrlTreeView_GetCount($TV010)

        $str &= stringformat( 'Text = %-15s Child Switch = %-5s CTLID = %03i Parent CTLID = %03i Parent Handle = %-8s Sibling Count = %03i Child Count = %03i', _
                    _GUICtrlTreeView_GetText($TV010, $1), _
                    _GUICtrlTreeView_GetChildren($TV010,$1), _
                    _GUICtrlTreeView_GetItemParam($tv010,$1), _
                    _GUICtrlTreeView_GetParentParam($TV010,$1), _
                    _GUICtrlTreeView_GetParentHandle($TV010,$1), _
                    _GUICtrlTreeView_GetSiblingCount($TV010,$1), _
                    _GUICtrlTreeView_GetChildCount($TV010,$1) ) & @lf
    next

    ConsoleWrite($str & @LF)

endfunc
Edited by spudw2k
1 person likes this

Share this post


Link to post
Share on other sites

#5 ·  Posted (edited)

spudw2k,

Thanks, Doh!  I knew it was something simple I was overlooking.

kylomas

edit:  Jeez, what makes it worse is that the data was SCREAMING this at me...

Edited by kylomas

Forum Rules         Procedure for posting code

"I like pigs.  Dogs look up to us.  Cats look down on us.  Pigs treat us as equals."

- Sir Winston Churchill

Share this post


Link to post
Share on other sites

#6 ·  Posted (edited)

spudw2k,

On second thought, that may not be the entire answer.  How do you explain the first entry appearing to be valid followed by 4 blanks and then repeated?

edit: Been trying to configure a 3D array to hold the ctlid's w/o success.  I don't really want to get into 3 2D linked lists to represent parent/child/sibling ctlid relationships. 

Perhaps the TreeView UDF's make this a moot point.

kylomas

Edited by kylomas

Forum Rules         Procedure for posting code

"I like pigs.  Dogs look up to us.  Cats look down on us.  Pigs treat us as equals."

- Sir Winston Churchill

Share this post


Link to post
Share on other sites

#7 ·  Posted (edited)

Yea, I can't explain why 1 0 returns the first treeviewitem when the actual ID is 5.  Perhaps there is something intrinsic about 1 0 being the first "element" in the treeview, but it makes sense why 2 1 - 4 would be invalid.  I'd recommend taking the GetNext / NextChild / NextSibling approach rather than maintaining an array or list of the items.

edit: strikethoughs

Edited by spudw2k

Share this post


Link to post
Share on other sites

 

 I'd recommend taking the GetNext / NextChild / NextSibling approach rather than maintaining an array or list of the items.

 

Yes, thanks for your time.

kylomas


Forum Rules         Procedure for posting code

"I like pigs.  Dogs look up to us.  Cats look down on us.  Pigs treat us as equals."

- Sir Winston Churchill

Share this post


Link to post
Share on other sites

F.W.I.W.  This is how I got it to work.

#include <GUIConstantsEx.au3>
#include <GuiTreeView.au3>
#include <WindowsConstants.au3>
#include <array.au3>

local $gui010   =   guicreate('TreeView Test')
local $aSZE     =   wingetclientsize($gui010)
local $TV010    =   guictrlcreatetreeview(0,0,$aSZE[0],$aSZE[1]-40)
local $btn010   =   guictrlcreatebutton('Generate Treeview Debug Data To Console',20,$aSZE[1]-30,$aSZE[0]-40)

local $x, $y
local $total_entries = 0

_GUICtrlTreeView_BeginUpdate($TV010)
For $1 = 0 To random(0,10,1)
    $x = GUICtrlCreateTreeViewItem(StringFormat("[%02d] Level 1", $1),$TV010)
    $total_entries += 1
    For $2 = 0 To random(0,10,1)
        $y = GUICtrlCreateTreeViewItem(StringFormat("[%02d] Level 2", $2),$x)
        $total_entries += 1
        for $3 = 0 to random(0,10,1)
            GUICtrlCreateTreeViewItem(StringFormat("[%02d] Level 3", $3),$y)
            $total_entries += 1
        next
    Next
Next
_GUICtrlTreeView_EndUpdate($TV010)

ConsoleWrite('Generated = ' & $total_entries & ' entries' & @LF)

guisetstate()

while 1
    switch guigetmsg()
        case $gui_event_close
            Exit
        case $btn010
            _out()
    EndSwitch
WEnd

func _out()

    local $str

    ConsoleWrite('GETCOUNT  = ' & _GUICtrlTreeView_GetCount($TV010) & @LF)

    for $1 = _GUICtrlTreeView_GetItemParam($tv010) to _GUICtrlTreeView_GetCount($TV010)   ; <---  changed start count for iteration

        $str &= stringformat( 'Text = %-15s Child Switch = %-5s CTLID = %03i Parent CTLID = %03i Parent Handle = %-8s Sibling Count = %03i Child Count = %03i', _
                    _GUICtrlTreeView_GetText($TV010, $1), _
                    _GUICtrlTreeView_GetChildren($TV010,$1), _
                    _GUICtrlTreeView_GetItemParam($tv010,$1), _
                    _GUICtrlTreeView_GetParentParam($TV010,$1), _
                    _GUICtrlTreeView_GetParentHandle($TV010,$1), _
                    _GUICtrlTreeView_GetSiblingCount($TV010,$1), _
                    _GUICtrlTreeView_GetChildCount($TV010,$1) ) & @lf
    next

    ConsoleWrite($str & @LF)

endfunc

Big thanks to spud2wk for pointing out the obvious!

kylomas


Forum Rules         Procedure for posting code

"I like pigs.  Dogs look up to us.  Cats look down on us.  Pigs treat us as equals."

- Sir Winston Churchill

Share this post


Link to post
Share on other sites

#10 ·  Posted (edited)

Looking pretty good, except your output is still short by the offset of the first item ID...at least in my testing.
I copied the output to notepad and counted the lines...4 items less than item count.  So close.

edit:

Give this a go

#include <GUIConstantsEx.au3>
#include <GuiTreeView.au3>
#include <WindowsConstants.au3>
#include <array.au3>

local $gui010   =   guicreate('TreeView Test')
local $aSZE     =   wingetclientsize($gui010)
local $TV010    =   guictrlcreatetreeview(0,0,$aSZE[0],$aSZE[1]-40)
local $btn010   =   guictrlcreatebutton('Generate Treeview Debug Data To Console',20,$aSZE[1]-30,$aSZE[0]-40)

local $x, $y

_GUICtrlTreeView_BeginUpdate($TV010)
For $1 = 0 To random(0,10,1)
    $x = GUICtrlCreateTreeViewItem(StringFormat("[%02d] Level 1", $1),$TV010)
    For $2 = 0 To random(0,10,1)
        $y = GUICtrlCreateTreeViewItem(StringFormat("[%02d] Level 2", $2),$x)
        for $3 = 0 to random(0,10,1)
            GUICtrlCreateTreeViewItem(StringFormat("[%02d] Level 3", $3),$y)
        next
    Next
Next
_GUICtrlTreeView_EndUpdate($TV010)

ConsoleWrite('Generated = ' & _GUICtrlTreeView_GetCount($TV010) & ' entries' & @LF)

guisetstate()

while 1
    switch guigetmsg()
        case $gui_event_close
            Exit
        case $btn010
            _out()
    EndSwitch
WEnd

func _out()

    local $str

    ConsoleWrite('GETCOUNT  = ' & _GUICtrlTreeView_GetCount($TV010) & @LF)

    $id = _GUICtrlTreeView_GetItemParam($tv010)
    for $1 = 1 to _GUICtrlTreeView_GetCount($TV010)

        $str &= stringformat( 'Text = %-15s Child Switch = %-5s CTLID = %03i Parent CTLID = %03i Parent Handle = %-8s Sibling Count = %03i Child Count = %03i', _
                    _GUICtrlTreeView_GetText($TV010, $id), _
                    _GUICtrlTreeView_GetChildren($TV010,$id), _
                    _GUICtrlTreeView_GetItemParam($tv010,$id), _
                    _GUICtrlTreeView_GetParentParam($TV010,$id), _
                    _GUICtrlTreeView_GetParentHandle($TV010,$id), _
                    _GUICtrlTreeView_GetSiblingCount($TV010,$id), _
                    _GUICtrlTreeView_GetChildCount($TV010,$id) ) & @lf

        $id = _GUICtrlTreeView_GetNext($TV010,$id)

    next

    ConsoleWrite($str & @LF)

endfunc

Sorry I didn't think of it sooner; I forgot about _GUICtrlTreeView_GetItemParam

Edited by spudw2k

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0