Fraggla Geschrieben 21. September 2010 Geschrieben 21. September 2010 Hey ho. Ich hab mal wieder ein Problem... Ich schreibe gerade meine erste Anwendung, die in Textfiles schreibt. Damit meine Zeilen nicht überschrieben werden, hab ich mir folgendes gebastelt: private void btnGehen_Click(object sender, EventArgs e) { int ZN = 1; string Prüfung; while ((Prüfung = NewTime.ReadLine(@"C:\WinZeitLog.txt", ZN)) != "") { ZN++; } string Gehen = DateTime.Now.ToShortTimeString(); NewTime.WriteLine(@"C:\WinZeitLog.txt", ZN, "Gehen: " + Gehen, false); Den Inhalt von ZN würde ich gerne auch bei anderen Buttons verwenden. Allerdings hab ich leider keine Ahnung wie ich das ganze Global definieren kann. Wäre schön wenn man mir hier mal wieder einen Denkanstoß geben könnte. Zitieren
Ulfmann Geschrieben 21. September 2010 Geschrieben 21. September 2010 Du darfst die Variable nicht in dieser Methode erzeugen, deklarier sie am Anfang der Klasse. Normalerweise arbeitet man mit Kapselung, d. h. du rufst einfach eine weitere Methode auf, die die Variable verändert. C# hat für dieses Problem die Properties eingeführt, belies dich mal mit dieser Sache. Zitieren
lbm1305 Geschrieben 21. September 2010 Geschrieben 21. September 2010 Für das Schreiben in eine txt-Datei gibt es die StreamWriter, zum lesen die StreamReader-Klassen. Siehe auch hier: Gewusst wie: Öffnen und Anfügen an eine Protokolldatei Zitieren
Fraggla Geschrieben 21. September 2010 Autor Geschrieben 21. September 2010 den StreamWriter hab ich in ner seperaten Klasse, der wird per NewTime.ReadLine o.ä Befehle aufgerufen. Andere Frage: Ich versuche gerade nen Counter zu basteln, der sich erhöht, sobald der jeweilige Knopf gedrückt wird. Resultat soll sein, dass bei meiner Arbeitszeituhr Kommen und Gehen durch nummeriert wird. Leider ignoriert er meinen increment immer: int Counter = 0; Counter++; int ZN = 1; string Prüfung; while ((Prüfung = NewTime.ReadLine(@"C:\WinZeitLog.txt", ZN)) != "") { ZN++; } string Gehen = DateTime.Now.ToShortTimeString(); NewTime.WriteLine(@"C:\WinZeitLog.txt", ZN, "Gehen"+Counter+": " + Gehen,false); Eine von x-varianten die ich bisher durchprobiert habe..... Zitieren
Klotzkopp Geschrieben 21. September 2010 Geschrieben 21. September 2010 Je nachdem, wo du deinen Counter definierst, hat das eine andere Bedeutung. Wenn du eine Variable in der Methode anlegst, ist sie lokal. Sie wird jedesmal beim Betreten der Funktion neu angelegt, und am Ende verliert sie ihre Gültigkeit. Das ist dasselbe Problem wie vorher, und eigentlich absolutes Grundlagenwissen. Zitieren
Ulfmann Geschrieben 21. September 2010 Geschrieben 21. September 2010 Ich nehme an, jedes Mal, wenn du den Button klickst, erzeugst du eine Variable namens Counter mit dem Wert 0. Sie wird nie hochgezählt, sondern immer wieder auf 0 gesetzt. Wie schon geschrieben: Erzeug sie dir vor der Click-Methode und erhöhe sie darin nur. Zitieren
Fraggla Geschrieben 21. September 2010 Autor Geschrieben 21. September 2010 Ich habe nunmal leider kein Buch hier und manche der OpenBooks die ich durchgelesen habe empfand ich persönlich als nicht wirklich verständlich, sowie zu theoretisch, als dass ich das anschließend noch alles Wissen könnte. Daraus resultiert, dass ich ein Grundlagenwissen habe, welches eher einem schweizer Käse ähnelt. D.h ich betreib hier Try & Error bis ich endlich Berufsschulunterricht bekomme, sollte ich euch mit meinen Fragen nerven, werd ich nicht mehr posten. Ansonsten Danke für den Hinweis, darauß lässt sich weiter etwas erarbeiten. Zitieren
lbm1305 Geschrieben 21. September 2010 Geschrieben 21. September 2010 Fragen können nicht nerven. Man muss sie ja nicht beantworten. ;-) Falls Du noch kein Basiswissen haben solltest, wäre es in meinen Augen wichtig, erst Mal diese zu kennen. Man kann z.B. ne Klasse definieren, mit zwei / drei Methoden. Diese Methoden manipulieren interne Member-Variablen. Diese kann man dann mit einer weiteren Methode ausgeben. So lernst Du, wie / welche Variablen / Properties wo ihre Gültigkeit haben. Ich persönlich werde keinen Code posten, solange der Fragesteller sich offensichtlich keine Gedanken über seinen Code macht. Zitieren
Klotzkopp Geschrieben 21. September 2010 Geschrieben 21. September 2010 Ich habe nunmal leider kein Buch hier und manche der OpenBooks die ich durchgelesen habe empfand ich persönlich als nicht wirklich verständlich, sowie zu theoretisch, als dass ich das anschließend noch alles Wissen könnte.Wir haben eine Tutorial-Liste im Forum oben angepinnt. Daraus resultiert, dass ich ein Grundlagenwissen habe, welches eher einem schweizer Käse ähnelt. D.h ich betreib hier Try & Error bis ich endlich Berufsschulunterricht bekomme, sollte ich euch mit meinen Fragen nerven, werd ich nicht mehr posten.Nein, kein Problem. Ich wollte nur anmerken, auf welchem Level deine Verständnisprobleme liegen. Das ist nicht jedem so klar wie dir. Zitieren
Fraggla Geschrieben 21. September 2010 Autor Geschrieben 21. September 2010 Die Tutorial-Liste habe ich selbst sogar noch ergänzt. Das Problem welches ich mit den meisten Tutorials habe ist, dass die meisten eben mMn viel zu trocken sind. Ich hab bestimmt 5x versucht das hoch gelobte "Golo Roden C# Buch" zu lesen und ich finds einfach nur grottig. @Ibm Ich mach mir sehr wohl Gedanken über meinen Code. Ansonsten würde ich nich lange bevor das Problem auftritt wissen, dass ich Werte in mehreren Variablen benötige. Zitieren
Ulfmann Geschrieben 21. September 2010 Geschrieben 21. September 2010 Zurück zum Thema: Leuchtet dir denn ein, warum dein Counter außerhalb der Methode erzeugt werden muss? Zitieren
Fraggla Geschrieben 21. September 2010 Autor Geschrieben 21. September 2010 Jetzt im nachhinein natürlich. Sie wird jedesmal beim Betreten der Funktion neu angelegt, und am Ende verliert sie ihre Gültigkeit war der Knackpunkt. Hat keine 5 Minuten gedauert, da hatte ich das erfolgreich geändert. Den Fehler werd ich so in der Form nun hoffentlich nicht mehr machen. Danke nochmal Zitieren
lbm1305 Geschrieben 21. September 2010 Geschrieben 21. September 2010 @Ibm Ich mach mir sehr wohl Gedanken über meinen Code. Ansonsten würde ich nich lange bevor das Problem auftritt wissen, dass ich Werte in mehreren Variablen benötige. LBM1305 Nur klein ;-) Ich habe auch nicht das Gegenteil behauptet. Manchmal muss man auch keinen Code posten. :-O Zitieren
2K1.INC Geschrieben 21. September 2010 Geschrieben 21. September 2010 LBM1305 Nur klein ;-) Ich habe auch nicht das Gegenteil behauptet. Manchmal muss man auch keinen Code posten. :-O is dir schon mal aufgefallen das deine Beiträge nicht die Frage/das Problem des erstellers beantwortet/hilfreich ist ? Du antwortest zu jedem Thread und wenn er wie hier fragt wo sein problem ist/ wie ers besser machen könnte kommst du mit dem StreamWriter daher ? du kommst mit irgend einer fu Klasse daher, er weis ned mal was ne Membervariable is, und dann soll er den StreamWriter usen das er später mal ein 0815 Coder is der ohne .NET Klassen nix kann ... Sry soll keine blöde anmache sein aber ne feststellung das dein Senf immer dabei is aber ned wirklich hilfreich und zum Problem passend sicher kann mans so machen wie du sagst aber is das so gut für anfänger ? Zitieren
Fraggla Geschrieben 21. September 2010 Autor Geschrieben 21. September 2010 Dank dir für die Links 2k1.inc ich werd sie morgen durcharbeiten, dazu komm ich leider heute nicht mehr. @Topic: Das erste Problem ist zwar gelöst, jedoch hab ich jetzt ein ähnliches Problem wozu mir noch keine Lösung eingefallen ist: Problem: Jeder Mitarbeiter Kommt und Geht logischerweise mehrmals täglich, drückt also den Kommen und Gehen Button mehrfach. Außerdem will ich die Zeitspannen ausrechnen und 2 Textboxen mit der insgesamten Pausenzeit und der insgesamten Arbeitszeit anzeigen lassen. Lösungsansatz: string array deklarieren, Werte in Array abspeichern, Array abrufen, in Zeit umwandeln und dann die Zeitspanne daraus berechnen. Dann das ganze in eine Textbox -> Fertig. Ist der Grundsatzgedanke richtig, oder passt da noch was nicht? @all: Ich bin für jeden Post, solange er keine persönliche Beleidigung oder ähnlich sinnfreie Flames darstellt, dankbar. Wäre schön wenn ihr hier keinen Flamewar drauß macht :> Zitieren
NerdonRails Geschrieben 21. September 2010 Geschrieben 21. September 2010 ... und dann soll er den StreamWriter usen das er später mal ein 0815 Coder is der ohne .NET Klassen nix kann ... Nimms mir nicht übel, aber im Umfang eines Frameworks zu entwickeln und dann das Framework nicht zu benutzen zeugt nicht gerade davon das der Zweck eines Frameworks verstanden wurde. Und Klassen wie Streamwriter etc. gehören zu den .Net-Basics, die sollte man schon mitnehmen wenn es sich ergibt Zitieren
2K1.INC Geschrieben 21. September 2010 Geschrieben 21. September 2010 Nimms mir nicht übel, aber im Umfang eines Frameworks zu entwickeln und dann das Framework nicht zu benutzen zeugt nicht gerade davon das der Zweck eines Frameworks verstanden wurde. Und Klassen wie Streamwriter etc. gehören zu den .Net-Basics, die sollte man schon mitnehmen wenn es sich ergibt wenn er nicht mal weiß was ne MEMBERVARIABLE ist wie soll er das Framework checkn ? @Frraggla Zeitberechnen solltest du am besten mit der DateTime und der TimeSpan Klasse lösen. Prinzip ist easy zu verstehn du gehst folgendermaßen vor. Du willst die aktuelle Zeit speichern, weil einer z.B. Rauchen geht. DateTime startTime = DateTime.Now; Er ist wieder da nun speicherst du wieder die aktuelle Zeit. DateTime endTime = DateTime.Now; die Zeit dazwischen ermittelst du so TimeSpan duration = endTime - startTime; in duration hast du nun die aktuelle Zeit die er beim Rauchen war. Kürzere Schreibweise wär auch statt die endTime in ner Variable zu speichern einfach TimeSpan duration = DateTime.Now - startTime; Du brauchst nicht dringend ein Array weil du könntest die Arbeitszeit in einem TimeSpan speichern und jedesmal dazu Addieren hoff des löst dein Problem. Zitieren
lbm1305 Geschrieben 21. September 2010 Geschrieben 21. September 2010 (bearbeitet) daher, er weis ned mal was ne Membervariable is, und dann soll er den StreamWriter usen das er später mal ein 0815 Coder is der ohne .NET Klassen nix kann ... Sry soll keine blöde anmache sein aber ne feststellung das dein Senf immer dabei is aber ned wirklich hilfreich und zum Problem passend sicher kann mans so machen wie du sagst aber is das so gut für anfänger ? Dann sollen die Anfänger auch von Anfang an beginnen. Datentypen, Klassen, Methoden, Properties. Wer sich gleich mit komplizierten Dingen auseinandersetzt, der SOLL Ahnung von den Basics haben. Ich habe die Klasse ausserdem nicht nur erwähnt, sondern auf die MSDN verwiesen. Und da sind weiß Gott nicht nur irgendwelche Auszüge von Code drin. Wenn Du den Link verfolgt hättest, dann würdest Du es sehen. Und wenn man den StreamWriter / StreamReader benutzt, dann fällt auch der komische Counter weg, der ja anscheinend das ganze Übel war. Und jemanden nur etwas vorkauen ist nicht meine Art. Der Threadersteller oder der der das Problem hat, soll sich auch selber Gedanken machen und da kann ein Verweis zu einer komfortableren Lösung schon hilfreich sein. Außerdem besteht gleich ein Lerneffekt. EDIT: Für die Anfänger, die nicht lesen wollen, hier eine schöne Webcast-Serie zum Thema C#-Anfänger: Webcast: Einführung in das .NET Framework (Teil 1-10) - Strings: Alles mit Texten, oder? | MSDN Online Bearbeitet 21. September 2010 von lbm1305 Zitieren
2K1.INC Geschrieben 21. September 2010 Geschrieben 21. September 2010 (bearbeitet) er fragt warum der counter nicht das macht was er soll deine antwort war warum er nicht den StreamWriter used ? was hat das aber damit zu tun das der counter nicht das macht was er soll ? Rein gar nix deine Antwort war nur ein andrer lösungsweg... wie fast auch immer bei deinen antwortn auf fragn nimms ned persönlich ich wollt dir nur mal sagen du solltest vll mal konkret auf das Problem eingehn und versuchen das zu lösen auch wenns andere/bessere lösungen gibt aber vll mal sein Problem lösn und danach anregungen wie ers besser machen könnte... Bearbeitet 21. September 2010 von 2K1.INC Zitieren
lbm1305 Geschrieben 21. September 2010 Geschrieben 21. September 2010 Was soll denn daran verkehrt sein, jemand darauf hinzuweisen, dass es auch einfacher geht? Vielleicht löst sich ja damit sein Problem? Der Counter dient doch dazu, die Anzahl der Zeilen auszugeben? Das geht doch auch mit'nem StreamReader?! Also ist es doch zum Thema? Wenn ich immer meine Fragen (bzw. die Antwort) beharrt hätte, dann wäre ich noch beim Anfängerlevel. Dank solcher Hinweise geht es vielleicht mit dem Lernfortschritt schneller, jedenfalls hab ich davon profitiert. Aber wenn das hier das Niveau sein soll, dann bitte. Zitieren
Fraggla Geschrieben 22. September 2010 Autor Geschrieben 22. September 2010 @2k1.inc leider nein. Timespan kenne ich soweit schon, jedoch sind Kommen und Gehen jeweils seperate Buttons. Ich poste mal meinen Code von den Buttons: public void btnKommen_Click(object sender, EventArgs e) { Counter++; if (Counter % 2 == 1) { if (cbZeit.Checked) { Kommen = txtKommen.Text; Kommen = Kommen.Replace(".", ":"); Kommen = Kommen.Replace(",", ":"); DateTime KommenZ; if (DateTime.TryParseExact(Kommen, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out KommenZ)) { int ZN = 1; string Prüfung; while ((Prüfung = NewTime.ReadLine(@"C:\WinZeitLog.txt", ZN)) != "") { ZN++; } NewTime.WriteLine(@"C:\WinZeitLog.txt", ZN, "Kommen" + Counter + ": " + Kommen, false); txtKommen.Text = Kommen; MessageBox.Show("Manuelle Buchung gespeichert"); KommenZs[i] = Kommen; i++; } else { MessageBox.Show("Ungültiges Zeitformat!"); } } else { string Kommen2 = DateTime.Now.ToShortTimeString(); int ZN = 1; string Prüfung; while ((Prüfung = NewTime.ReadLine(@"C:\WinZeitLog.txt", ZN)) != "") { ZN++; } NewTime.WriteLine(@"C:\WinZeitLog.txt", ZN, "Kommen" + Counter + ": " + Kommen2, false); txtKommen.Text = Kommen2; KommenZs[i] = Kommen; i++; } } else { MessageBox.Show("Kommen bereits gebucht!"); Counter--; } } private void btnGehen_Click(object sender, EventArgs e) { Counter++; if (Counter % 2 == 1) { MessageBox.Show("Gehen bereits gebucht!"); Counter--; } else { if (cbZeit.Checked) { string Gehen = txtGehen.Text; Gehen = Gehen.Replace(".", ":"); Gehen = Gehen.Replace(",", ":"); DateTime GehenZ; if (DateTime.TryParseExact(Gehen, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out GehenZ)) { int ZN = 1; string Prüfung; while ((Prüfung = NewTime.ReadLine(@"C:\WinZeitLog.txt", ZN)) != "") { ZN++; } NewTime.WriteLine(@"C:\WinZeitLog.txt", ZN, "Gehen" + Counter + ": " + Gehen.PadLeft(2,pad), false); txtKommen.Text = Gehen; MessageBox.Show("Manuelle Buchung gespeichert"); GehenZs[bi] = Kommen; bi++; } else { MessageBox.Show("Ungültiges Zeitformat!"); } } else { string Gehen2 = DateTime.Now.ToShortTimeString(); int ZN = 1; string Prüfung; while ((Prüfung = NewTime.ReadLine(@"C:\WinZeitLog.txt", ZN)) != "") { ZN++; } NewTime.WriteLine(@"C:\WinZeitLog.txt", ZN, "Gehen" + Counter + ": " + Gehen2.PadLeft(2,pad), false); txtGehen.Text = Gehen2; GehenZs[bi] = Kommen; bi++; } } } 1ste If Abfrage: Verhindert, dass Kommen 2x hintereinander gebucht wird 2te If Abfrage: Überprüft ob die Zeit manuell eingetragen werden soll, oder automatisch die aktuelle Zeit. Wenn mir jemand sagen könnte, wie ich am besten die einzelnen Kommen + Gehen am besten in verschiedene Variablen abspeichern kann, wäre das für mich ein großer Schritt nach vorne. Falls der Code für "meinen" Streamwriter benötigt wird, kann ich ihn gerne posten. Zitieren
2K1.INC Geschrieben 22. September 2010 Geschrieben 22. September 2010 Um nicht 2mal hintereinander Kommen drücken zu können solltest du lieber mit Enabled arbeiten(bietes jedes Steuerelement). btnKommen.Enabled = false; btnGehen.Enabled = true; nur mal so ne frage du willst ja ein Zeiterfassungsprogramm schreiben, doch soll er nur die Arbeitszeit/Pausezeit erfassen oder soll er alles erfassen jedes kommen/gehen ? Zitieren
lbm1305 Geschrieben 22. September 2010 Geschrieben 22. September 2010 Wenn mir jemand sagen könnte, wie ich am besten die einzelnen Kommen + Gehen am besten in verschiedene Variablen abspeichern kann, wäre das für mich ein großer Schritt nach vorne. Ich getraue mir gar nichts zu sagen. :-/ Ich warte erstmal auf den konstruktiven Vorschlag vom Chefkritiker. Zitieren
2K1.INC Geschrieben 22. September 2010 Geschrieben 22. September 2010 Ich getraue mir gar nichts zu sagen. :-/ Ich warte erstmal auf den konstruktiven Vorschlag vom Chefkritiker. *gib keks* bleib mal locker war ja ned böse gemeint und wenn du kritik ned verträgst solltest daran arbeitn... mein vorschlag hier wär ganz klar neu aufziehn des programm bekommst ja augenkrebs drauf (strings mit == vergleichen oder wurde button 2mal hintereinander geklickt mit counter % 2 auswertn ) aber da er neuling is kannst du ned erwarten das es wie bei einem aussieht der des schon ne zeitlang macht... zudem erstmal auf seine antwort warten wegen der frage ob alles geloggt wird oder ned- Zitieren
Fraggla Geschrieben 23. September 2010 Autor Geschrieben 23. September 2010 Hey Leute, sorry kann es derzeit nicht ausprobieren. Das Projekt hab ich in der Fimra und ich lieg aber derzeit mit Bronchitis daheim im Bett Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.