2 * wxTextCtrl = ошибка завершения программы Topic is solved

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
p001
Knows some wx things
Knows some wx things
Posts: 25
Joined: Sun Aug 28, 2022 9:24 am

2 * wxTextCtrl = ошибка завершения программы

Post by p001 »

Здравствуйте.

Имеем:
Я - уровень дно;
Windows 10;
wxWidgets 3.1.5;
Простой код с двумя виджетами wxTextCtrl;

Что не работает:
При завершении программы, у которой 2 виджета wxTextCtrl, завершается с ошибкой.
Программа нормально завершается если есть только один виджет wxTextCtrl, если 2 и более то ошибка.

Вопрос:
1. В чем ошибка?
Пробовал читать офиц. документацию на оф. сайте про wxTextCtrl, не понял...

Код:

Code: Select all

#include <wx/wx.h>
#include <wx/button.h>

class Traning : public wxFrame {
	public:
		wxTextCtrl* m_textCtrlLeft;
		wxTextCtrl* m_textCtrlRight;
		wxButton* m_buttonExit;
			const int id_buttonExit = 1;

	public:
		Traning (const wxString& aTitle)
                    : wxFrame (0, wxID_ANY, aTitle, wxDefaultPosition, wxSize (300, 150)) {

			wxPanel* panel1 = new wxPanel (this, wxID_ANY);

			m_textCtrlLeft = new wxTextCtrl (panel1, wxID_ANY, wxEmptyString);
			m_textCtrlRight = new wxTextCtrl (panel1, wxID_ANY, wxEmptyString);

			m_buttonExit = new wxButton (panel1, id_buttonExit, wxT("Выход"));

			Bind (wxEVT_COMMAND_BUTTON_CLICKED, &Traning::performExit,
					this, id_buttonExit);

			wxBoxSizer* boxSizerH1 = new wxBoxSizer (wxHORIZONTAL);
			boxSizerH1->Add (m_textCtrlLeft, 1, wxEXPAND, 5);
			boxSizerH1->Add (m_textCtrlRight, 1, wxEXPAND, 5);

			wxBoxSizer* boxSizerVall = new wxBoxSizer (wxVERTICAL);
			boxSizerVall->Add (boxSizerH1, 1, wxEXPAND, 5);
			boxSizerVall->Add (m_buttonExit, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);

			panel1->SetSizer (boxSizerVall);
			Centre ();
		}

	public:
		void performExit (wxCommandEvent& event) {
			Destroy ();
		}
};

class MyApp : public wxApp {
	public:
		virtual bool OnInit () {
			Traning* Traning1 = new Traning (wxT("Traning1"));
			Traning1->Show (true);

			return true;
		}
};

IMPLEMENT_APP(MyApp)

