In List Control und Datei schreiben



  • Hallo MFC-Gemeinde,

    zur Zeit arbeite ich an einem Vokabeltrainer der die Verwaltung von Vokabeln ermöglichen soll. Zur Verwaltung lese ich die Vokabeln aus einer Datei ein und lasse sie in die Listbox schreiben.

    Hier der Code dazu:

    BOOL Cverwalten::OnInitDialog(void)
    {
    	CDialog::OnInitDialog();
    
    	m_listcontrol.InsertColumn(0,"Deutsch",0,105);
    	m_listcontrol.InsertColumn(1,"Englisch",0,105);
    	m_listcontrol.InsertColumn(2,"Franzˆsisch",0,104);
    
    	// Einlesen der Artikel aus Datei
    	CStdioFile file;
    	CString text;
    
    	if(file.Open("vokabeln.txt", CFile::modeRead))
    	{
    		file.ReadString(text);
    
    		for(int i = 0; i < 4;i++)
    		{
    			m_listcontrol.InsertItem(i,"");
    			for(int j= 0; j < 3; j++)
    			{	
    				file.ReadString(text);
    				m_listcontrol.SetItemText(i,j,text);
    			}
    		}		
    	}
    	file.Close();
    	return false;
    }
    

    Meine Datei ist folgendermaßen aufgebaut:
    Anzahl der Vokabeln
    Wort auf Deutsch
    Wort auf Englisch
    Wort auf Französisch

    Jetzt möchte ich mit Hilfe von Eingabefeldern weitere Vokabeln in die List Control und in die Datei (unter die anderen Vokabeln) schreiben.

    Hier mal ein Bild davon, dass ihr euch das in etwa vorstellen könnt:
    http://www.kadu-ucb.de/vokabeln.jpg

    Weiß jemand von euch wie ich das realisieren kann?
    Würde mich sehr über ein Codebeispiel freuen.



  • Am besten erzeugst du dir für jedes deiner Eingabefelder eine Membervariable vom Typ CString( geht ja mit dem Klassenassistenten ganz einfach)
    In meinem Beispiel heißen die:
    CString m_strDeutsch;
    CString m_strEnglisch;
    CString m_strFranz;

    Cverwalten::OnWortHinzufuegen(void)
    {
    int i = m_listcontrol.GetItemCount();
    UpdateData(TRUE); // überschreibt die Membervariablen mit dem aktuellen Wert
    m_listcontrol.InsertItem(i,m_strDeutsch);
    m_listcontrol.SetItemText(i,1,m_strEnglisch);
    m_listcontrol.SetItemText(i,2,m_strFranz);
    }
    

    Musst mal ausprobieren, programmier auch noch net lang in Visual C++. Aber müsste so glaub funktionieren.



  • Hab mal noch schnell was geschrieben, was die Daten eigetnlich speichern müsste^^

    Cverwalten::OnWortHinzufuegen(void) 
    { 
    	int i = m_listcontrol.GetItemCount(); 
    	UpdateData(TRUE); // überschreibt die Membervariablen mit dem aktuellen Wert 
    	m_listcontrol.InsertItem(i,m_strDeutsch); 
    	m_listcontrol.SetItemText(i,1,m_strEnglisch); 
    	m_listcontrol.SetItemText(i,2,m_strFranz );
    
    	CStdioFile file;
    
    if(file.Open("vokabeln.txt",CFile::modeWrite))
    {
    	//FilePointer ans Ende der Datei setzen schau dir mal StdioFile::Seek an
    file.Seek(0,CFile::End);
    file.WriteString(m_strDeutsch + '\n');
    file.WriteString(m_strEnglisch + '\n');
    file.WriteString(m_strFranz + '\n');
    }
    file.Close(); 
    }
    

    Hab aber noch nie mit "CStdioFile" gearbeitet, also alles ohne Gewähr 😉

    webklipp schrieb:

    for(int i = 0; i < 4;i++)
    		{
    			m_listcontrol.InsertItem(i,"");
    			for(int j= 0; j < 3; j++)
    			{	
    				file.ReadString(text);
    				m_listcontrol.SetItemText(i,j,text);
    			}
    		}
    

    Warum fügst du hier nur die ersten 4 Vokabeln ein?

    int anz_variablen=file.ReadString(text);
    for(int i = 0; i < anz_variablen;i++)
    		{
    			m_listcontrol.InsertItem(i,"");
    			for(int j= 0; j < 3; j++)
    			{	
    				file.ReadString(text);
    				m_listcontrol.SetItemText(i,j,text);
    			}
    		}
    

    So sollte es besser sein



  • Vielen Dank für die Antworten, es klappt jetzt alles reibungslos.
    Danke auch für den 2ten Tipp:

    int anz_variablen=file.ReadString(text); 
    for(int i = 0; i < anz_variablen;i++) 
            { 
                m_listcontrol.InsertItem(i,""); 
                for(int j= 0; j < 3; j++) 
                {    
                    file.ReadString(text); 
                    m_listcontrol.SetItemText(i,j,text); 
                } 
            }
    

    Dort habe ich den String noch in einen int-Wert konvertiert, jetzt klappt auch das.

    file.ReadString(text); //erste Zeile (Anzahl) einlesen
    int anzahl = atoi(text);
    for(int i = 0; i < anzahl;i++)
    {
    	m_listcontrol.InsertItem(i,"");
    	for(int j= 0; j < 3; j++)
    	{	
    		file.ReadString(text);
    		m_listcontrol.SetItemText(i,j,text);
    	}
    }
    

    Jetzt versuche ich mal, die Anzahl der Vokabeln um 1 zu erhöhen, wenn ein neues Wortepaar eingefügt wird. Mal sehen wie weit ich komme.

    Viele Grüße



  • warum macht ihr es euch so schwer?
    musste die selbe aufgabe lösen und habs einfach so gemacht:

    while(file.ReadString(text))
    	{
    		vokabelliste.InsertItem(i,text);
    		if (!file.ReadString(text))
    		{break;}
    		vokabelliste.SetItemText(i,1,text);	
    		if (!file.ReadString(text))
    		{break;}
    		vokabelliste.SetItemText(i,2,text);
    	}
    

    guckt doch mal was die methode zurückgibt wenn sie bei EOF is 😉

    ps: arbeite auch noch net sooooo lange mit visual studio. also falls daran irgendwas total dummes dran sein sollte sagts mir^^



  • argh stellt euch einfach statt dem i ne 0 vor -.-


Anmelden zum Antworten