wxWidgets Label "von wo anders" ändern



  • Hallo,

    Ich habe mir mit DialogBlox einen kleinen Dialog zum testen und lernen gebaut:

    // For compilers that support precompilation, includes "wx/wx.h".
    #include "wx/wxprec.h"
    
    #ifdef __BORLANDC__
    #pragma hdrstop
    #endif
    
    #ifndef WX_PRECOMP
    #include "wx/wx.h"
    #endif
    
    ////@begin includes
    ////@end includes
    
    #include "test.h"
    
    ////@begin XPM images
    ////@end XPM images
    
    /*!
     * test type definition
     */
    
    IMPLEMENT_DYNAMIC_CLASS( test, wxDialog )
    
    /*!
     * test event table definition
     */
    
    BEGIN_EVENT_TABLE( test, wxDialog )
    
    ////@begin test event table entries
    ////@end test event table entries
    
    END_EVENT_TABLE()
    
    /*!
     * test constructors
     */
    
    test::test()
    {
        Init();
    }
    
    test::test( wxWindow* parent, wxWindowID id, const wxString& caption, const wxPoint& pos, const wxSize& size, long style )
    {
        Init();
        Create(parent, id, caption, pos, size, style);
    }
    
    /*!
     * test creator
     */
    
    bool test::Create( wxWindow* parent, wxWindowID id, const wxString& caption, const wxPoint& pos, const wxSize& size, long style )
    {
    ////@begin test creation
        SetExtraStyle(wxWS_EX_BLOCK_EVENTS);
        wxDialog::Create( parent, id, caption, pos, size, style );
    
        CreateControls();
        if (GetSizer())
        {
            GetSizer()->SetSizeHints(this);
        }
        Centre();
    ////@end test creation
        return true;
    }
    
    /*!
     * test destructor
     */
    
    test::~test()
    {
    ////@begin test destruction
    ////@end test destruction
    }
    
    /*!
     * Member initialisation
     */
    
    void test::Init()
    {
    ////@begin test member initialisation
    ////@end test member initialisation
    }
    
    /*!
     * Control creation for test
     */
    
    void test::CreateControls()
    {    
    ////@begin test content construction
        test* itemDialog1 = this;
    
        wxBoxSizer* itemBoxSizer2 = new wxBoxSizer(wxVERTICAL);
        itemDialog1->SetSizer(itemBoxSizer2);
    
        itemBoxSizer2->Add(90, 5, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
    
        wxBoxSizer* itemBoxSizer4 = new wxBoxSizer(wxHORIZONTAL);
        itemBoxSizer2->Add(itemBoxSizer4, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
    
        wxStaticText* itemStaticText5 = new wxStaticText( itemDialog1, wxID_STATIC, _("Status:"), wxDefaultPosition, wxDefaultSize, 0 );
        itemBoxSizer4->Add(itemStaticText5, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
    
        itemBoxSizer4->Add(5, 5, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
    
        wxStaticText* itemStaticText7 = new wxStaticText( itemDialog1, wxID_STATIC, wxGetTranslation(wxString(wxT("l")) + (wxChar) 0x00E4 + wxT("Warte...")), wxDefaultPosition, wxDefaultSize, 0 );
        itemBoxSizer4->Add(itemStaticText7, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
    
    ////@end test content construction
    }
    
    /*!
     * Should we show tooltips?
     */
    
    bool test::ShowToolTips()
    {
    
        return true;
    }
    
    /*!
     * Get bitmap resources
     */
    
    wxBitmap test::GetBitmapResource( const wxString& name )
    {
        // Bitmap retrieval
    ////@begin test bitmap retrieval
        wxUnusedVar(name);
        return wxNullBitmap;
    ////@end test bitmap retrieval
    }
    
    /*!
     * Get icon resources
     */
    
    wxIcon test::GetIconResource( const wxString& name )
    {
        // Icon retrieval
    ////@begin test icon retrieval
        wxUnusedVar(name);
        return wxNullIcon;
    ////@end test icon retrieval
    }
    
    /*!
     * wxEVT_LEFT_DOWN event handler for ID_BUTTON1
     */
    

    So weit so gut. Nun kommt vermutlich eine typische NewBe-Frage aber meine Suche war leider erfolglos.

    Ich möchte das Label von itemStaticText7 von anderen Programmteilen aus verändern.

    Der Dialog soll also so sichtbar sein und das Programm zum Beispiel eine Datei einlesen, sortieren, analysieren. Während das Programm nun abreitet soll die jeweilige Tätigkeit als Status ausgegeben werden, damit der Benutzer weiß was gerade passiert.

    itemStaticText7->SetLabel("Lese Datei"); -> so geht es leider nicht.

    Ich komme nur irgenwie nicht an das Label dran.

    Danke......

    Gruß,
    Marcus



  • Klar, das ist ja eine lokale Variable. Am Ende der Funktion verschwindet die wieder.

    Du musst in DialogBlocks dem Item einen Variablen-Namen geben. Dann wird es ein Member deiner Klasse und du kannst von anderen Stellen darauf zugreifen.



  • Hallo frenki,

    Danke für den Tipp (Hätte mir eigentlich auffallen sollen, dass es eine lokale Variable und die logischerweise danach nicht mehr sichtbar ist). Ich habe das auch gleich mal getestet.
    Und in DialgBlox und die Member Variable Name gesetzt.

    Das sieht dann in etwa so aus:

    void vv::CreateControls()
    {    
    ////@begin vv content construction
        vv* itemDialog1 = this;
    
        wxBoxSizer* itemBoxSizer2 = new wxBoxSizer(wxVERTICAL);
        itemDialog1->SetSizer(itemBoxSizer2);
    
        wxBoxSizer* itemBoxSizer3 = new wxBoxSizer(wxVERTICAL);
        itemBoxSizer2->Add(itemBoxSizer3, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
    
        itemBoxSizer3->Add(150, 5, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
    
        wxBoxSizer* itemBoxSizer5 = new wxBoxSizer(wxVERTICAL);
        itemBoxSizer3->Add(itemBoxSizer5, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
    
        wxButton* itemButton6 = new wxButton( itemDialog1, ID_BUTTON, _("Button"), wxDefaultPosition, wxDefaultSize, 0 );
        itemBoxSizer5->Add(itemButton6, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
    
        textx = new wxStaticText( itemDialog1, wxID_STATIC, _("Static text"), wxDefaultPosition, wxDefaultSize, 0 );
        itemBoxSizer5->Add(textx, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
    
    ////@end vv content construction
    }
    

    Habe als Namen textx benutzt.
    Mir gelingt es aber trotzdem nicht auf textx zuzugreifen.

    Innerhalb kann ich ohne Probleme textx->SetLabel("Test") setzen.
    Aber außerhalb.

    Danke......

    Gruß,
    Marcus



  • Was meinst du mit "außerhalb"?
    Außerhalb der Funktion (also von einer anderen Klassenfunktion aus) oder außerhalb der Klasse (z.B. aus ner anderen Klasse)?


  • Mod

    Was meinst du mit ausserhalb?
    Natürlich kannst du auf die Variable nur innerhalb der Klasse zugreifen.
    Wenn du sie von aussen manipulieren willst, musst du eine SetLabel(const wxString& str)-artige Methode implementieren, die dann SetLabel mit der Variablen aufruft.

    phlox



  • ...

    Ich würde das gerne von einer anderen Klasse aus machen.

    Also z.B. eine Klasse für das Importieren und Sortieren ... von Dateien.
    Und von dieser Klasse aus das Label entsprechend des gerade laufenden Arbeitsschrittes setzen -> Status: Laden -> Status: Sortiere ...

    Das mit der Methode hatte ich mir schon so gedacht. Wie mache ich das am Besten beim Einsatz von DialogBlocks. Kann ich so eine Methode evtl. auch von DB erzeugen lassen.

    Danke......

    Gruß,
    Marcus


Anmelden zum Antworten