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.
Attachments:
http://www.ruby-forum.com/attachment/3407/ListCtrl_Err_demo.rb.rb
--
Posted via http://www.ruby-forum.com/.
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
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 liI''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. -- Posted via http://www.ruby-forum.com/.
Christian - you didn''t say, but I''m assuming you''re
working on Windows
b/c I now tried it there and can reproduce the problem.
I''ve no idea why Windows differs here, but fortunately it''s
easy to fix.
The definition of get_selections is in Ruby and is in
lib/wx/classes/listctrl.rb. If you want the definition that works on
Windows, add something like this to your script:
class Wx::ListCtrl
def get_selections
selections = []
item = get_next_item(-1, Wx::LIST_NEXT_ALL, Wx::LIST_STATE_SELECTED)
while item >= 0
selections << item
item = get_next_item(item, Wx::LIST_NEXT_BELOW,
Wx::LIST_STATE_SELECTED)
end
selections
end
end
The only change is Wx::LIST_NEXT_ALL was previously LIST_NEXT_BELOW.
I''ll apply this to wxRuby once I''ve tested on other platforms.
Thanks
again for the report.
a
Hi Alex, you''re right, I''m working on Win XP - hence your workaround fixed it for me. Btw.: It''s me who has to thank you again for your great help! Thank you for making wxRuby and also for providing such a great support! Christian. Alex Fenton wrote:> Christian - you didn''t say, but I''m assuming you''re working on Windows > b/c I now tried it there and can reproduce the problem. > > I''ve no idea why Windows differs here, but fortunately it''s easy to fix. > The definition of get_selections is in Ruby and is in > lib/wx/classes/listctrl.rb. If you want the definition that works on > Windows, add something like this to your script: > > class Wx::ListCtrl > def get_selections > selections = [] > item = get_next_item(-1, Wx::LIST_NEXT_ALL, Wx::LIST_STATE_SELECTED) > while item >= 0 > selections << item > item = get_next_item(item, Wx::LIST_NEXT_BELOW, > Wx::LIST_STATE_SELECTED) > end > selections > end > end > > The only change is Wx::LIST_NEXT_ALL was previously LIST_NEXT_BELOW. > > I''ll apply this to wxRuby once I''ve tested on other platforms. Thanks > again for the report. > > a-- Posted via http://www.ruby-forum.com/.