S
Hallo,
ich habe mit Code::Blocks und wxSmith einen Dialog gebastelt, der u.a. einen StdDialogButtonSizer mit zwei Buttons "Save" und "Cancel" enthält. Der Cancel-Button funktioniert auch einwandfrei, aber der Save-Button macht einfach gar nichts. Das ist der Code, der den Dialog aufruft:
void Beamicon2Frame::OnMenuConfigMachine(wxCommandEvent& event)
{
ConfigDialog* dialog = new ConfigDialog(this);
if (dialog->ShowModal() == wxID_SAVE)
{
dialog->SaveConfig();
}
dialog->Destroy();
}
Meinem Verständnis nach müssten beide Buttons den Dialog beenden, d.h. irgendwie EndModal() aufrufen. Ich hab mal den Code angeschaut, den wxSmith automatisch generiert...
StdDialogButtonSizer1 = new wxStdDialogButtonSizer();
StdDialogButtonSizer1->AddButton(new wxButton(this, wxID_CANCEL, wxEmptyString));
StdDialogButtonSizer1->AddButton(new wxButton(this, wxID_SAVE, wxEmptyString));
StdDialogButtonSizer1->Realize();
schaut soweit ganz ok aus.
Das komische ist, das es einwandfrei funktioniert, wenn ich wxID_SAVE ersetze durch wxID_OK (natürlich sowohl in wxSmith als auch in meinem Code). Dann beenden beide Buttons den Dialog, und dialog->SaveConfig() wird auch aufgerufen, wenn Ok geclickt wurde.
Ich hab dann noch im Quelltext von wxStdButtonSizer "gespickelt":
void wxStdDialogButtonSizer::AddButton(wxButton *mybutton)
{
switch (mybutton->GetId())
{
[b]case wxID_OK:[/b]
[b]case wxID_YES:[/b]
[b]case wxID_SAVE:[/b]
m_buttonAffirmative = mybutton;
break;
case wxID_APPLY:
m_buttonApply = mybutton;
break;
case wxID_NO:
m_buttonNegative = mybutton;
break;
case wxID_CANCEL:
case wxID_CLOSE:
m_buttonCancel = mybutton;
break;
case wxID_HELP:
case wxID_CONTEXT_HELP:
m_buttonHelp = mybutton;
break;
default:
break;
}
}
Also OK, YES und SAVE müssten eigentlich komplett gleich behandelt werden, außer den unterschiedlichen Labels und IDs natürlich.
Was mach ich falsch? Es kann doch nicht Sinn der Sache sein, dass ich jetzt für die Standard-Buttons extra Events definieren muss.