[wxWidgets] SetLabel()
-
Hallo zusammen!
Ich habe mal wieder ne Anfängerfrage
Es geht um ein kleines Dialogfenster welches nur statische Textfelder enthält. In diesen Textfeldern sollen Zahlwerte angezeigt werden.
Hier mal ein kleines Beispiel//erzeuge statisches Textfeld void programmDlg::CreateGUIControls() { ... WxStaticText1 = new wxStaticText(this, ID_WXSTATICTEXT1, wxT("Zahl: "), wxPoint(2, 3), wxDefaultSize, 0, wxT("WxStaticText1")); ... } ... //Z.B. im KeyDown-Event: void programmDlg::programmDlgKeyDown(wxKeyEvent& event) { ... double Zahl = 5.13; //wandele Zahl in String um wxString strZahl = wxString::Format("%.2f",Zahl); //Ausgabe des Strings in das Textfeld WxStaticText1->SetLabel(strZahl); ... }
So funktioniert das auch sehr gut, das "Problem" ist dass im Programm sehr viele Zahlen in sehr vielen Textfeldern angezeigt werden sollen und wann immer die Zahlen verändert wurden sollen alle Textfelder mit SetLabel() "aktualisiert" werden.
Da der Code dann sehr unübersichtlich wird habe ich mir überlegt z.B eine Funktion AlleAktualisieren() zu benutzen. Das könnte dann etwa so aussehen://erzeuge statische Textfelder void programmDlg::CreateGUIControls() { ... WxStaticText1 = new wxStaticText(this, ID_WXSTATICTEXT1, wxT("A: "), wxPoint(2, 3), wxDefaultSize, 0, wxT("WxStaticText1")); WxStaticText2 = new wxStaticText(this, ID_WXSTATICTEXT2, wxT("B: "), wxPoint(20, 30), wxDefaultSize, 0, wxT("WxStaticText2")); ... } //eigene Funktion void AlleAktualisieren(double A, double B, ... ) { ... wxString strA = wxString::Format("%.2f",A); wxString strB = wxString::Format("%.1f",B); ... WxStaticText1->SetLabel(strA); WxStaticText2->SetLabel(strB); ... } void programmDlg::programmDlgKeyDown(wxKeyEvent& event) { ... double a; double b; ... AlleAktualisieren(a, b, ... ); }
Compiler-Meldung:
"WxStaticText1 was not declared in this scope"Ich verstehe warum der Compiler das so nicht akzeptiert: In der Funktion "AlleAktualisieren" sind die Textfelder nicht bekannt da sie der Funktion nicht übergeben werden, klar.
Meine Frage ist nun: Ist es möglich z.B. aus einer Funktion heraus auf die Textfelder zuzugreifen? Und wenn ja, wie?LG Alberich
-
AlleAktualisieren ist nicht Mitglied der Klasse. Zumindest nach der Definition nicht. Füge es einfach der Klasse hinzu.
Funktioniert natürlich nur wenn die Variablen Klassenmember sind.
Oder du suchst die Elemente mit wxWindow::FindWindow() über deren ID.
-
Danke für die Antwort, ich habe es nun aber etwas anders gelöst. Ich verwende eine global bekannte Struktur welche als Datentypen die Zeiger auf die Textfelder aufnimmt. Im GUI-creation-Teil [void programmDlg::CreateGUIControls()] wird die Struktur mit den Zeigern auf die gewünschten Textfelder belegt und kann jetzt der Funktion AlleAktualisieren() als Parameter übergeben werden. Etwa so:
.. //Deklariere Struktur TEXTFELDER global struct TEXTFELDER { wxStaticText* textfeld1; wxStaticText* textfeld2; wxStaticText* textfeld3; ... }; //Deklariere "ALLE" vom Typ TEXTFELDER global TEXTFELDER ALLE;
void programmDlg::CreateGUIControls() { //Textfelder werden erzeugt WxStaticText1 = new wxStaticText(this, ID_WXSTATICTEXT1, wxT("[s]"), wxPoint(176, 99), wxDefaultSize, 0, wxT("WxStaticText1")); WxStaticText1->SetFont(wxFont(7, wxSWISS, wxNORMAL, wxNORMAL, false)); WxStaticText2 = new wxStaticText(this, ID_WXSTATICTEXT2, wxT("[s]"), wxPoint(126, 39), wxDefaultSize, 0, wxT("WxStaticText2")); WxStaticText2->SetFont(wxFont(7, wxSWISS, wxNORMAL, wxNORMAL, false)); WxStaticText3 = new wxStaticText(this, ID_WXSTATICTEXT3, wxT("[s]"), wxPoint(56, 79), wxDefaultSize, 0, wxT("WxStaticText3")); WxStaticText3->SetFont(wxFont(7, wxSWISS, wxNORMAL, wxNORMAL, false)); ... //Belege Struktur "ALLE" mit den Zeigern ALLE.textfeld1=WxStaticText1; ALLE.textfeld2=WxStaticText2; ALLE.textfeld3=WxStaticText3; ...
//eigene Funktion void AlleAktualisieren(TEXTFELDER ALLE, double a, double b, double c ...) { ... wxString strA = wxString::Format("%.2f",a); ALLE.textfeld11->SetLabel(strA); wxString strB = wxString::Format("%.2f",b); ALLE.textfeld12->SetLabel(strB); wxString strC = wxString::Format("%.2f",c); ALLE.textfeld13->SetLabel(strC); ... }
Ist gewiss nicht besonders elegant, war aber eine gute Übung den Umgang mit Zeigern und Strukturen zu vertiefen.