Speicherfunktion für Edit-Inhalte / Listbox



  • Tjo aja... wenn der Text sichtbar sein soll... nimm das b von wb weg 😉

    Joa...

    bool SafeEdit(LPCSTR lpszFile)
    {
        CEdit* pEdit1 = GetDlgItem(10);
        CEdit* pEdit2 = GetDlgItem(11);
        CEdit* pEdit3 = GetDlgItem(12);
        FILE* pFile = NULL;
        pFile = fopen(lpszFile, "wb");
    
        if(!pFile)
            return false;
    
        CString strText;
        pEdit1->GetWindowText(strText);
        fwrite(strText, 1, strText.GetLength()+1, pFile);
        pEdit2->GetWindowText(strText);
        fwrite(strText, 1, strText.GetLength()+1, pFile);
        pEdit3->GetWindowText(strText);
        fwrite(strText, 1, strText.GetLength()+1, pFile);
        fclose(pFile);
    
        return true;
    }
    

    Musst halt einfach mit fwrite immer schön reinschreiben was de so willst... und am ende erst die Datei mit fclose schließen...

    Aja.. bei ner ListBox einfach ItemCount holen.. dann ne schleife und immer den text rausholen...



  • Wie soll das mit der ListBox funktionieren?
    ItemCount ist doch keine Funktion der ListBox, oder?
    Also bei mir geht das nicht.
    Ich versuche auch schon die ganze Zeit einen Wert aus der ListBox zu holen, aber ich bekomme es nicht so richtig hin.

    Hat da jemand ein Beispiel, um einen Wert aus der Listbox zu holen?



  • Das heißt da GetCount. 🙂
    Und an den Text kommst du mit GetText.



  • bool SafeEdit(LPCSTR lpszFile)
    {
        CEdit* pEdit1 = GetDlgItem(10);
        CEdit* pEdit2 = GetDlgItem(11);
        CEdit* pEdit3 = GetDlgItem(12);
        CListBox* pList = GetDlgItem(13);
        FILE* pFile = NULL;
        pFile = fopen(lpszFile, "wb");
    
        if(!pFile)
            return false;
    
        CString strText;
        pEdit1->GetWindowText(strText);
        fwrite(strText, 1, strText.GetLength()+1, pFile);
        pEdit2->GetWindowText(strText);
        fwrite(strText, 1, strText.GetLength()+1, pFile);
        pEdit3->GetWindowText(strText);
        fwrite(strText, 1, strText.GetLength()+1, pFile);
    
        for(unsigned int n = 0; n < pList->GetCount(); ++n)
        {
            pList->GetText(n, strText);
            fwrite(strText, 1, strText.GetLenght()+1, pFile);
        }
    
        fclose(pFile);
    
        return true;
    }
    

    Referenz:
    CListBox::GetCount
    CListBox::GetText



  • bei mir kommt dann "lokale Definition von Funktionen nicht zulässig"



  • bei welcher Zeile?



  • bezieht sich auf "Saveedit"



  • Also: zunächst will ich einfach den Inhalt meiner Listbox Namens "CListBox1" in die Datei "Beispiel.txt" durch klicken auf einen Button speichern.
    Durch Klicken auf einen anderen Button soll dann diese Datei wieder geladen werden. Könnte da mal jemand nen fertigen Quelltext posten?

    Zusatzfrage: kann man das auch so realisieren, dass beim Speichern/Laden ein Explorerfenster geöffnet wird, wo ich den Speicherort bzw. Name auswählen kann?



  • bool SafeListbox(LPCSTR lpszFile)
    {
        FILE* pFile = NULL;
        pFile = fopen(lpszFile, "wb");
    
        if(!pFile)
            return false;
    
    	fwrite(CListBox1.GetCount(), 4, 1, pFile);
    
        CString strText;
    	for(UINT n = 0; n < (UINT)CListBox1.GetCount(); ++n)
        {
    		CListBox1.GetText(n, strText);
    		strText += "\n";
            fwrite(strText, 1, strText.GetLenght()+1, pFile);
        }
    
        fclose(pFile);
    
        return true;
    } 
    
    bool LoadListbox(LPCSTR lpszFile)
    {
    	FILE* pFile = NULL;
    	pFile = fopen(lpszFile, "rb");
    
    	if(!pFile)
    		return false;
    
    	UINT nItemCount = 0;
    	fread(nItemCount, 4, 1, pFile);
    
    	char cItemText[256];
    	for(UINT n = 0; n < (nItemCount; ++n)
    	{
    		fread(cItemText, 1, 256, pFile);
    		CListBox1.AddString(cItemText);
    	}
    	fclose(pFile);
    
    	return true;
    }
    

    Referenzen:
    CFileDialog



  • Dann kommt:
    error C2228: Links von ".GetCount" muss sich eine Klasse/Struktur/Union befinden.

    usw.

    Muss da nicht noch irgendwas mit GetDlgItem gemacht werden? Der Name allein hilft ja nicht, oder?



  • Meine Göte... du hast mir gesagt das dein Ctrl CListBox1 heißt. D.h. bin ich davon mal so ganz nice ausgegangen, das das bei dir die Memebervariabel vom Type CListBox ist!

    Denk erstmal nach bevor du noch einmal hier was schreibst! An sonnsten gibt es kein einziges char an code mehr -.-



  • Sorry...bin halt Anfänger.

    Also hab jetzt die Member eingesetzt....übrig bleibt eine Meldung:

    error C2039: 'GetLenght': Ist kein Element von 'ATL::CStringT<BaseType,StringTraits>'



  • Das is jetzt nich dein Ernst, oder? 🙄
    Also bei so viel Dummheit verweigere ich einen Post zur Lösung.

    Gruß Brainiac



  • Ich finde es immer wieder witzig, wenn irgendwelche Leute die sich besser mit etwas auskennen als andere, sich über die anderen á la "das ist doch nicht dein Ernst....oh Gott bist du dumm" lustig machen, anstatt zu erklären wo deren (scheinbar fundamentaler) Fehler liegt.

    Dieses Forum ist doch dazu da um bei Problemen Hilfe zu bekommen...und nicht ne Portion Entmutigung ("jaja...du bist zu blöd um jemals C++ zu können").

    Trotzdem danke für die Vorschläge



  • Es geht nicht darum ob du zu blöd bist um c++ zu lernen oder nicht. Deine Fehler sind auch keine fundamentalen Fehler des Programmierens. Es geht überhaupt nicht ums Programmieren! 😡

    Dein fundamentaler Fehler ist einfach dass du kein bisschen über die gemachten Vorschläge nachdenkst, sondern alles nur sinnlos per copy+paste übernimmst und null Eigeninitiative zeigst. 👎

    Es geht darum, dass von dir erwartet wird, dass du den Code der hier als Vorschlag gepostet wurde wenigstens einmal durchliest (und nicht nur "überfliegst") und genauso auch deine Fehlermeldungen einmal GENAU liest (und nicht gleich per copy+paste ins Forum klatschst).
    Wenn du dann auch noch wenigstens kurz über das Gelesene nachdenkst, dann wäre dir z.B. aufgefallen, dass in deinem Code (und deiner Fehlermeldung) GetLenght statt GetLength steht. Ich unterstelle dir jetzt einfach mal, dass du eigentlich schon weißt wie das richtig geschrieben wird, du aber gar nicht erst versucht hast, den Fehler zu finden bzw. den Code mal anzuschauen.

    Versteh das jetzt nicht falsch, auch ich werde dir in Zukunft gerne bei Problemen helfen, aber eben nur unter der Bedingung das du dir das oben Genannte zu Herzen nimmst. 😉

    Gruß Brainac



  • Danke...es tauchen halt für nen Anfänger wie mich ständig scheinbar unlösbare Probleme auf, die sich dann im Nachhinein als einfach erweisen.

    Ich hab jetzt mal versucht das zum Laufen zu bringen, bekomme aber die Fehlermeldung dass die Funktion keine zwei Argumente aktzeptiert. Da hab ich länger drüber nachgedacht und wirklich keine Ahnung (und jetzt ist's bestimmt wieder was total triviales)

    void CRechnerDlg::OnBnClickedButton2()
    {
    	SafeListbox("C:\test", m_CtlList);
    }
    
    bool SafeListbox(LPCSTR lpszFile, CListBox Liste)
    {
        FILE* pFile = NULL;
        pFile = fopen(lpszFile, "wb");
    
        if(!pFile)
            return false;
    
        fwrite(_T("m_CtlList.GetCount()"), 4, 1, pFile);
    
        CString strText;
        for(UINT n = 0; n < (UINT)Liste.GetCount(); ++n)
        {
            Liste.GetText(n, strText);
            strText += "\n";
            fwrite(strText, 1, strText.GetLength()+1, pFile);
        }
    
        fclose(pFile);
    
        return true;
    }
    


  • 1. Grundlagen von C++
    2. => Woher soll der die Funktion kennen wenn die danach erst kommt?
    3. Pointer... CListBox* pList.... und &m_ctrlList...



  • Da du mit der Ladefunktion etwas komplizierter ist wenn de die änderungen nicht so machst wie ich jetzt... naja... ich mach auch mal die anderen fehler raus... aber das ist das letzte mal -.-

    // ...
    class CRechnerDlg : public // ...
    {
        // ...
    protected:
        bool SafeListbox(LPCSTR lpszFile, CListBox* pList);
        // ...
    };
    // ...
    
    void CRechnerDlg::OnBnClickedButton2(void)
    {
        SafeListbox("C:\test", &m_CtlList);
    }
    
    bool CRechnerDlg::SafeListbox(LPCSTR lpszFile, CListBox* pList)
    {
        FILE* pFile = NULL;
        pFile = fopen(lpszFile, "wb");
    
        if(!pFile)
            return false;
    
        fwrite(pList->GetCount(), 4, 1, pFile); // was bringt dir das wenn du "m_CtlList.GetCount()" in die Datei schreibst? Da soll die Anzahl rein -.-
    
        char cText[256];
        for(UINT n = 0; n < (UINT)pList->GetCount(); ++n)
        {
            pList->GetText(n, cText, 256);
            strText += "\n";
            fwrite(cText, 1, 256, pFile);
        }
    
        fclose(pFile);
    
        return true;
    }
    


  • Das mit dem "m_CtlList.GetCount()" ist so ne Sache:
    er motzt dass er es nicht konvertieren von 'int' in 'const void' konvertieren kann. Da hab ich halt experimentiert um den Fehler weg zu bekommen (immer noch nicht gelöst), aber irgendwie hab ich das Gefühl das die Sache noch zu hoch für mich ist.

    Hab ich vorher schon gefragt, aber ging vielleicht unter:
    Gibts da ne Möglichkeit das über ein extra Fenster mit Exploreransicht zu speichern?



  • @underpro:

    Das Problem an der ganze Sache ist, dass du hier gleich grafische Windows-Programme mit MFC schreiben willst, ohne die Grundlagen von C++ zu können. Das ist wie wenn du in der Formel 1 mitfahren willst, ohne zu wissen wozu Kupplung, Gas und Bremse gut sind. Da würde dich auch jeder fragen "Was willst du hier?".

    Also ein gut gemeinter Rat:
    Lern erst mal C++ und schreib Konsolenprogramme, und wenn du das beherrscht, kannst du dich an die MFC machen. Ein gutes C++Tutorial findest du z.B. hier: www.cpp-tutor.de

    Dort gibts auch ein sehr gutes MFC-Tutorial, welches aber die Kenntnisse des C++Tutorials voraussetzt. Also mach erst mal das C++ Tutorial durch, schreib ein paar "reine" C++ Programme, und arbeite dannach das MFC-Tutorial durch. Dann klappt die Sache auch und ist nicht so frustrierend. 😉

    Gruß Brainiac


Anmelden zum Antworten