wxWidget - unverständliche Fehlermeldung
-
Hallo,
Ich bin noch sehr neu in wxWidget und kann den Fehler in meinem Code einfach nicht finden. Ich hoffe ihr könnt mir helfen.Basic.h
#ifndef H_BASIC_FRAME #define H_BASIC_FRAME #include <wx/wx.h> class BasicApp : public wxApp { public: virtual bool OnInit(); }; class BasicFrame : public wxFrame { public: BasicFrame(const wxString &Title, const wxPoint &Position = ::wxDefaultPosition, const wxSize &Size = ::wxDefaultSize); ~BasicFrame(); // Signal handlers void OnMenuInfoAbout(wxCommandEvent &Event); void OnMenuInfoHelp (wxCommandEvent &Event); void OnMenuFileNew (wxCommandEvent &Event); void OnMenuFileQuit (wxCommandEvent &Event); void OnSize(wxSizeEvent &Event); private: wxMenuBar* MenuBar; wxMenu *InfoMenu, *FileMenu; enum { Menu_Info_About, Menu_Info_Help, Menu_File_New, Menu_File_Quit }; DECLARE_EVENT_TABLE() }; #endif // H_BASIC_FRAME
Basic.cpp
#include "Basic.h" IMPLEMENT_APP(BasicApp); bool BasicApp::OnInit() { BasicFrame* Frame = new BasicFrame(wxT("wxWidget")); Frame->Show(true); this->SetTopWindow(Frame); return true; } BasicFrame::BasicFrame(const wxString &Title, const wxPoint &Position, const wxSize &Size) : wxFrame((wxFrame *) NULL, wxID_DEFAULT, Title, Position, Size) { this->MenuBar = new wxMenuBar(); this->FileMenu = new wxMenu(); this->FileMenu->Append(this->Menu_File_New, wxT("&New")); this->FileMenu->Append(this->Menu_File_Quit, wxT("&Quit")); this->MenuBar->Append(this->FileMenu, wxT("&File")); this->InfoMenu = new wxMenu(); this->InfoMenu->Append(this->Menu_Info_Help, wxT("&Help")); this->InfoMenu->Append(this->Menu_Info_About, wxT("&About")); this->MenuBar->Append(this->InfoMenu, wxT("&Info")); this->SetMenuBar(this->MenuBar); this->CreateStatusBar(); } BasicFrame::~BasicFrame() { } BEGIN_EVENT_TABLE(BasicFrame, wxFrame) EVT_MENU(Menu_File_New, BasicFrame::OnMenuFileNew) EVT_MENU(Menu_File_Quit, BasicFrame::OnMenuFileQuit) EVT_MENU(Menu_Info_Help, BasicFrame::OnMenuInfoHelp) EVT_MENU(Menu_Info_About, BasicFrame::OnMenuInfoAbout) EVT_SIZE(BasicFrame::OnSize) END_EVENT_TABLE() void BasicFrame::OnMenuFileNew(wxCommandEvent &Event) { this->SetStatusText(wxT("Creating a new file")); } void BasicFrame::OnMenuFileQuit(wxCommandEvent &Event) { this->Close(); } void BasicFrame::OnMenuInfoHelp(wxCommandEvent &Event) { this->SetStatusText(wxT("Showing the help file")); } void BasicFrame::OnMenuInfoAbout(wxCommandEvent &Event) { } void BasicFrame::OnSize(wxSizeEvent &Event) { wxString Test = wxString::Format(wxT("Size changed : %d / %d"), Event.GetSize().x, Event.GetSize().y); this->SetStatusText(Test); }
Und wenn ich das Kompiliere bekomme ich folgene Fehlermeldung, obwohl das Programm wenn ich auf "Nein" drücke einwandfrei funktioniert.
http://img5.imagebanana.com/img/64gl9mi/Fehler.jpg
Ich benutze Microsoft Visual C++ 2008 Express Edition unter Windows 7.
Vielen Dank!
MfG Icon²
-
Das ist kein Fehler sondern eine Warnung.
Und die Meldung sollte klar sein. Du hast noch keine StatusBar, und versuchst schon drauf zu zu greifen.
Kommentier nacheinander alle SetStatusText aus, bis du den verursachenden hast.
Ich tippe auf den in OnSize.
-
Jo. Lies doch mal deine Fehlermeldungen...
Und es hilft nix wenn du über 100 LOCs postet, beschränke dich bitte auf das wesentliche.phlox
-
@phlox81: Ich hab mir die Fehlermeldung durchgelesen, aber es gab für mich keinen Sinn, da ich ja im Konstruktor eine StatusBar erstelle, also noch bevor die
OnSize
Methode aufgerufen wird. Und weil der Status Text danach trotzdem richtig angezeigt wurde.
Und bei beschränke dich auf das Wesentliche ... ich hatte keine Ahnung wo der Fehler liegt ... ich wusste also nicht was wesentlich ist und was nicht tut mir leid.l'abra d'or: Danke dir, es liegt wirklich an dem
SetStatusText
in derOnSize
Methode, aber alle anderenSetStatusText
Aufrufe funktionieren fehlerfrei und lösen diese Warnung nicht aus. Nur der Aufruf in derOnSize
Methode. Und der Status Text wird ja trotz der Warnung fehlerfrei angezeigt. Warum also diese Warnung?
-
Icon² schrieb:
l'abra d'or: Danke dir, es liegt wirklich an dem
SetStatusText
in derOnSize
Methode, aber alle anderenSetStatusText
Aufrufe funktionieren fehlerfrei und lösen diese Warnung nicht aus. Nur der Aufruf in derOnSize
Methode. Und der Status Text wird ja trotz der Warnung fehlerfrei angezeigt. Warum also diese Warnung?Wenn du dir die Meldung genau durchliest, kommst du auf die selbe Vermutung
failed in wxFrameBase::SetStatusText(): not status bar to set text for
in der zweiten Zeile ist eindeutig genug!
Und im Stack Punkt 10 und vor allem dann Punkt 5 lassen auf OnSize schließen.
Einfaches Lesen der Meldung hätte dich also schon recht weit gebracht.Ich nehme an, dass im Basisinitialisierer bereits ein ResizeEvent (keine Ahnung wie das bei wx heißt, ich hab davon 0,000 Ahnung!) auftritt, und durch die statische EventTable (keine Ahnung, was die ganzen Zaubermacros da machen) bereits vor Eintreten in den Konstruktor (!) die virtuelle OnSize() der abgeleiteten Klasse aufgerufen wird.
Wie du das jetzt lösen kannst? K.A. obs da eine schöne wx-basierte Lösung gibt. Ich kenn mich da nicht aus
-
Wenn man die
OnSize
Methode dynamisch verbindet, also nicht über denEventTable
, sondern via derConnenct
Methode, dann Funktioniert alles ohne Problemen.Wen die Lösung interessiert:
Man muss den
EVT_SIZE
Eintrag aus demEventTable
löschen und in derBasicApp::OnInit
MethodeFrame->Connect(wxID_ANY, wxEVT_SIZING, wxObjectEventFunction(&BasicFrame::OnSize));
einfügen, noch vor
SetTopWindow
einfügen, dann funktioniert alles ohne Probleme.Danke für eure Hilfe Gruß Icon²