Forum: wxRuby ListCtrl.get_selections broken?

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
6da9d2e5648516c14c32c2103eaf4293?d=identicon&s=25 Christian Schmidt (raskolnikov)
on 2009-03-08 02:19
Attachment: ListCtrl_Err_demo.rb.rb (663 Bytes)
Hi again,

may it be that ListCtrl.get_selections is broken? Or did I misunderstand
sth. in the docs?

I'm always getting 0 as the size of the returned array while
get_selected_item_count is reporting the correct number.

See the attachment or the following lines for a program that
demonstrates this.


require 'wx'
include Wx

class MyFrame < Frame
  def initialize
    super nil, -1, "ListCtrl Error"

    @list = ListCtrl.new(self, -1, DEFAULT_POSITION, DEFAULT_SIZE,
LC_REPORT)
    @list.insert_column(0, 'abc')

    li = ListItem.new()
    li.set_state LIST_STATE_SELECTED

    li.set_text '123'
    @list.insert_item(li)
    li.set_text '234'
    @list.insert_item(li)
    li.set_text '345'
    @list.insert_item(li)
    li.set_text '456'
    @list.insert_item(li)


    puts @list.get_selected_item_count # --> 4
    puts @list.get_selections.size     # --> 0
  end
end

class MyApp < App
  def on_init
    f =  MyFrame.new
    f.show
  end
end

MyApp.new.main_loop


I hope I'm doing something wrong.

Cheers,
Christian.
06f6780c99d4a8dd71f2b474082ea9ce?d=identicon&s=25 Alex Fenton (Guest)
on 2009-03-08 08:58
(Received via mailing list)
Christian Schmidt wrote:
> I'm always getting 0 as the size of the returned array while
> get_selected_item_count is reporting the correct number.
>

It works OK for me. I think the problem is the way you are adding items
to the list.

>     @list = ListCtrl.new(self, -1, DEFAULT_POSITION, DEFAULT_SIZE,
> LC_REPORT)
>

Note - this can be written ListCtrl.new(self, :style => LC_REPORT). You
almost never need to use the clumsy 'DEFAULT_POSITION', 'DEFAULT_SIZE'
etc. Use named arguments and these will be taken care of.

>     li = ListItem.new()
>     li.set_state
>
>     li.set_text '123'
>     @list.insert_item(li)
>     li.set_text '234'
>     @list.insert_item(li)
>

Your problem is here, I think. Each ListItem object represents a unique
object in the list. The row it's in is identified by an attribute 'id'.
However, you're adding the same object multiple times. Do it like this
instead, creating a new ListItem for each:

li = Wx::ListItem.new
li.state = LIST_STATE_SELECTED
li.id = 0 # For row 0
li.text = '123'
@list.insert_item li

alex
6da9d2e5648516c14c32c2103eaf4293?d=identicon&s=25 Christian Schmidt (raskolnikov)
on 2009-03-08 14:09
Alex Fenton wrote:

> Note - this can be written ListCtrl.new(self, :style => LC_REPORT). You
> almost never need to use the clumsy 'DEFAULT_POSITION', 'DEFAULT_SIZE'
> etc. Use named arguments and these will be taken care of.

This is great! I've always been annoyed by that, since I practically
never need to explicitly set those using sizer based layout.

>>     li = ListItem.new()
>>     li.set_state
>>
>>     li.set_text '123'
>>     @list.insert_item(li)
>>     li.set_text '234'
>>     @list.insert_item(li)
>>

I didn't use the ListItem helper-class in the original program. Just
wanted to make it easier for you to reproduce the problem by selecting
the items at startup. I was using @list.insert_item(pos, 'item') and
@list.set_item(pos, col, 'property') originally.

> Your problem is here, I think. Each ListItem object represents a unique
> object in the list. The row it's in is identified by an attribute 'id'.
> However, you're adding the same object multiple times. Do it like this
> instead, creating a new ListItem for each:
>
> li = Wx::ListItem.new
> li.state = LIST_STATE_SELECTED
> li.id = 0 # For row 0
> li.text = '123'
> @list.insert_item li

I've been playing around with this now. I thought, it might also be a
problem of references getting lost somewhere. So I modified it as
follows:

    @li1 = ListItem.new()
    @li1.set_state LIST_STATE_SELECTED
    @li1.set_text '123'
    @li1.id = 0
    @list.insert_item(@li1)

    @li2 = ListItem.new()
    @li2.set_state LIST_STATE_SELECTED
    @li2.id = 1
    @li2.set_text '234'
    @list.insert_item(@li2)

    ...

But still no luck: get_selections.size == 0!

Christian.
This topic is locked and can not be replied to.