1. win32lib getTVSelectedText Not Working

I'm using Win32Lib 0.60 Patch #67, 15-Jan-2007. The getTVSelectedText item
doesn't work on sub-items. That is, I have this:

Set One
 - value a
 - value b
 - value c

and getTVSelectedText won't return values (returns empty sequence) if any of
the 'value' items are clicked. It will return 'Set One' when 'Set One' is
selected.

Anybody have a fix?!

new topic     » topic index » view message » categorize

2. Re: win32lib getTVSelectedText Not Working

c.k.lester wrote:
> 
> I'm using Win32Lib 0.60 Patch #67, 15-Jan-2007. The getTVSelectedText item
> doesn't work on sub-items. That is, I have this:
> 
> Set One
>  - value a
>  - value b
>  - value c
> 
> and getTVSelectedText won't return values (returns empty sequence) if any of
> the 'value' items are clicked. It will return 'Set One' when 'Set One' is
> selected.
> 
> Anybody have a fix?!

Please allow for a few days for me to have a working copy of win32lib
  0.60.C that runs, and then I canprovide you with a fix. Probably this
 weekend, or tuesday. Does this happen with official 0.60.6?

CChris

new topic     » goto parent     » topic index » view message » categorize

3. Re: win32lib getTVSelectedText Not Working

c.k.lester wrote:
> 
> I'm using Win32Lib 0.60 Patch #67, 15-Jan-2007. The getTVSelectedText item
> doesn't work on sub-items. That is, I have this:
> 
> Set One
>  - value a
>  - value b
>  - value c
> 
> and getTVSelectedText won't return values (returns empty sequence) if any of
> the 'value' items are clicked. It will return 'Set One' when 'Set One' is
> selected.
> 
> Anybody have a fix?!


The problem is with getTVIndex(), which wrongly assumes that all items are at
level 1.
The routine should search among all children of the root, then all children
 of these and so on.
I'll post corrected code later tonight (4pm local time right now) or
 tomorrow. The logic is not completely straightforward, needs some tests.

CChris

new topic     » goto parent     » topic index » view message » categorize

4. Re: win32lib getTVSelectedText Not Working

CChris wrote:
> c.k.lester wrote:
> > I'm using Win32Lib 0.60 Patch #67, 15-Jan-2007. The getTVSelectedText item
> > doesn't work on sub-items.
> > Anybody have a fix?!
> 
> The problem is with getTVIndex(), which wrongly assumes that all items are at
> level 1.

Thanks, CC! :)

new topic     » goto parent     » topic index » view message » categorize

5. Re: win32lib getTVSelectedText Not Working

c.k.lester wrote:
> 
> CChris wrote:
> > c.k.lester wrote:
> > > I'm using Win32Lib 0.60 Patch #67, 15-Jan-2007. The getTVSelectedText item
> > > doesn't work on sub-items.
> > > Anybody have a fix?!
> > 
> > The problem is with getTVIndex(), which wrongly assumes that all items are
> > at
> > level 1.
> 
> Thanks, CC! :)

Here's a fix; it involves both getTVIncedx() and getTVText().
global function getTVIndex( integer id )
    atom state, item, hChild, TV_ITEM
    sequence path
    integer p

    item = sendMessage( id, TVM_GETNEXTITEM, 0, TVGN_ROOT )
    TV_ITEM = struct_TVITEM( TVIF_STATE, item, 0, 0, "", 0, 0, 0, 0)
    path = {}

    while 1 do
        VOID = sendMessage( id, TVM_GETITEM, 0, TV_ITEM )
        state = w32fetch( TV_ITEM, TVITEM_state)
               ?state
        if and_bits(state,TVIS_SELECTED) then
            -- assuming only one item is selected at a time
            exit
        end if

        hChild = sendMessage( id, TVM_GETNEXTITEM, TVGN_CHILD, item )
        if hChild then
            path &= item
            item = hChild
        else
            item = sendMessage( id, TVM_GETNEXTITEM, TVGN_NEXT, item )
            while not item do
                if not length(path) then
                    exit
                end if
                item=path[length(path)]
                path=path[1..length(path)-1]
                item = sendMessage( id, TVM_GETNEXTITEM, TVGN_NEXT, item )
            end while
        end if

        if not length(path) then
            exit
        end if
        w32store( TV_ITEM, TVITEM_hItem, item )
    end while

    w32release_mem( TV_ITEM )
    return item

end function

global function getTVText( atom iItem )
    integer item
    item = find(iItem,tvitem_handle)
    if item > 0 then
        return w32peek_string( tvitem_data[item][ktv_TextAddr] )
    else
        return ""
    end if

end function


Probably some small things to optimise, but it works.
Remember that "patch #67" is an unreleased alpha version...

CChris

new topic     » goto parent     » topic index » view message » categorize

6. Re: win32lib getTVSelectedText Not Working

CChris wrote:
> c.k.lester wrote:
> > CChris wrote:
> > > c.k.lester wrote:
> > > > I'm using Win32Lib 0.60 Patch #67, 15-Jan-2007. The getTVSelectedText
> > > > item
> > > > doesn't work on sub-items.
> > > > Anybody have a fix?!
> > > The problem is with getTVIndex(), which wrongly assumes that all items are
> > > at
> > > level 1.
> Here's a fix; it involves both getTVIncedx() and getTVText().

Fix doesn't work for me. :/

If I have this:

A
 - 1
 - 2
 - 3
B
 - 1
 - 2
C
 - 1
D
 - 1

then no matter what subitem I click on, 'B' is returned from
getTVSelectedText().

new topic     » goto parent     » topic index » view message » categorize

7. Re: win32lib getTVSelectedText Not Working

CChris wrote:
> Here's a fix; it involves both getTVIncedx() and getTVText().

I grabbed this code from a version of Win32Lib that does work:

global function getTVIndex( atom id )
    atom count, state, item, lParam, TV_ITEM

    TV_ITEM = struct_TVITEM( 0, 0,
	        0, TVIS_SELECTED, "", 0, 0, 0, 0)

    count = sendMessage( id, TVM_GETCOUNT, 0, 0 )

    lParam = 0
    item = sendMessage( id, TVM_GETNEXTITEM, 0, TVGN_ROOT )
    w32store( TV_ITEM, TVITEM_hItem, item )
    VOID = sendMessage( id, TVM_GETITEM, 0, TV_ITEM )
    for i = 1 to count do
        state = w32fetch( TV_ITEM, TVITEM_state )

        if and_bits(state, TVIS_SELECTED) then
            lParam = w32fetch( TV_ITEM, TVITEM_lParam)
            exit
        end if

        item = sendMessage( id, TVM_GETNEXTITEM, TVGN_NEXTVISIBLE, item )
        w32store( TV_ITEM, TVITEM_hItem, item )
        VOID = sendMessage( id, TVM_GETITEM, 0, TV_ITEM )
    end for

    w32release_mem( TV_ITEM )

    return lParam

end function

global function getTVText( integer iItem )
    if iItem > 0 and iItem <= length(tvitem_data) then
        return w32peek_string( tvitem_data[iItem][ktv_TextAddr] )
    else
        return ""
    end if

end function


new topic     » goto parent     » topic index » view message » categorize

Search



Quick Links

User menu

Not signed in.

Misc Menu