我有一个wxListBox,它的构造如下:
wxString choices[8] = {"0", "1", "2", "3", "4", "5", "6", "7" };
m_listboxSorted = new wxListBox( panelOne, ListBoxOneID,wxPoint(40,250), wxSize(260,125), 8, choices, wxLB_SINGLE|wxLB_HSCROLL, wxDefaultValidator );
这种初始化为列表中的8个预定义条目腾出空间。但是添加任何额外的(第9 ......)会导致崩溃。
如果我希望用这8个预定义的条目初始化列表,但是有可能添加第9个,第10个......我应该如何更正此代码?所以尽可能多的程序需要,而不是预先确定?< / p>
编辑:希望有助于找到问题的一些额外代码
static unsigned int k = 0 ;
m_listboxSorted->SetString(k, "some text");
k++;
此代码是处理程序函数的一部分,该函数在(单击按钮上)执行某些处理并且还向列表框添加条目。除了构造函数之外:
wxListBox *m_listboxSorted = new wxListBox;
这就是我看到的所有代码都与列表框有关。
答案 0 :(得分:2)
您不能使用SetString()
将字符串添加到列表框中,它只能用于修改现有字符串(只需考虑一下:SetString(10, "whatever")
对空列表框执行的操作,在第11行的字符串"whatever"
之前的前10个项目中会显示什么?)。
您应该使用Append()
代替。这也将使您无需手动跟踪索引(当然,您可以始终使用其GetCount()
从列表框本身获取它。)
答案 1 :(得分:1)
如果使用C ++ 11,则以下内容应该有效:
#include <vector>
std::vector<wxString> choices = {"0", "1", "2", "3", "4", "5", "6", "7" };
然后当你想要添加一个字符串时:
choices.push_back("8");
如果你没有使用C ++ 11:
#include <vector>
//...
wxString choices_vals[8] = {"0", "1", "2", "3", "4", "5", "6", "7" };
std::vector<wxString> choices(choices_vals, choices_vals + 8);
相同的push_back
调用将用于在运行时添加元素。
如果你想从空矢量开始,那么只需声明它并在你认为合适时添加条目:
std::vector<wxString> choices; // vector is empty
//...
choices.push_back("0"); // add an item
现在在你的函数调用中,它看起来像这样:
m_listboxSorted = new wxListBox( panelOne, ListBoxOneID,wxPoint(40,250),
wxSize(260,125), choices.size(), &choices[0],
wxLB_SINGLE|wxLB_HSCROLL, wxDefaultValidator )
请注意size()
std::vector
成员函数的使用,以及传递向量的第一个元素的地址。
编辑:
使用wxWidgets,您有wxArrayString
类,如下所述:http://docs.wxwidgets.org/trunk/classwx_array_string.html
虽然我相信std::vector
也可以,但是YMMV。