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/.