Eigener wxDialog Problem
-
Hey,
ich habe ein Problem beim Erstellen eines eigenen Dialogs. Eigentlich mache ich alles ähnlich wie in dem wxWidgets Tutorial II. Trotzdem gibt mir der Compiler Fehlermeldungen die ich nicht verstehe, beziehungsweise lösen kann.
Vorab eine kleine Beschreibung des Programms. Im Hauptframe habe ich ein Button der beim Drücken einen Dialog anzeigen soll. In diesem Dialog sollen dann eine Listbox und mehrere Buttons angezeigt werden. Leider scheitere ich schon beim Öffnen des Dialogs. Mein Klasse sieht so aus:class ListboxDlg : public wxDialogBase { public: ListboxDlg(wxWindow* parent, wxWindowID id); ... };
Die ich dann so implementiere:
ListboxDlg::ListboxDlg(wxWindow* parent, wxWindowID id) : wxDialog(parent, id) { ... }
In meiner Main-Funktion sieht der Aufruf so aus:
... wxButton* btnListbox = new wxButton(panel, wxID_OPEN); Connect(wxID_OPEN, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MainFrame::OnList)); ... void MainFrame::OnList(wxCommandEvent& event) { ListboxDlg* lb = new ListboxDlg(panel, -1); if(lb.ShowModal() == wxID_OK) { // Mach etwas mit den ListBoxWerten } }
Ich hoffe das reicht an Quellcode um den Fehler zu erkennen, sonst poste ich gerne noch mehr. Wollte bloß nicht zu viel Ballast mitliefern.
Zum Schluß noch die Fehlermeldung:/home/sicksta/CppProjects/wxWidgets/Projekt/Main.cpp
In member function ‘void MainFrame::OnList(wxCommandEvent&)’
/home/sicksta/CppProjects/wxWidgets/Projekt/Main.cpp
error: cannot allocate an object of abstract type ‘ListboxDlg’
/home/sicksta/CppProjects/wxWidgets/FilmManager/Listbox.hpp
note: **because the following virtual functions are pure within ‘ListboxDlg’
*/usr/local/include/wx-2.8/wx/dialog.h|45|note: virtual int wxDialogBase::ShowModal()|
/usr/local/include/wx-2.8/wx/dialog.h|46|note: virtual void wxDialogBase::EndModal(int)|
/usr/local/include/wx-2.8/wx/dialog.h|47|note: virtual bool wxDialogBase::IsModal() const|
/home/sicksta/CppProjects/wxWidgets/Projekt/Main.cpp
error: request for member ‘ShowModal’ in ‘lb’, which is of non-class type ‘ListboxDlg’|
||=== Build finished: 2 errors, 0 warnings ===|Mit freundlichen Grüßen auf eine Antwort wartend
SickSta
-
Solltest du nicht von einem wxDialog ableiten, anstatt von einer nicht bekannten wxDialogBase Klasse?
class ListboxDlg : public wxDialogBase
sollte also eher
class ListboxDlg : public wxDialog
heißen.
-
Vielen Dank das hat den ersten Fehler beseitigt. Ich wusste nicht das die Klasse unbekannt ist, da meine IDE Code::Blocks diese unter Auto-Vervollständigen angezeigt hat.
Jetzt ist nur noch der zweite Fehler da:request for member ‘ShowModal’ in ‘lb’, which is of non-class type ‘ListboxDlg*‘
Aber trotzdem schon vielen Dank für die schnelle Hilfe
-
OK, also du rufst die ShowModal Funktion falsch auf. Da es sich hierbei um eine mit new generierte Klasse handelt muß diese statt
... ListboxDlg* lb = new ListboxDlg(panel, -1); if(lb.ShowModal() == wxID_OK)
mit einem -> aufgerufen werden.
... ListboxDlg* lb = new ListboxDlg(panel, -1); if(lb->ShowModal() == wxID_OK)
-
Nochmal Danke für deine Bemühung, aber leider kriege ich jetzt eine andere Fehlermeldung:
undefined reference to `ListboxDlg::ListboxDlg(wxWindow*, int)'
Dieser bezieht sich auf die vorige Zeile also auf:
ListboxDlg* lb = new ListboxDlg(this, -1);
Aber mein Konstruktor ist doch eig richtig?! Header-Datei ist auch eingebunden, also die 'normalen' Fehlerquellen des Errors kann ich ausschließen?
PS:
Ich dachte ich hätte den falschen Konstruktor und hab ihn deswegen so abgeändert:ListboxDlg(wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE, const wxString& name = "Dialog Box");
Und der Aufruf so:
listboxDlg* lb = new ListboxDlg(panel, -1, wxT("Dialog"));
Aber der Fehler bleibt der gleiche ...
PPS:
Juhu, es funktioniert endlich. Hatte vergessen das Header File zu linken, weil ich davon ausgegangen bin das COdeblocks das alleine machtNochmals vielen Dank für die Hilfe und ein schönes Osterfest.
-
Ist wxWidgets korrekt in deiner Entwicklungsumgebung eingebunden?
-
Du musst sicherstellen das die cpp datei kompiliert und in die exe gelinkt wird.
-
phlox81 schrieb:
Du musst sicherstellen das die cpp datei kompiliert und in die exe gelinkt wird.
Oder so rum wars.