Visual C# Probleme

i123

Mitglied
Hallo,
da ich Anfänger bin und öfter Probleme bei Visual C# (visual studio 2008 ) habe,
möchte ich hier öfters Fragen, wenn ich ein Problem habe. Was ich auch schon genug mache, und ich das hoffe auch hier darf :(

Im Moment hab ich folgendes Problem:

Ich möchte, das in einer listbox ein Teil einer Zeile einer Textdatei ausgelesen wird,
dies funktioniert schonmal... nun möchte ich aber das in einer weiteren Textbox
der Benutzer quasi eine Lösung eingibt... nach Klick auf einen überprüfen button
soll dann geguckt werden ob der zweite teil aus der textdatei zum ersten teil
passt.


meine textdatei sieht im moment so aus:

text1#text2#0

Text 1 soll in der listbox erscheinen und als lösung soll text 2 eigegeben werden.

Wenn der Benutzer das richtige eingibt soll "richtig" ausgegeben werden und die 0 am ende hochgezählt werden,
wenn nich soll die ausgabe "falsch" erscheinen und auf 0 bleiben.

Danke schonmal für eure Hilfe...
 
Hi,

Wenn ich das richtig verstanden habe willst du eine Art Quiz bauen.
Lese doch den Text aus der Textdatei aus und speicherst ihn in einem String.
Dann nehme ich mal an hast du mehrere "Fragen" und "Antworten" in deiner Textdatei.
Also teilst du deinen String in einzelne Zeilen (siehe die Spilt-Funktion des Strings).
Dann teiltst du deine einzelen Zeilen noch mal an der "#" (auch mit Split) und speicherst dir das ganze entsprechend ab (z.Bsp mehrdiemensionales Array).
Dann musst du dir noch das Zurückspeichern überlegen, aber das geht ja mit ein paar for-Schleifen recht einfach.

Wenn du das nicht ganz verstehst frag ruhig nochmal ;)

Gruß
x y z
 
Genau, als Quiz kann man das ganz gut bezeichnen.

Das auslesen funktioniert bei mir so

Code:
            // Textdatei laden und aufteilen
            StreamReader sr = new StreamReader
            ("vokabeln.txt", Encoding.Default);
            while (!sr.EndOfStream)
            {
                string line = sr.ReadLine();
                string[] parts = line.Split('#');
                deutschbox.Items.Add(parts[0]);
                englischbox.Items.Add(parts[1]); 
            
}

Das heißt ansich müsste ich doch nur die englischbox kurz zwischenspeichern oder muss ich das mit beiden machen?

Das zurückspeichern sollte ansich easy sein oder?

Denn er muss nur die 0 dann auf 1 setzen oder bei 0 behalten, wenn die Frage halt falsch war.
 
Hallo,

So ein Vokalbeltrainer ist immer ein gutes Einstiegsprojekt, da man da fast alle Grundlagen-Themen reinpacken kann und es von einfach bis kompliziert beliebig schwierig auf/ausbauen kann!

Als erstes solltest du die Daten nicht direkt beim Auslesen in die Controls schreiben. Erstell dafür lieber ne eigene Klasse mit den String-Properties DeutscherText, EnglischerText, und je nachdem ob es dir nur um richtig/falsch geht oder du zählen willst wie oft du richtig lagst ein bool- oder ein int-Property.

Das Speichern ist leider auch nicht ganz so trivial wie du es dir erhoffst, aber du machst es dir mit dem Klassen-Ansatz einfacher. Nuja prinzipiell ist es doch ganz einfach, man schreibt nämlich einfach die ganze Datei. Also so ein einzelnes Zeichen ersetzen ist sehr schwierig, denn die Datei ist ja letztendlich ein Stream und du müsstest wissen genau an welcher Stelle das Zeichen steht (und dann geht es auch nur 1 Zeichen durch 1 anderes zu ersetzen, nicht durch 2 der 3).

Wenn du aber alle Vokabeln in einer Liste hältst dann kannst du diese am Ende einfach durchlaufen und alle Vokabeln in die Datei zurückschreiben (immer mit WriteLine...halt dann so formatiert wie du haben willst mit den #).

Ich würde es auch nicht als 2 Listboxen realisieren, sondern entweder eine zur Auswahl einer Vokabel, und eine ungebundene Textbox, in die man die Lösung schreiben kann.

So, das waren jetzt mal ein paar Tipps, mit denen du hoffentlich weiter kommst :)

gruß
Ringelsocke
 
Das meiste funktioniert nun auch, muss nur noch zwei kleine Sachen für mein Programm wissen.

1. Wie kann ich z.b. eine Zahl in einer Zeile hochzählen lassen?

Meine txt. Datei :

Code:
Bogen#arch#0
Bereich#area#0

vor dem 1 # = deutsches Wort
vor dem 2 # = englisches Wort
nach dem 2# = box nummer

Bei einer richtigen Antwort, soll die Zahl von 0 auf 1 hochgezählt werden, bei einer falschen Antwort soll sie bei 0 bleiben...

Wie setze ich dieses am besten um ?
Denke das es die Zeile neu zu beschreiben, wäre am einfachsten oder?

2.

Wie kontrolliere ich bei der Eingabe eines Wortes ob das Wort schon in der .txt vorhanden ist, geht dieses irgendwie?
 
Hi,

zu 1.:
Ringelsocke hat gesagt.:
Als erstes solltest du die Daten nicht direkt beim Auslesen in die Controls schreiben. Erstell dafür lieber ne eigene Klasse mit den String-Properties DeutscherText, EnglischerText, und je nachdem ob es dir nur um richtig/falsch geht oder du zählen willst wie oft du richtig lagst ein bool- oder ein int-Property.
Wenn du das befolgt hast setzt du einfach den Richtig/Falsch Wert entsprechend um und speicherst das genze wieder in deine Textdatei.

