wxWidgets: Probleme mit wxTextCtrl - gelöst
-
Hallo zusammen,
ich will auf Eingaben in ein wxTextCtrl reagieren. Und zwar sofort. Also: der User gibt eine Zahl in ein wxTextCtrl ein und sobald die Taste gedrückt wurde, soll ein wxSlider auf den entsprechenden Wert gesetzt werden. Nun habe ich damit folgendes Problem:
Ich fange ein EVT_TEXT ab, leite es auf meine Funktion:
void FaderDialog::Text(wxCommandEvent& event) { if (event.GetEventType()==wxEVT_COMMAND_TEXT_UPDATED) { wxString s; long val; int i=event.GetId(); if ((i>=1150)&&(i<1200)) { i=i-1150; soben[i]=valueO[i]->GetValue(); //<-hier soben[i].ToLong(&val,10); if (val!=oben[i]) { oben[i]=(int)val; faderO[i]->SetValue(100-oben[i]); } } } }
Die bezeichnete Zeile lässt das Programm beim Erschaffen des Objekts crashen. Ich vermute, dass ich mit GetValue() wieder ein Event auslöse, das dann ziemlich schnell einen Überlauf verursacht. Kann das sein?
Was kann ich dagegen tun?
Gruß,
Sebastian
-
C_Bastian schrieb:
Ich vermute, dass ich mit GetValue() wieder ein Event auslöse, das dann ziemlich schnell einen Überlauf verursacht. Kann das sein?
Warum schaust du nicht nach? (Nein, es löst kein Event aus. Wozu auch?)
Was genau ist soben? Ein Array von 50 Strings? Sicher dass deine Berechnungen bezüglich des Indexes richtig sind? Der ganze Kram mit i sieht ohnehin ziemlich böse aus...
Wenn du sowas unbedingt brauchst mach dir eine (private) Hilfsmethode "mapIdToIndex" oder so, und hör am besten auf mit Magic Numbers zu hantieren.Noch was: wenn du FaderDialog::Text in TextUpdate oder gar OnTextUpdate umbenennst sieht es beinahe wie ein sinnvoller Bezeichner; und wozu testest du auf wxEVT_COMMAND_TEXT_UPDATED?
-
Hallo,
finix, danke Für Deine Antwort. soben ist in det Tat ein Array mit 48 Strings. Die Indexberechnungen sind korrekt.
Sache ist die: in meinem Dialog habe ich 48 wxSlider und ebensoviele wxTextCtrl. Wenn ich nun einen der Slider bewege, soll sich der Text im zugehörigen wxTextCtrl ändern (das funktionier problemlos), gebe ich eine Zahl in ein TextCtrl ein, soll sich der Slider auf die Position bewegen. Dafür die Arrays, damit ich einfach zuordnen kann, welcher zu welchem gehört.
Wegen der ::Text oder ::OnTextUpdate
Ich muss gestehen, ich habe den ganzen gestrigen abend gebastelt. Wollte es erst mal zum Laufen kriegen, und dann "schön" machen. Nein, das ist keine billige Ausrede. Und dabei sind so Konstrukte wie auch das checke gegen wxEVT_COMMAND_TEXT_UPDATED übriggeblieben. Das habe ich ausprobiert, kurz bevor ich hier gepostet habe.Eventuell fällt auf, das ich ein "wxString s;" in der Routine habe, s aber nicht benutze. Das ist davon übriggeblieben:
s=valueO[i]->GetValue(); //<-hier s.ToLong(&val,10);
Mit dem selben Ergebnis: GetValue() lässt das Programm crashen.
Und immer noch kein Schritt weiter..
Gruß,
Sebastian
-
in value0 hast du einen Indexüberlauf,
deshalb der crash da, das ist zumindest mein Tipp...
Du kannst dir übrigens auch
das Objekt geben lassen, welches den Event auslöste:
wxEvent::GetEventOject(), musst du dann entsprechend casten.
Evtl. kannst du auch irgendwie die ID so einstellen, das
du an der ID des TextCtrls die ID des Sliders berechnen kannst.
enum{text1=0,text2,...,text48};
enum{slider1=50,slider2...};
Dann ist die ID des sliders immer TextCtrlID + 50.
Kann aber sein, das wxWidgets das dann nicht so lustig findet.phlox
-
Hallo zusammen,
das Problem ist gelöst. Vielen Dank. Falls es interessiert, hier ist der code, der funktioniert:
EVT_COMMAND_RANGE(1150, 1173, wxEVT_COMMAND_TEXT_UPDATED, FaderDialog::OnTextChange)
...
void FaderDialog::OnTextChange(wxCommandEvent& event) { wxTextCtrl* thistextctrl=(wxTextCtrl*) event.GetEventObject(); wxString s; long val; int i=event.GetId(); if ((i>=1150)&&(i<1200)) { i=i-1150; s=thistextctrl->GetValue(); s.ToLong(&val,10); if (val!=oben[i]) //bewahrt mich vor Rekursion { oben[i]=(int)val; faderO[i]->SetValue(100-oben[i]); } } }
Nochmals Danke,
Sebastian