This-Zeiger im Event nicht mehr gueltig



  • Hi,

    ich hab folgendes Problem.
    Ein einer von mir erstellten graphischen Oberflaeche kann es manchmal vorkommen dass z.B. in einem EVT_Button der This-zeiger nicht mehr gueltig ist.
    Um ihn wieder verwenden zu koennen muss ich erst einen dynamic_cast aufrufen.

    Aber warum ist das so?

    Hier der Cast:

    void MyControlValues::setFarbe(wxCommandEvent& event)
    {
    wxTextCtrl* text = dynamic_cast<wxTextCtrl*>(event.GetEventObject());
    MyModel* model = (dynamic_cast<MyControl*>(text->GetParent()))->model;

    ...

    }

    Normalerweise sollte ich mit dem This-Zeiger ein MyControl Objekt ansprechen können.

    Danke
    mfg



  • Du verwendest da nirgendo this!
    Die Meldung kommt, weil event.GetEventObject() kein xTextCtrl* zurückliefert, und du das brauchst um darauf spezielle wxTextCtrl-Methoden aufrufen zu können.
    Dieser cast ist vollkommen normal!
    Das mit dem "this" ist nur eine Compilermeldung, weil du eben nicht event.GetEventObject()->GetParent()->model() machen kannst.



  • Richtig, soviel Code habe ich nicht gepostet.

    Eigentlich verwende ich in diesem Event eine Funktion setR();

    Noch etwas zur Strucktur.
    Die klasse MyControlValues leitet von MyControl ab. MyControl kennt die Klasse MyModel, und somit auch das Objekt MyModel* model.

    Die Funktion die ich aufrufe ist in MyModel definiert.
    model->setR();

    Normalerweise kann ich in der Klasse MyControlValues mit this->setR() auf die Funktion zugreifen.

    Komischerweise ist der This-Zeiger sobald das Event auslöst nicht mehr gültig.
    Nur deshalb verwende ich zweimal den Upcast dynamic_cast.

    Mit der Kompilermeldung hast du allerdings recht.
    Aber es funktiert 😉



  • -M- schrieb:

    Richtig, soviel Code habe ich nicht gepostet.

    Könntest du den ganzen involvierten Code, der nicht funktioniert (!), dann bitte posten?
    Aus deiner Beschreibung allein wird man nicht schlau.



  • Das ist jetzt eine Event bei dems nicht funktioniert.

    void MyControlValues::setFarbe(wxCommandEvent& event)
    {
    wxTextCtrl* text = dynamic_cast<wxTextCtrl*>(event.GetEventObject());
    MyModel* model = (dynamic_cast<MyControl*>(text->GetParent()))->model;
    long z;
    int id = event.GetId();
    switch (id){
    case 110:
    text->GetValue().ToLong(&z);
    model->setR(z);
    break;
    case 111:
    text->GetValue().ToLong(&z);
    model->setG(z);
    break;
    case 112:
    text->GetValue().ToLong(&z);
    model->setB(z);
    break;
    }
    model->updateAll(); //Observeraufruf
    }



  • void MyControlValues::setFarbe(wxCommandEvent& event)
    {
    wxTextCtrl* text = dynamic_cast<wxTextCtrl*>(event.GetEventObject());
    MyModel* model = (dynamic_cast<MyControl*>(text->GetParent()))->model;
    long z;
    int id = event.GetId();
    switch (id){
    case 110:
    text->GetValue().ToLong(&z);
    model->setR(z);
    break;
    case 111:
    text->GetValue().ToLong(&z);
    model->setG(z);
    break;
    case 112:
    text->GetValue().ToLong(&z);
    model->setB(z);
    break;
    }
    model->updateAll(); //Observeraufruf
    }
    

    Benutz bitte [ cpp ] Tags.. danke.



  • Und jetzt bitte noch die genaue Fehlermeldung incl. Kommentar, in welcher Zeile (diese im geposteten Code markieren) der Fehler auftritt.
    Informationen über die dort getätigten Methodenaufrufe wären auch nicht schlecht.

    Denn in dem Code kann ich zu mindest keinen Fehler erkennen...



  • void MyControlValues::setFarbe(wxCommandEvent& event)
    {
     long z;	
     int id = event.GetId();
     switch (id){
     case 110:
      this->textFeldR->GetValue().ToLong(&z);
      this->model->setR(z);
      break;
     }
     model->updateAll();
    }
    
    BEGIN_EVENT_TABLE(MyControlValues,wxPanel)
    	EVT_TEXT_ENTER(110,MyControlValues::setFarbe)   //Zeile 116
    	EVT_TEXT_ENTER(111,MyControlValues::setFarbe)
    	EVT_TEXT_ENTER(112,MyControlValues::setFarbe)
    	EVT_SPINCTRL(113,MyControlValues::spinFarbe)
    	EVT_SPINCTRL(114,MyControlValues::spinFarbe)
    	EVT_SPINCTRL(115,MyControlValues::spinFarbe)
    END_EVENT_TABLE()
    

    So wollte ich es schreiben.

    Kompilermeldung:
    ...\mycontrolvalues.cpp(116) :warning C4407: Umwandeln von verschiedenen Zeigern in Memberrepräsentationen. Der Compiler generiert möglicherweise den falschen Code.

    Fehlermeldung beim Ausführen ist eine Nullpointerexception, weil eben der
    this->Zeiger nicht mehr definiert ist.


Log in to reply