[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. 🙂


Anmelden zum Antworten