Новичок
Профиль
Группа: Участник
Сообщений: 2
Регистрация: 31.12.2012
Где: Украина
Репутация: нет Всего: нет
|
wxWidgets 3.1.0; IDE Code::Blocks Мне нужна динамическая коллекция объектов. По нажатию кнопки должен добавится элемент, а с помощью чусера(комбобокса) я должен выбрать один из них. Объекты хранятся в wxObjArray. При каждом вызове метода добавления/получения элемента класса testArray массив оказывается пустой. | Код | //testItem.h
#ifndef TESTITEM_H #define TESTITEM_H
class testItem { public: testItem(); testItem(const testItem&); virtual ~testItem(); void showId(); protected: private: wxString id; };
#endif // TESTITEM_H
//testItem.cpp
#include "testItem.h"
#include <wx/msgdlg.h>
testItem::testItem() { static int count = 0; id = wxString() << count++; }
testItem::testItem(const testItem& obj) { id = wxT("copy of ") + obj.id; }
testItem::~testItem() {}
void testItem::showId() { wxMessageBox(id, wxT("testItem id")); }
//testArray.h
#ifndef TESTARRAY_H #define TESTARRAY_H
#include <wx/dynarray.h> #include "testItem.h"
WX_DECLARE_OBJARRAY(testItem, testArr);
class testArray { public: static testArray get(); virtual ~testArray(); testItem* addItem(); testItem* getItem(size_t n); size_t getCount(); protected: private: testArray(); testArr arr; };
#endif // TESTARRAY_H
//testArray.cpp
#include "testArray.h"
#include <wx/arrimpl.cpp> WX_DEFINE_OBJARRAY(testArr)
testArray::testArray() {}
testArray::~testArray() {}
testItem* testArray::addItem() { arr.Add(testItem()); return &arr[arr.GetCount()-1]; }
testItem* testArray::getItem(size_t n) { return &arr[n]; }
size_t testArray::getCount() { return arr.GetCount(); }
testArray testArray::get() { static testArray instance = testArray(); return instance; }
//testMain.h
/*************************************************************** * Name: testMain.h * Purpose: Defines Application Frame * Author: 7nik ([email protected]) * Created: 2014-08-24 * Copyright: 7nik () * License: **************************************************************/
#ifndef TESTMAIN_H #define TESTMAIN_H
//(*Headers(testFrame) #include <wx/sizer.h> #include <wx/stattext.h> #include <wx/menu.h> #include <wx/choice.h> #include <wx/button.h> #include <wx/frame.h> #include <wx/statusbr.h> //*)
class testFrame: public wxFrame { public:
testFrame(wxWindow* parent,wxWindowID id = -1); virtual ~testFrame();
private:
//(*Handlers(testFrame) void OnQuit(wxCommandEvent& event); void OnAbout(wxCommandEvent& event); void OnButton1Click(wxCommandEvent& event); void OnChoice1Select(wxCommandEvent& event); //*)
//(*Identifiers(testFrame) static const long ID_CHOICE1; static const long ID_BUTTON1; static const long ID_STATICTEXT1; static const long idMenuQuit; static const long idMenuAbout; static const long ID_STATUSBAR1; //*)
//(*Declarations(testFrame) wxButton* Button1; wxStaticText* StaticText1; wxStatusBar* StatusBar1; wxChoice* Choice1; //*)
DECLARE_EVENT_TABLE() };
#endif // TESTMAIN_H
// testMain.cpp
/*************************************************************** * Name: testMain.cpp * Purpose: Code for Application Frame * Author: 7nik ([email protected]) * Created: 2014-08-24 * Copyright: 7nik () * License: **************************************************************/
#include "wx_pch.h" #include "testMain.h" #include <wx/msgdlg.h>
//(*InternalHeaders(testFrame) #include <wx/intl.h> #include <wx/string.h> //*)
#include "testArray.h"
//helper functions enum wxbuildinfoformat { short_f, long_f };
wxString wxbuildinfo(wxbuildinfoformat format) { wxString wxbuild(wxVERSION_STRING);
if (format == long_f ) { #if defined(__WXMSW__) wxbuild << _T("-Windows"); #elif defined(__UNIX__) wxbuild << _T("-Linux"); #endif
#if wxUSE_UNICODE wxbuild << _T("-Unicode build"); #else wxbuild << _T("-ANSI build"); #endif // wxUSE_UNICODE }
return wxbuild; }
//(*IdInit(testFrame) const long testFrame::ID_CHOICE1 = wxNewId(); const long testFrame::ID_BUTTON1 = wxNewId(); const long testFrame::ID_STATICTEXT1 = wxNewId(); const long testFrame::idMenuQuit = wxNewId(); const long testFrame::idMenuAbout = wxNewId(); const long testFrame::ID_STATUSBAR1 = wxNewId(); //*)
BEGIN_EVENT_TABLE(testFrame,wxFrame) //(*EventTable(testFrame) //*) END_EVENT_TABLE()
testFrame::testFrame(wxWindow* parent,wxWindowID id) { //(*Initialize(testFrame) wxMenuItem* MenuItem2; wxMenuItem* MenuItem1; wxMenu* Menu1; wxBoxSizer* BoxSizer1; wxMenuBar* MenuBar1; wxMenu* Menu2;
Create(parent, id, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE, _T("id")); BoxSizer1 = new wxBoxSizer(wxVERTICAL); Choice1 = new wxChoice(this, ID_CHOICE1, wxDefaultPosition, wxDefaultSize, 0, 0, 0, wxDefaultValidator, _T("ID_CHOICE1")); BoxSizer1->Add(Choice1, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); Button1 = new wxButton(this, ID_BUTTON1, _("add"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON1")); BoxSizer1->Add(Button1, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); StaticText1 = new wxStaticText(this, ID_STATICTEXT1, _("count:0"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT1")); BoxSizer1->Add(StaticText1, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); SetSizer(BoxSizer1); MenuBar1 = new wxMenuBar(); Menu1 = new wxMenu(); MenuItem1 = new wxMenuItem(Menu1, idMenuQuit, _("Quit\tAlt-F4"), _("Quit the application"), wxITEM_NORMAL); Menu1->Append(MenuItem1); MenuBar1->Append(Menu1, _("&File")); Menu2 = new wxMenu(); MenuItem2 = new wxMenuItem(Menu2, idMenuAbout, _("About\tF1"), _("Show info about this application"), wxITEM_NORMAL); Menu2->Append(MenuItem2); MenuBar1->Append(Menu2, _("Help")); SetMenuBar(MenuBar1); StatusBar1 = new wxStatusBar(this, ID_STATUSBAR1, 0, _T("ID_STATUSBAR1")); int __wxStatusBarWidths_1[1] = { -1 }; int __wxStatusBarStyles_1[1] = { wxSB_NORMAL }; StatusBar1->SetFieldsCount(1,__wxStatusBarWidths_1); StatusBar1->SetStatusStyles(1,__wxStatusBarStyles_1); SetStatusBar(StatusBar1); BoxSizer1->Fit(this); BoxSizer1->SetSizeHints(this);
Connect(ID_CHOICE1,wxEVT_COMMAND_CHOICE_SELECTED,(wxObjectEventFunction)&testFrame::OnChoice1Select); Connect(ID_BUTTON1,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&testFrame::OnButton1Click); Connect(idMenuQuit,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&testFrame::OnQuit); Connect(idMenuAbout,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&testFrame::OnAbout); //*) }
testFrame::~testFrame() { //(*Destroy(testFrame) //*) }
void testFrame::OnQuit(wxCommandEvent& event) { Close(); }
void testFrame::OnAbout(wxCommandEvent& event) { wxString msg = wxbuildinfo(long_f); wxMessageBox(msg, _("Welcome to...")); }
void testFrame::OnButton1Click(wxCommandEvent& event) { testArray arr = testArray::get(); Choice1->Insert(wxString("item ") << Choice1->GetCount(), Choice1->GetCount()); arr.addItem(); StaticText1->SetLabel(wxString("count: ") << arr.getCount()); }
void testFrame::OnChoice1Select(wxCommandEvent& event) { testArray::get().getItem(event.GetInt())->showId(); }
|
P.S.: если тип переменой testArray::arr сменить на testArr* и соответственно подправить код, то все работает. P.S.2: если её перенести в testMain и обращаться к массиву из обработчиком событий напрямую, то так же будет проблем, но такой вариант меня не устраивает. Вопрос: почему именно этот вариант кода не работает? Это сообщение отредактировал(а) 7nik - 24.8.2014, 18:12
|