Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [wx] wxArray не хочет хранить елементы 
V
    Опции темы
7nik
Дата 24.8.2014, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
Amp
Дата 31.8.2014, 16:02 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 7
Всего: 17



Ты же по значению testArray возвращаешь.
PM MAIL   Вверх
7nik
Дата 1.9.2014, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 31.12.2012
Где: Украина

Репутация: нет
Всего: нет



Amp, спасибо, переделка кода под testArray* testArray::get(); решила проблему. Как ни парадоксально, но я в своем проекте сделал это же изменение, правда по другим причинам.
После напряженных раздумий все стало ясно и понятно. Пойду искать другие подводные камни. Еще раз спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0429 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.