Seltsames wxWidgets Klassenproblem
-
Hallo,
habe ein Problem dass in meiner von wxFrame abgeleiteten Klasse die Variablen nicht richtig ausgelesen werden können. Ich vermute das hat irgendwas mit dem Umweg über Events zu tun, bin aber nach langem rumprobieren eher noch verwirrter als vorher und das Problem besteht weiterhin. Hier erstmal der Code:#include <wx/wx.h> using namespace std; class BasicFrame : public wxFrame { private: int laenge; wxPanel *panel; public: BasicFrame(const wxChar *title, int xpos, int ypos, int width, int height) :wxFrame((wxFrame *) NULL, -1, title, wxPoint(xpos,ypos), wxSize(width,height)) { laenge = 200; panel = new wxPanel(this,wxID_ANY,wxDefaultPosition,wxSize(laenge,laenge)); panel->Connect(wxEVT_PAINT,wxPaintEventHandler(BasicFrame::OnPaint)); }; ~BasicFrame() {}; void OnPaint(wxPaintEvent &event) { wxPaintDC dc(this); dc.DrawRectangle(0,0,laenge,laenge); DrawKoord(dc); } void DrawKoord(wxPaintDC &dc) { dc.DrawLine(laenge/10,laenge/10,laenge/10,laenge/95); } }; class HalloWeltApp : public wxApp { public: virtual bool OnInit() { BasicFrame *frame = new BasicFrame( wxT("Hallo Welt"),50,50,360,280); frame->Show(true); SetTopWindow(frame); return true; }; }; IMPLEMENT_APP(HalloWeltApp)
Seltsamerweise wird aber nun die Variable laenge in den beiden Funktionen OnPaint und DrawKoord nicht richtig angeigt. Lasse ich mir beim Zeichnen in DrawKoord die Variable noch ausgeben, hat sie den Wert 0. Verschiebe ich die Deklaration "int laenge;" in den public Bereich, so hat die Variable beim Ausgeben den Wert 6681436. Was muss ich tun, damit diese verdammte Variable 200 erthält so wie ich es will...
Bin für jede Hilfe dankbar
Mfg Felsen
-
Du müsstest den PaintDC mit panel statt this initialisieren, schliesslich bezieht sich der event ja auf das Panel.
Ansonsten sieht dein Code auf den ersten Blick korrekt aus.
-
Danke dir phlox81,
der Einwand klingt plausibel. Allerdings gibts üble Probleme wenn ich die betreffende Zeile umändere. Das Frame baut sich nicht anständig auf und lässt sich auch nicht mehr beenden. Das hat mit Sicherheit den selben Grund wie auch die Variable leange.
Beide können nämlich scheinbar in dieser Methode nicht ausgelesen werden. Deswegen funktioniert das Zeichnen nicht, und deswegen gibts auch die Fehler wenn ich this in panel umwandle.Weiß jemand dagegen eine Lösung?
-
Irgendwas stimmt mit der Variablen "panel" nicht. Ist eine Member-Variable von BasicFrame, wird jedoch nirgends mit einem Wert belegt. Und im Konstruktor rufst du einfach "panel->Connect(..." auf, dabei Zeigt panel irgendwohin, aber wohin?
-
Hallo Softwaremaker,
danke schon mal für deinen Beitrag. Das war ein kleiner Fehler meinerseits. Der Orignalcode ist noch um einiges länger, mit zahllosen anderen Kontrollelementen. Da die aber alle keine Rolle bei dem Problem spielen hab ich sie aus dem Code genommen, damit man sich schneller einen Überblick verschaffen kann.
Es geht einzig und allein um die Variable die nicht erkannt wird.
-
mhh vielleicht ist der connect-Befehl nich vollständig:
void Connect(wxEventType eventType, wxObjectEventFunction function, wxObject* userData = NULL, wxEvtHandler* eventSink = NULL)
eventSink: Object whose member function should be called. If this is NULL, this will be used.
also besser:
panel->Connect(wxEVT_PAINT,wxPaintEventHandler(BasicFrame::OnPaint), NULL, this);
this = basicframe
Denn du rufst ja die Connect-Funktion des Panels auf und da eventSink nicht angegeben ist nimmt er this=*panel.
Update: ich hab nochmal in event.h nachgeschaut, dort wird ohne Angabe von eventSink der Parameter eventSink auf NULL gesetzt und in wxPanel dann this (=wxPanel) genommen. Also unbedingt meinen Code nehmen.
-
Das wars!!!
Vielen Dank. Wär ich nie drauf gekommen. Jetzt funktioniert auch noch der Tipp von phlox81. Vielen Dank Softwaremaker