wxTextCtrl* Typecasting



  • Hi ich versuche verzweifelt seit Tagen eine wxTextCtrl auszulesen und den Inhalt in der Datei "characters.enc" abzuspeichern. Meine Methode appendToIndex funktioniert. Wenn ich aber in der Methode getInformation die Textbox auslese bekomme ich eine const char* zurück. Ich brauche aber char* um den Inhalt in characters.enc abzuspeichern. Also habe ich versucht den ausgelesenen Inhalt zu char* zu casten, ohne Erfolg. Ich habe schon dutzedende Möglichkeiten ausprobiert... nicht nur diese eine.

    Hat jmd. sonst noch Ideen, wie ich den Inhalt meiner wxTextCtrl* abgespeichert bekomme?

    void WihiFrame::saveCharacter(wxCommandEvent& event)
    {
        wxTextCtrl* allTxtCtrls[] = {txtLast_Name, txtFirst_Name, txtNick_Name, txtPen_Name};
    
        //for (int i = 0; i<sizeof(allTxtCtrls); i++)
        //{
            myWxCustomFct.appendToIndex("001", "characters.enc", getInformation(txtLast_Name));
        //}
    }
    
    char* WihiFrame::getInformation(wxTextCtrl* txtCtrlIsReaded)
    {
        wxString information = txtCtrlIsReaded->GetValue();
        return constCharToChar(information.mb_str(wxConvUTF8));
    }
    
    char* WihiFrame::constCharToChar(const char* str)
    {
        char* noConst = new char[sizeof(str)+1];
        strcpy(noConst, str);
        return noConst;
    }
    


  • Hier mal einpaar Fehler und Hinweise:

    • new char[sizeof(str)+1]; reserviert in Wahrheit nur die Groesse eines (einfachen) char-Zeigers + 1 und NICHT die Groesse des ganzen String-Arrays. Dadurch entsteht wohl ein Bufferoverflow.

    - Wieso benutzt du C-String? Auch wenn du irgendeine Bibliothek verwendest, die C-Strings benutzt, solltest du C-Strings in deinem Programm selbst vermeiden und nur fuer die Bibliothek konvertieren. Wenn nicht, gibt es wirklich keinen Grund C-Strings zu benutzen, benutze wxString!

    • const kannst du in C++ einfach wegcasten mit const_cast . Aber das wuerde ich dir auf keinen Fall empfehlen

    - Du speicherst den Inhalt des wxTextCtrl in eine lokale Variable information . Das ist jetzt zwar noch kein Fehler im obigen Beispiel, aber achte darauf, dass du den C-String nicht ausserhalb des Gueltigkeitsbereich von information verwendest.

    - Wenn es dir einfach nur darum geht den Inhalt eines wxTextCtrl in eine Datei abzuspeichern, dann geht das ganz einfach mit wxTextCtrl::SaveFile und umgekehrt auch mit wxTextCtrl::LoadFile



  • Hey danke,
    Ich muss leider wirklich in dem Fall C-Strings verwenden. Ich habe das ganze nun so umgeschrieben. Mir geht es nicht drum das nur in einer Datei abzuspeichern. Also kann ich SaveFile nicht verwenden.

    void WihiFrame::saveCharacter(wxCommandEvent& event)
    {
        wxTextCtrl* allTxtCtrls[] = {txtLast_Name, txtFirst_Name, txtNick_Name, txtPen_Name};
    
        //for (int i = 0; i<sizeof(allTxtCtrls); i++)
        //{
            myWxCustomFct.appendToIndex("001", "characters.enc", getInformation(txtLast_Name));
        //}
    }
    
    char* WihiFrame::getInformation(wxTextCtrl* txtCtrlIsReaded)
    {
        wxString information = txtCtrlIsReaded->GetValue();
        const char* wxStrToStr = information.mb_str();
        return const_cast<char *> (wxStrToStr);
    }
    

    Leider stürzt das Programm aber ab.



  • Xbody schrieb:

    void WihiFrame::saveCharacter(wxCommandEvent& event)
    {
        wxTextCtrl* allTxtCtrls[] = {txtLast_Name, txtFirst_Name, txtNick_Name, txtPen_Name};
    
        //for (int i = 0; i<sizeof(allTxtCtrls); i++)
        //{
            myWxCustomFct.appendToIndex("001", "characters.enc", getInformation(txtLast_Name));
        //}
    }
    
    char* WihiFrame::getInformation(wxTextCtrl* txtCtrlIsReaded)
    {
        wxString information = txtCtrlIsReaded->GetValue();
        const char* wxStrToStr = information.mb_str();
        return const_cast<char *> (wxStrToStr);
    }
    

    Leider stürzt das Programm aber ab.

    Protoman schrieb:

    - Du speicherst den Inhalt des wxTextCtrl in eine lokale Variable information . Das ist jetzt zwar noch kein Fehler im obigen Beispiel, aber achte darauf, dass du den C-String nicht ausserhalb des Gueltigkeitsbereich von information verwendest.



  • Danke sehr!
    Ich habe zwar keine Ahnung warum ich hierbei die Variable global deklariieren muss, aber es klappt. Lese ich mir vielleicht mal im Internet etwas über Gültigkeitsbereiche durch. Jetzt habe ich nur das Problem das irgend ein Quatsch abgespeichert wird und nicht der Text in der TextCtrl, aber das kriege ich wohl hin.



  • Vielleciht weiß das eienr so...
    Warum wird etwas komisches und nicht der Inhalt der Textbox abgespeichert?

    #include "Main.h"
    
    void WihiFrame::saveCharacter(wxCommandEvent& event)
    {
        wxTextCtrl* allTxtCtrls[] = {txtLast_Name, txtFirst_Name, txtNick_Name, txtPen_Name};
    
        //for (int i = 0; i<sizeof(allTxtCtrls); i++)
        //{
            myWxCustomFct.appendToIndex("001", "characters.enc", getInformation(txtLast_Name));
        //}
    }
    
    char* WihiFrame::getInformation(wxTextCtrl* txtCtrlIsReaded)
    {
        wxString information = txtCtrlIsReaded->GetValue();
        return constCharToChar(information.c_str());
    }
    
    char* WihiFrame::constCharToChar(const char* str)
    {
        char* noConst = new char[strlen(str)+1];
        strcpy(noConst, str);
        return noConst;
    }
    


  • Der Fehler liegt nicht in deinem Code-Ausschnitt, sondern wahrscheinlich irgendwo anders in deinem Programm.

    Versuch doch mal zum Test einfach mal:

    #include "Main.h"
    
    void WihiFrame::saveCharacter(wxCommandEvent& event)
    {
        wxTextCtrl* allTxtCtrls[] = {txtLast_Name, txtFirst_Name, txtNick_Name, txtPen_Name};
    
        //for (int i = 0; i<sizeof(allTxtCtrls); i++)
        //{
            myWxCustomFct.appendToIndex("001", "characters.enc", "TEST");
        //}
    }
    

    und schau was dabei rauskommt...



  • Sorry das klappt! Und danke das du mir noch versuchst zu helfen. 🙂

    void WxCustomFct::appendToIndex(char* index, char* filepath, char* userText)
    {
        char* allText = readFromFile(filepath);
    
        int charsInFile = getNumOfCharsInFile(filepath);
        int posOfIndex = getStrPos(filepath, index);
    
        char newText [charsInFile+1+(strlen(userText))];
    
        int counter = 0;
    
        for (int i = 0; i < posOfIndex; i++)
        {
            newText[i]= allText[i];
        }
    
        for (int j = posOfIndex; j < (posOfIndex+strlen(userText)); j++)
        {
            newText[j]= userText[counter];
            counter++;
        }
    
        newText[posOfIndex+strlen(userText)] = ',';
        int actualPosition = posOfIndex;
    
        for (int k = (posOfIndex+strlen(userText)+1); k < (charsInFile+strlen(userText)+1); k++)
        {
            newText[k]= allText[actualPosition];
            actualPosition++;
        }
    
        writeInFile(filepath, newText, charsInFile+1+(strlen(userText)));
    }
    

    Es muss also irgendetwas an getInformation sein. Wenn ich txtLastName auslese kommt immer dasselbe raus:
    MOFILE wird in die Datei geschrieben.



  • Kein Problem 🙂

    Ich kann mir ehrlich gesagt nicht erklaeren woran das dann liegen koennte, wenn mein obiger Test klappt.
    Ich hab das jetzt sogar extra bei mir getestet und es klappt ... 😕
    getInformation und constCharToChar muss eigentlich richtig sein.

    Hast du mal nachgesehen, was der TextCtrl-String beinhaltet?
    Kannst ja mal versuchen eine MessageBox auszugeben:

    #include "Main.h"
    
    void WihiFrame::saveCharacter(wxCommandEvent& event)
    {
        wxTextCtrl* allTxtCtrls[] = {txtLast_Name, txtFirst_Name, txtNick_Name, txtPen_Name};
    
        //for (int i = 0; i<sizeof(allTxtCtrls); i++)
        //{
            myWxCustomFct.appendToIndex("001", "characters.enc", getInformation(txtLast_Name));
        //}
    }
    
    char* WihiFrame::getInformation(wxTextCtrl* txtCtrlIsReaded)
    {
        wxString information = txtCtrlIsReaded->GetValue();
        wxMessageBox("In WihiFrame::getInformation(): "+information);    // TEST1
        return constCharToChar(information.c_str());
    }
    
    char* WihiFrame::constCharToChar(const char* str)
    {
        char* noConst = new char[strlen(str)+1];
        strcpy(noConst, str);
        wxMessageBox("In WihiFrame::constCharToChar():\n"                // TEST 2
            "str: "+wxString(str)+
            "\nnoConst: "+wxString(noConst));
        return noConst;
    }
    

    Wuerde mich selber auch interessieren, was da ausgegeben wird



  • Ich verstehe es echt nicht. Selbst in der MessageBox wird MOFILE ausgeben,
    aber danke für's testen, weiß ich zu Mindest, dass meine Fkt. klappen.
    Also ich schaue in den nächsten Tagen, ob ich das geregelt kriege, erst vor paar Stunden heim gekommen, gerade keine Zeit.


Anmelden zum Antworten