Reputation: 393
Here's my code. I the IDs are different now but the problem is I can't seem to trigger events when I press the buttons. I'm kinda confused as to why the events won't trigger. It used to work when both ID's were wxID_ANY but both buttons do the same thing when I do that, now, when I declared a new ID, none of em won't work.
HEADER:
#include <vector>
#include <wx/wx.h>
using namespace std;
const int MAX = 100;
class determinantsFrame : public wxFrame
{
public:
determinantsFrame();
virtual ~determinantsFrame();
void OnQuit(wxCommandEvent &event);
void OnAbout(wxCommandEvent &event);
void OnClose(wxCloseEvent &event);
void OnCalculateClick(wxCommandEvent &event);
void OnReset(wxCommandEvent &event);
double determinant(double matrix[MAX][MAX], int order);
private:
static const long ID_Calculate;
static const long ID_Reset;
wxPanel *MainPanel;
wxButton *Enter;
wxButton *Reset;
wxMenu *fileMenu;
wxMenu *helpMenu;
wxMenuBar *menuBar;
wxTextEntryDialog *td;
wxString str;
//vector<double> value;
DECLARE_EVENT_TABLE();
};
CPP:
#include <wx/wx.h>
#include "determinantsFrame.h"
#include <vector>
#include <stdio.h>
#include <cmath>
#include <vector>
using namespace std;
BEGIN_EVENT_TABLE(determinantsFrame, wxFrame)
EVT_MENU(wxID_ABOUT, determinantsFrame::OnAbout)
EVT_MENU(wxID_EXIT, determinantsFrame::OnQuit)
EVT_CLOSE(determinantsFrame::OnClose)
EVT_BUTTON(ID_Calculate, determinantsFrame::OnCalculateClick)
EVT_BUTTON(ID_Reset, determinantsFrame::OnReset)
END_EVENT_TABLE()
int n;
wxTextCtrl *numbers[100][100];
const long determinantsFrame::ID_Calculate = wxNewId();
const long determinantsFrame::ID_Reset = wxNewId();
void determinantsFrame::OnClose(wxCloseEvent &event)
{
exit(1);
}
void determinantsFrame::OnAbout(wxCommandEvent &event)
{
wxString msg;
msg.Printf(wxT("Hello and welcome to %s"), wxVERSION_STRING);
wxMessageBox(msg, wxT("About Determinants Calculator"));
}
void determinantsFrame::OnQuit(wxCommandEvent &event)
{
Close();
}
determinantsFrame::~determinantsFrame()
{
Destroy();
}
determinantsFrame::determinantsFrame() : wxFrame(NULL, wxID_ANY, wxT("Determinants Calculator"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE)
{
wxStaticBoxSizer *matrix;
wxFlexGridSizer *cells;
wxBoxSizer *subBox;
wxBoxSizer *mainBox;
fileMenu = new wxMenu;
helpMenu = new wxMenu;
menuBar = new wxMenuBar();
helpMenu->Append(wxID_ABOUT, wxT("&About"), wxT("Show about dialog"));
fileMenu->Append(wxID_EXIT, wxT("&Exit"), wxT("Quit this program"));
menuBar->Append(fileMenu, wxT("&File"));
menuBar->Append(helpMenu, wxT("&Help"));
td = new wxTextEntryDialog(this, wxT("Enter the number of dimensions: "), wxGetTextFromUserPromptStr, wxT("2"));
td->ShowModal();
SetMenuBar(menuBar);
str = td->GetValue();
n = wxAtoi(str);
mainBox = new wxBoxSizer(wxVERTICAL);
MainPanel = new wxPanel(this, wxID_ANY);
matrix = new wxStaticBoxSizer(wxVERTICAL, MainPanel, "Matrix: ");
cells = new wxFlexGridSizer(0, n, 0, 0);
subBox = new wxBoxSizer(wxVERTICAL);
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
{
numbers[i][j] = new wxTextCtrl(MainPanel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(40,20), 0, wxDefaultValidator, _T("ID_TextCtrl"));
cells->Add(numbers[i][j], 0, wxALL | wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
}
matrix->Add(cells, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 2);
subBox->Add(matrix, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
wxBoxSizer *enb = new wxBoxSizer(wxHORIZONTAL);
wxBoxSizer *rnb = new wxBoxSizer(wxHORIZONTAL);
wxBoxSizer *bc = new wxBoxSizer(wxHORIZONTAL);
Enter = new wxButton(MainPanel, ID_Calculate, _("Calculate"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_Calculate"));
Reset = new wxButton(MainPanel, ID_Reset, _("Reset"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_Reset"));
enb->Add(Enter, 1, wxALL |wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
rnb->Add(Reset, 1, wxALL |wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
bc->Add(enb, 0, wxALL | wxEXPAND);
bc->Add(rnb, 0, wxALL | wxEXPAND);
subBox->Add(bc, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL);
MainPanel->SetSizer(subBox);
mainBox->Add(MainPanel);
mainBox->Fit(this);
this->SetSizer(mainBox);
CentreOnScreen();
}
void determinantsFrame::OnReset(wxCommandEvent &event)
{
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
numbers[i][j]->SetLabel(wxEmptyString);
}
void determinantsFrame::OnCalculateClick(wxCommandEvent &event)
{
double elem[MAX][MAX], det;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
elem[i][j] = static_cast<double>(wxAtoi(numbers[i][j]->GetValue()));
det = determinant(elem, n);
wxMessageBox(wxString::Format(wxT("%.2f"),det));
}
double determinantsFrame::determinant(double matrix[MAX][MAX], int order)
{
double det = 0, temp[MAX][MAX]; int row, col;
if (order == 1)
return matrix[0][0];
else if (order == 2)
return ((matrix[0][0] * matrix[1][1]) - (matrix[0][1] * matrix[1][0]));
else
{
for (int r = 0; r < order; r++)
{
col = 0; row = 0;
for (int i = 1; i < order; i++)
{
for (int j = 0; j < order; j++)
{
if (j == r)
continue;
temp[row][col] = matrix[i][j];
col++;
if (col == order - 1)
col = 0;
}
row++;
}
det = det + (matrix[0][r] * pow(-1, r) * determinant(temp, order - 1));
}
return det;
}
}
Upvotes: 0
Views: 415
Reputation: 22678
You can't use wxNewId()
which is a run-time function to initialize an ID used in compile-time event table macros. Either make the IDs real compile-time constants, or use Bind()
instead of the event tables to connect the handlers at run-time too.
As an aside, calling exit()
from OnClose()
is quite wrong. I strongly recommend looking at wxWidgets samples to see how things are typically done. Better yet would be to read the docs to understand why are they done like this, but this could be a next step.
Upvotes: 1