If you are using the main C++ distribution of wxWidgets, Feel free to ask any question related to wxWidgets development here. This means questions regarding to C++ and wxWidgets, not compile problems.
Marcus Frenkel
Experienced Solver
Posts: 79 Joined: Thu Sep 25, 2008 12:14 am
Post
by Marcus Frenkel » Mon Sep 27, 2010 9:32 am
Hi,
I'm trying to make use of the following function without success:
int wxItemContainer::Append(const wxArrayString & items, wxClientData **clientData)
http://docs.wxwidgets.org/trunk/classwx ... 45778e13f3
If I want to add one item to wxSimpleHtmlListBox along with client data I use:
htmlListBox->Append(string, new wxStringClientData( shadow_string) );
How do I append wxArrayString along with Client Data?
I tried this way:
Code: Select all
wxStringClientData *StringClientData[5000];
for (;;) {
string = ...
shadow_string = ...
ArrayString.Add(string);
StringClientData[i] = new wxStringClientData(shadow_string);
}
htmlListBox->Append(ArrayString, StringClientData);
Compailer cannot match the right function and complains with this error:
'int wxItemContainer::Append(const wxString &,void *)' : cannot convert parameter 1 from 'wxArrayString' to 'const wxString &'
Marcus Frenkel
Experienced Solver
Posts: 79 Joined: Thu Sep 25, 2008 12:14 am
Post
by Marcus Frenkel » Mon Sep 27, 2010 9:45 am
Okay somehow changing
wxStringClientData *StringClientData[5000];
to
wxClientData *StringClientData[5000];
Made it compiled fine and it seems to work all right I hope it will not end up in some undefined behavior.
Another question on this, how do I set the size of wxStringClientData *StringClientData array according to the size of wxArrayString?
The following doesn't compile:
size_t PtrArraySize = BaseArrayString.Count();
wxClientData *StringClientData[PtrArraySize];
jfouche
Super wx Problem Solver
Posts: 442 Joined: Tue May 06, 2008 4:52 pm
Location: France
Post
by jfouche » Mon Sep 27, 2010 10:00 am
You can't do this, you'll have to allocate this way :
Code: Select all
wxClientData *StringClientData = new StringClientData [PtrArraySize];
Don't forget to delete[] it when yon don't need it anymore.
Jérémie
Marcus Frenkel
Experienced Solver
Posts: 79 Joined: Thu Sep 25, 2008 12:14 am
Post
by Marcus Frenkel » Wed Sep 29, 2010 1:00 pm
jfouche wrote: You can't do this, you'll have to allocate this way :
Code: Select all
wxClientData *StringClientData = new StringClientData [PtrArraySize];
Don't forget to delete[] it when yon don't need it anymore.
How do you assign a value to an element in the array in that case?
About deleting the object, if you assign wxClientData then the container should delete it itself as far as I check in the source.
Auria
Site Admin
Posts: 6695 Joined: Thu Sep 28, 2006 12:23 am
Contact:
Post
by Auria » Wed Sep 29, 2010 3:49 pm
Code: Select all
StringClientData *StringClientData = new StringClientData [PtrArraySize];
StringClientData[0].SetFoo(x);
StringClientData[1].SetFoo(y);
StringClientData[2].SetFoo(z);
// ...
The exact name to call depends on the StringClientData class, of course
Marcus Frenkel
Experienced Solver
Posts: 79 Joined: Thu Sep 25, 2008 12:14 am
Post
by Marcus Frenkel » Thu Sep 30, 2010 8:31 am
Auria wrote: Code: Select all
StringClientData *StringClientData = new StringClientData [PtrArraySize];
StringClientData[0].SetFoo(x);
StringClientData[1].SetFoo(y);
StringClientData[2].SetFoo(z);
// ...
The exact name to call depends on the StringClientData class, of course
The class that I want to use is wxStringClientData. I want to append wxArrayString along with array of wxStringClientData to a wxSimpleHtmlListBox. If I try with:
Code: Select all
wxClientData *StringClientData = new wxStringClientData [5000];
then I cannot use the wxStringClientData::SetData function, because StringClientData[0]. has no access to wxStringClientData but only to wxClientData.
I also tried this way:
Code: Select all
wxStringClientData **StringClientData = new wxStringClientData* [5000];
StringClientData[i]->SetData(token); //works fine
SimpleHtmlList->Append(ArrayString,StringClientData); //compilation error: 'int wxItemContainer::Append(const wxString &,void *)' : cannot convert parameter 1 from 'wxArrayString' to 'const wxString &'
Still no success.
Last edited by
Marcus Frenkel on Thu Sep 30, 2010 11:18 am, edited 1 time in total.
jfouche
Super wx Problem Solver
Posts: 442 Joined: Tue May 06, 2008 4:52 pm
Location: France
Post
by jfouche » Thu Sep 30, 2010 9:53 am
why don't you use :
Code: Select all
wxStringClientData* StringClientData = new wxStringClientData [5000];
as wxStringClientData inherit wxClientData, there is no problem at all.
You can add it to you list box :
Code: Select all
wxStringClientData* clientDatas = new wxStringClientData[count];
...
for (size_t i = 0; i < count; ++i) {
m_myHtmlSimpleList->Append(label[i], &clientData[i]);
}
Jérémie
Marcus Frenkel
Experienced Solver
Posts: 79 Joined: Thu Sep 25, 2008 12:14 am
Post
by Marcus Frenkel » Thu Sep 30, 2010 10:17 am
jfouche wrote: why don't you use :
Code: Select all
wxStringClientData* StringClientData = new wxStringClientData [5000];
as wxStringClientData inherit wxClientData, there is no problem at all.
You can add it to you list box :
Code: Select all
wxStringClientData* clientDatas = new wxStringClientData[count];
...
for (size_t i = 0; i < count; ++i) {
m_myHtmlSimpleList->Append(label[i], &clientData[i]);
}
I want to add all items (5000 or more) at once, if they are added one by one the insertation speed is decreased a lot.
jfouche
Super wx Problem Solver
Posts: 442 Joined: Tue May 06, 2008 4:52 pm
Location: France
Post
by jfouche » Thu Sep 30, 2010 10:57 am
OK, I understand : the API doesn't provide you a way to add multiple items with client data in only one method. As you have lot's of data, I suggest you to switch to
wxHtmlListBox , which is better suitable vary a big quantity of datas.
Code: Select all
class MyListBox : public wxHtmlListBox
{
std::vector<MyData> m_datas;
public:
MyListBox(wxWindow*parent, ...)
: wxHtmlListBox(...)
{
// Fill your datas
for (size_t i = 0; i < ?; ++i) {
m_datas.push_back(MyData(...));
}
}
wxString OnGetItem(size_t n) const
{
return wxString::Format(wxT("<p>content : <b>%s</b></p>"), m_data[i].GetString().c_str());
}
}
Jérémie