如何使用添加条目的选项构建一个wxListBox,而不事先知道这个数字?

时间:2014-08-06 00:03:00

标签: c++ arrays constructor listbox wxwidgets

我有一个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;

这就是我看到的所有代码都与列表框有关。

2 个答案:

答案 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。