zu 2.:
Du durchläust einfach dein Array worin die Vokabeln gespeichert sind mit einer Schleife und guckst ob eine entsprechende Vokabel bereits drin ist.

Gruß
x y z
 
Code:
                    // Textdatei laden und aufteilen
                    StreamReader sr = new StreamReader
                    ("vokabeln.txt", Encoding.Default);
                    while (!sr.EndOfStream)
                    {
                    string line = sr.ReadLine();
                    string[] parts = line.Split('#');
                    string deutschtext = (parts[0]);
                    string englischtext = (parts[1]);
                    

                    if ( deutschtext = parts[0])
                    {
                        gespeichert.Text = "Eintrag bereits gespeichert!";
                    }
                    else
                    {
                        // Eingabe in Textboxen in Textdokument speichern
                        StreamWriter StreamSchreiber = new StreamWriter("vokabeln.txt", true);
                        StreamSchreiber.Write("\r\n" + deutschtext.Text + "#" + englischtext.Text + "#" + "0");
                        StreamSchreiber.Flush();
                        StreamSchreiber.Close();
                        deutschtext.Text = "";
                        englischtext.Text = "";
                        gespeichert.Text = "Eintrag gespeichert!";
                    }
                    }

Hmmm wollte erst meinen Punkt 2 machen, also das Kontrollieren, aber kann mir dabei einer helfen :(
 
Hi,

Du machst erst:
Code:
string deutschtext = (parts[0]);
Dann kurz danach:
Code:
if ( deutschtext = parts[0])
Was soll das denn bewirken? ;)

Zum Problem:

Ich würde dir raten erstmal eine Klasse für die Vokabeln anzulegen:
z.Bsp.:
Code:
class Vokabel{
   public string Deutsch;
   public string Englisch;
   public int Box;    // Willst du eine Art Karteikasten bauen?

   public Vokabel(string Deutsch, string Englisch, int Box){
      this.Deutsch = Deutsch;
      this.Englisch = Englisch;
      this.Box = Box;
   }
}

Dann legst du dir eine Liste mit allen Vokabeln an:
Code:
public List<Vokabel> VokabelListe = new List<Vokabel>;
In dieser Liste speichern wir nun alle Vokabeln:
Code:
   public void Lade() {
            StreamReader sr = new StreamReader ("vokabeln.txt", Encoding.Default);
            while (!sr.EndOfStream)
            {
                string line = sr.ReadLine();
                string[] parts = line.Split('#');
                VokabelListe.Add(new Vokabel(parts[0], parst[1], parts[3]));
           }
   }
Nun haben wir alle Vokabeln in dieser Liste.

Wenn wir nun überprüfen wollen ob eine Vokabel schon existiert durchlaufen wir einfach unsere Liste und überprüfen die Werte:
Code:
string neuDeutsch = txtNeuDeutsch.Text;
string neuEnglisch = txtNeuEnglisch.Text;
bool stop, existiertBereits;
stop = false;
existiertBereits = false;

for (int i = 0;( i < VokabelListe.Count) && !stop; i++){
   if ((neuDeutsch == VokabelListe[i].Deutsch) && (neuEnglisch == VokabelListe[i].Englisch)) {
      // ist bereits vorhanden
      existiertBereits = true;
      stop = true;  // stoppe (Weitesuchen ist sinlos, da es ja bereits gefunden wurde)
   }
   else
   {

   }
}

if (!existiertBereits) { VokabelListe.Add(new Vokabel(neuDeutsch, neuEnglisch, 0); Speichern(); }

Nun schreiben wir uns noch eine Methode zum Speichern:
Code:
public void Speichern(){
   string Datei = "";
   for (int i = 0; i < VokabelListe.Count; i++) {
      Datei = Datei + VokabelListe[i].Deutsch + "#" + VokabelListe[i].Englisch + "#" + VokabelListe[i].Box;
      if (i != VokabelListe.Count) { Datei = Datei + Environment.NewLine(); } // Wenn nicht letzte Vokabel dann neue Zeile
   }


   StreamWriter Writer = new StreamWriter("C:\datei.txt")
   Writer.Write(Datei);
   Writer.Close();
}

So jetzt noch einmal zu deinem Boxen-Hochzähl-Problem:
Du zählst jetzt in der VokabelListe bei der entsprechenden Vokabel die Box hoch und speicherst das ganze über die Speicher-Methode ab.

Gruß
x y z

PS:
keine Garantie auf Richtigkeit des Codes hab ihn nähmlich nicht getestet :D
 
Die Klasse könnte dann auch einen String wie hallo#hello einlesen und sich damit initialisieren und diesen zum speichern wiederhergeben.

statt Box würde ich eher eine Klasse Gruppe programmieren:
Code:
class Group
{
string name;
List<Voc> vocs;
public Group(string name)
{
this.name = name;
}
AddVoc();
SaveVocs()
{
StreamWriter sw = new StreamWriter(name);
for(int i = 0; i!= vocs.Count;i++)
sw.WriteLine(vocs[i].GetSaveString());
sw.Close();
}
...
}


Falls du mal mehr aus deinem Projekt machen willst, vereinfacht das das sehr stark. Glaub aber nicht das dann alles einfach wäre, Gruppen ineinander legen wird dann nochmal richtig kompliziert, sofern man es graphisch mit treeview darstellt (habe ich selber erfahren müssen).
 
Zurück