wxWidgets - seltsames Problem
-
Probiere mal ein anderes Framework.
-
!rr!rr_. schrieb:
Probiere mal ein anderes Framework.
Probiere mal einen anderen Nickname.
Nein, im Ernst, man muss es ja nicht gleich mit der Radikallösung versuchen.
-
Wird das Notebook vllt nur nicht angezeigt? Das dynamische Einfügen von Elementen kann manchmal dazu führen dass diese nicht sofort angezeigt werden.
Sende mal ein wxPaintEvent nach dem Einfügen und schau obs dann da is oder maximiere/minimiere das Fenster mal nach Druck auf den Button und schau obs dann angezeigt wird. Wenn ja, dann wie beschrieben einfach ein wxPaintEvent erzeugen und senden.http://code.google.com/p/awesomescript/source/browse/trunk/AwesOmeScript/Mainframe.cpp
Zeile 227 wird eine neue Ansicht erzeugt und das hatte auch immer zu Fehlern geführt in der Darstellung.// Send Size Event wxSizeEvent sizeEvent; sizeEvent.SetEventObject(this); ProcessEvent(sizeEvent);
Dieser Codeschnipsel hat dies behoben.
rya.
-
Erstmal: Danke, dass sich jemand um mein Problem kümmert!
wxSkip schrieb:
1. event.Skip() zum Handler hinzufügen
Das habe ich eben ausprobiert. Kein Unterschied.
wxSkip schrieb:
2. Den Button außerhalb des Notebooks anlegen
Der Button liegt außerhalb des Notebooks! Falls du meintest, ich sollte den Button völlig außerhalb des Frames anlegen: Das habe ich auch ausprobiert: Ebenfalls ohne Erfolg.
wxSkip schrieb:
3. direkt notebook->AddPage(new wxPanel(...)...) schreiben
Die Funktion AddPage() habe ich lediglich eingefügt, um zu zeigen, dass sie in Zeile 25 funktioniert und in Zeile 29 eben nicht mehr. Übrigens habe ich es auch schon ausprobiert, statt AddPage in Zeile 25 direkt den EventHandler OnButton aufzurufen, und da gibt es überhaupt kein Problem. Erst wenn der komplette "Frame-Erstellvorgang" abgeschlossen ist, und das Fenster auf meinen Buttonklick wartet, stürzt das Programm ab.
scorcher24@public.pc schrieb:
Wird das Notebook vllt nur nicht angezeigt? Das dynamische Einfügen von Elementen kann manchmal dazu führen dass diese nicht sofort angezeigt werden.
Nein, das ist nicht der Fall. Wie gesagt, das Programm stürzt richtig kräftig ab.
Mit dem VC++-Debugger bekomme ich folgende Meldung:
Unhandled exception at 0xffffffff in test.exe: 0xC0000005: Access violation.
Der Fehler tritt dem Debugger nach in der Funktion
wxCheckDynamicCast()
auf.Kann es sein, dass einfach ein Fehler beim Kompilieren von wxWidgets aufgetreten ist?
-
Ich bin ein wenig weiter gekommen!
Ich speichere nun den Zeiger auf wxNotebook jetzt nicht mehr in der Klasse.
Meine FunktionAddPage()
sieht demnach so aus:void AddPage() { wxNotebook* notebook = FindWindow(id); if (!notebook) return; notebook->AddPage(new wxPanel(notebook), wxT("Text")); }
Fehlermeldung (während dem Build-Vorgang)
error C2440: 'initializing' : cannot convert from 'wxWindow *' to 'wxNotebook *'
Kann sich jemand darauf einen reim machen? wxNotebook ist doch von wxWindow abgeleitet oder nicht?
-
OK ich habe meinen Fehler entdeckt!!!
button->Connect(...)
ist falsch!!!
man mussthis->Connect(ID_BUTTON, ...)
schreiben...
-
daersc schrieb:
Fehlermeldung (während dem Build-Vorgang)
error C2440: 'initializing' : cannot convert from 'wxWindow *' to 'wxNotebook *'
Kann sich jemand darauf einen reim machen? wxNotebook ist doch von wxWindow abgeleitet oder nicht?
Ja, du kannst ja auch wxNotebook * in wxWindow * konvertieren, aber nicht umgekehrt.
-
wxSkip schrieb:
daersc schrieb:
Fehlermeldung (während dem Build-Vorgang)
error C2440: 'initializing' : cannot convert from 'wxWindow *' to 'wxNotebook *'
Kann sich jemand darauf einen reim machen? wxNotebook ist doch von wxWindow abgeleitet oder nicht?
Ja, du kannst ja auch wxNotebook * in wxWindow * konvertieren, aber nicht umgekehrt.
Doch das sollte schon funktionieren. Vorausgesetzt natürlich, der Zeiger auf ein
wxWindow
zeigt auf ein Objekt vonwxNotebook
.FindWindow()
hat mir aber nur ungültige Zeiger zurückgegeben, ich vermute weil ich ebenbutton->Connect
stattConnect
geschrieben habe...
-
void AddPage() { wxNotebook* notebook = FindWindow(id); if (!notebook) return; notebook->AddPage(new wxPanel(notebook), wxT("Text")); }
Warum machst Du hier eigentlich das Leben so schwer? Speicher doch einfach einen Zeiger auf das wxNotebook und fertig?
rya.
-
daersc schrieb:
wxSkip schrieb:
daersc schrieb:
Fehlermeldung (während dem Build-Vorgang)
error C2440: 'initializing' : cannot convert from 'wxWindow *' to 'wxNotebook *'
Kann sich jemand darauf einen reim machen? wxNotebook ist doch von wxWindow abgeleitet oder nicht?
Ja, du kannst ja auch wxNotebook * in wxWindow * konvertieren, aber nicht umgekehrt.
Doch das sollte schon funktionieren. Vorausgesetzt natürlich, der Zeiger auf ein
wxWindow
zeigt auf ein Objekt vonwxNotebook
.FindWindow()
hat mir aber nur ungültige Zeiger zurückgegeben, ich vermute weil ich ebenbutton->Connect
stattConnect
geschrieben habe...Klar funktioniert das, aber nur mit einem Cast. Zur Compilezeit ist nämlich noch nicht bekannt, auf was für ein Objekt der Zeiger zeigt.