P.S.: режет глаза именование переменных? это у меня идет из машиностроения и Госта, но с английским языком выглядит убого :(
Last edited by p001 on Sun Aug 28, 2022 1:14 pm, edited 3 times in total.
User avatar
doublemax
Moderator
Moderator
Posts: 19103
Joined: Fri Apr 21, 2006 8:03 pm
Location: $FCE2

Re: 2 * wxTextCtrl = ошибка завершения программы

Post by doublemax »

Please mention platform and wxWidgets version.

This is most likely the same bug as this: https://github.com/wxWidgets/wxWidgets/issues/22639
Use the source, Luke!
p001
Knows some wx things
Knows some wx things
Posts: 25
Joined: Sun Aug 28, 2022 9:24 am

Re: 2 * wxTextCtrl = ошибка завершения программы

Post by p001 »

doublemax wrote: Sun Aug 28, 2022 11:52 am Please mention platform and wxWidgets version.

This is most likely the same bug as this: https://github.com/wxWidgets/wxWidgets/issues/22639
Added
User avatar
doublemax
Moderator
Moderator
Posts: 19103
Joined: Fri Apr 21, 2006 8:03 pm
Location: $FCE2

Re: 2 * wxTextCtrl = ошибка завершения программы

Post by doublemax »

If it's the same bug, you either need to get the latest wxWIdgets version from GitHub, or wait for the 3.2.1 release.
Use the source, Luke!
p001
Knows some wx things
Knows some wx things
Posts: 25
Joined: Sun Aug 28, 2022 9:24 am

Re: 2 * wxTextCtrl = ошибка завершения программы

Post by p001 »

Вот в этом коде лучше видна проблема(у меня):
Описание:
Окно Window1 через кнопку вызывает окно Window2.
Когда закрываешь окно Window2, то программа аварийно закрывается, т.е. закрывается и окно Window1.

код:

Code: Select all

#include <wx/wx.h>
#include <wx/button.h>

/*
Окно Window1 через кнопку вызывает окно Window2.
Когда закрываешь окно Window2, то программа аварийно закрывается, т.е. закрывается и окно Window1.
*/

class Window2 : public wxFrame {
    public:
        wxTextCtrl* m_textCtrlLeft;
        wxTextCtrl* m_textCtrlRight;
        wxButton* m_buttonExit;
            const int id_buttonExit = 1;

    public:
        Window2 (const wxString& aTitle)
                    : wxFrame (0, wxID_ANY, aTitle, wxDefaultPosition, wxSize (300, 150)) {

            wxPanel* panel1 = new wxPanel (this, wxID_ANY);

            m_textCtrlLeft = new wxTextCtrl (panel1, wxID_ANY, wxEmptyString);
            m_textCtrlRight = new wxTextCtrl (panel1, wxID_ANY, wxEmptyString);

            m_buttonExit = new wxButton (panel1, id_buttonExit, wxT("Выход"));

            Bind (wxEVT_COMMAND_BUTTON_CLICKED, &Window2::performExit,
                    this, id_buttonExit);

            wxBoxSizer* boxSizerH1 = new wxBoxSizer (wxHORIZONTAL);
            boxSizerH1->Add (m_textCtrlLeft, 1, wxEXPAND, 5);
            boxSizerH1->Add (m_textCtrlRight, 1, wxEXPAND, 5);

            wxBoxSizer* boxSizerVall = new wxBoxSizer (wxVERTICAL);
            boxSizerVall->Add (boxSizerH1, 1, wxEXPAND, 5);
            boxSizerVall->Add (m_buttonExit, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);

            panel1->SetSizer (boxSizerVall);
            Centre ();
        }

    public:
        void performExit (wxCommandEvent& event) {
            Destroy ();
        }
};


class Window1 : public wxFrame {
    public:
        wxButton* m_buttonWindow2;
            const int id_buttonWindow2 = 1;
        wxButton* m_buttonExit;
            const int id_buttonExit = 2;

    public:
        Window1 (const wxString& aTitle)
                    : wxFrame (0, wxID_ANY, aTitle, wxDefaultPosition, wxSize (200, 150)) {

            wxPanel* panel1 = new wxPanel (this, wxID_ANY);

            m_buttonWindow2 = new wxButton (panel1, id_buttonWindow2, wxT("Window2"));
            m_buttonExit = new wxButton (panel1, id_buttonExit, wxT("Выход"));

			Bind (wxEVT_COMMAND_BUTTON_CLICKED, &Window1::showWindow2,
                    this, id_buttonWindow2);
			Bind (wxEVT_COMMAND_BUTTON_CLICKED, &Window1::performExit,
                    this, id_buttonExit);

            wxBoxSizer* boxSizerVall = new wxBoxSizer (wxVERTICAL);
            boxSizerVall->Add (m_buttonWindow2, 1, wxEXPAND, 5);
            boxSizerVall->Add (m_buttonExit, 1, wxEXPAND, 5);

            panel1->SetSizer (boxSizerVall);
            Centre ();
		}

	public:
		void showWindow2 (wxCommandEvent& event) {
            Window2* Window21 = new Window2 (wxT("Window2"));
            Window21->Show (true);
		}

        void performExit (wxCommandEvent& event) {
            Destroy ();
        }
};


class MyApp : public wxApp {
    public:
        virtual bool OnInit () {
            Window1* Window11 = new Window1 (wxT("Window1"));
            Window11->Show (true);

            return true;
        }
};

IMPLEMENT_APP(MyApp)
Еще дополню информацию о том чем писал/собирал программу:
1. codeBlocks;

2. компилятор tdm:
https://jmeubank.github.io/tdm-gcc/download/

3. wxW 3.1.7;

3.1. Был собран со следующими параметрами:
mingw32-make -j2 -f makefile.gcc SHARED=1 BUILD=debug CXXFLAGS="-std=c++17" SHELL=cmd.exe
Без явного указания использовать юникод.

3.2. В настройках компилятора используются следующие параметры:
общие:
-pipe
-mthreads
-funsigned-char
-std=c++17
-Wall

для debug:
-g
-funsigned-char


4. windows 10 x64;
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7449
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Re: 2 * wxTextCtrl = ошибка завершения программы

Post by ONEEYEMAN »

Dobrogo vremeni sutok,
A debugit ne probovali?

Tam vrode u Code::Blocks est debugger...

Spasibo.
p001
Knows some wx things
Knows some wx things
Posts: 25
Joined: Sun Aug 28, 2022 9:24 am

Re: 2 * wxTextCtrl = ошибка завершения программы

Post by p001 »

По ссылке ниже можно найти ответ. Как я понял, зависит от компилятора.
https://github.com/wxWidgets/wxWidgets/issues/22735
p001
Knows some wx things
Knows some wx things
Posts: 25
Joined: Sun Aug 28, 2022 9:24 am

Re: 2 * wxTextCtrl = ошибка завершения программы

Post by p001 »

как я понял, это был баг wxWidgets. Его исправили в версии 3.2.2. Все работает.
Post Reply