Autor |
Beitrag |
M.Lach
Hält's aus hier
Beiträge: 4
|
Verfasst: Sa 08.11.08 22:40
Hallo,
ich habe eine Art Stoppuhr, die mir Datum und Uhrzeit als START als Zeile in eine Textbox bringt.
Dazu habe ich mir die Möglichkeit geschaffen, via eines Buttons eine Zwischenzeit dazuzufügen.
Klappt auch alles sowie ich mag, nur würde ich das Sache gerne verfeinern - Ecken abfeilen.
Zum Beispiel sollte hinter "Zwischenzeit" noch eine laufende Nummer dazu geschrieben werden.
"Zwischenzeit 1", "Zwischenzeit 2" usw. Dazu wollte ich bei jedem Button_Click eine Variable hochzählen lassen, und sie einfach mit ausgeben.
Wenn ich versuche eine INT ZZ; im Teil bei:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| namespace Stoppuhr { public partial class Stoppuhr : Form { public Stoppuhr() { InitializeComponent(); this.timer1.Enabled = true; int zz; |
dann kommt als Bemerkung schon eine Warnung.
Quelltext 1:
| Die Variable "zz" ist deklariert, wird aber nie verwendet. |
dabei habe ich weiter Unten die Variable "geplant" um sie zu nutzen.
Wenn ich so was simples wie "zz = zz +1;" mache, kommt ein Fehler:
Quelltext 1:
| Der Name "zz" ist im aktuellen Kontext nicht vorhanden. |
Ich vermute stark, ich mache etwas total elementares falsch und muss anders programmieren.
Objekte erzeugen usw..
Was ich später noch haben möchte für meine Uhr, ist ein Schalter, mit dem ich die Stoppuhr "scharf" schalte und diese erst startet, wenn in einem anderen Fenster die Maus geklickt wird.
Da habe ich aber noch überhaupt keinen plan, wie ich das nutze.
Ich hab auch gedacht, das ich einen Zeilenvorschub in der Textbox mit einem an den Text angefügten "\n" erreiche.
Das ich dafür aber "Enviroment.Newline" nehmen muss, habe ich auch erst hier gelesen. Also: Lesen bildet..
Danke schon mal für Eure Geduld mit mir als Neuling.
(P.S.: ich trau mich nicht, mein "Form1"-Code hier zu posten... Sollte ich das trotzdem machen?
Moderiert von Christian S.: Code- durch C#-Tags ersetzt
Edit: Titel angepasst. Von dem Traum, mit dem anderen Fenster werde ich mich wohl verabschieden. (Zeitmangel, Aufwand-Nutzen-Gegenüberstellung usw.. )
Mein Code habe ich angepasst: (ja, ich hatte etwas Hilfe dabei - hab aber auch viel gelernt denke ich.)
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79:
| namespace Stoppuhr { public partial class Stoppuhr : Form { List<DateTime> zeiten = new List<DateTime>(); public Stoppuhr() { InitializeComponent(); timer1.Enabled = true; }
private void btnStart_Click(object sender, EventArgs e) { DateTime aktuelleZeit = DateTime.Now;
if (zeiten.Count == 0) { ausgabe.Text = string.Empty; zeiten.Add(aktuelleZeit); btnZwischenzeit.Enabled = true; btnStart.Text = "Stop"; ZeigeStartZeit(aktuelleZeit); } else { zeiten.Add(aktuelleZeit); btnZwischenzeit.Enabled = false; btnStart.Text = "Start"; ZeigeStopZeit(aktuelleZeit); zeiten.Clear(); }
}
private void ZeigeStartZeit(DateTime aktuelleZeit) { string text = string.Format("Startzeit: {0:G}", aktuelleZeit); FügeZeileHinzu(text); }
private void ZeigeStopZeit(DateTime aktuelleZeit) { DateTime letzteZeit = zeiten[zeiten.Count - 2];
string text = string.Format("Stopzeit: {0:G} Differenz {1:T}", aktuelleZeit, letzteZeit-aktuelleZeit); FügeZeileHinzu(text); }
private void btnZwischenzeit_Click(object sender, EventArgs e) { DateTime aktuelleZeit = DateTime.Now; DateTime letzeZeit = zeiten[zeiten.Count - 1];
zeiten.Add(aktuelleZeit);
TimeSpan differenz = letzeZeit - aktuelleZeit; ZeiteZwischenzeit(aktuelleZeit, differenz); }
private void ZeiteZwischenzeit(DateTime aktuelleZeit, TimeSpan differenz) { string text = string.Format("Uhrzeit: {0:G} Differenz: {1:T}", aktuelleZeit, differenz); FügeZeileHinzu(text); }
private void FügeZeileHinzu(string text) { ausgabe.Text += text + Environment.NewLine; }
private void timer1_Tick(object sender, EventArgs e) { textBox1.Text = DateTime.UtcNow.ToShortDateString() + " | " + DateTime.Now.ToLongTimeString(); }
} } |
Danke für Eure Hilfe.
Ich poste hier, wenn ich noch Fragen zu der Sache habe.
Leider fehlt mir als berufstätiger und alternder Familienvater die Zeit mich Abends/Nachts hinzusetzten und Stunde und Stunde in diese Kleinkram zu stecken.
Zuletzt bearbeitet von M.Lach am Mi 12.11.08 21:51, insgesamt 1-mal bearbeitet
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Sa 08.11.08 22:51
Hallo und  !
Wenn ich das richtig sehe, dann musst Du die Nummer der Zwischenzeiten als Feld Deiner Klasse deklarieren. Anders als lokale Variablen in einer Methode "leben" die ja so lange wie die Instanz der Klasse (in diesem Fall Deine Form als Instanz der Klasse Form1).
Du hast zz als lokale Variable im Konstruktor deklariert - sobald der Konstruktor ausgeführt wurde, gibt's die Variable nicht mehr, sodass Du also woanders auch nicht mehr drauf zugreifen kannst.
Eine Deklaration als privates Feld könnte z.B. so aussehen:
C#-Quelltext 1: 2: 3: 4:
| public partial class Stoppuhr : Form { private int zwischenzeitCount = 0; |
(Ich tendiere zu sprechenden Variablen-Namen, damit ich nicht überlegen muss, wofür "zz" denn nochmal stand. Sieht hier ein bisschen doof aus, weil deutsch und englisch gemischt. Eigentlich tendiere ich auch eher zu englischen Variabelnnamen *g*)
Es dürfte sinnvoll sein, wenn Du mal Deinen ganzen Quelltext hier postest (oder alternativ die Datei anhänst, wenn's viel Quelltext). Es gibt sicherlich noch ein paar Tipps, die man Dir da geben kann
Grüße
Christian
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
M.Lach 
Hält's aus hier
Beiträge: 4
|
Verfasst: So 09.11.08 16:12
Christian S. hat folgendes geschrieben : | Hallo und !
Wenn ich das richtig sehe, dann musst Du die Nummer der Zwischenzeiten als Feld Deiner Klasse deklarieren. Anders als lokale Variablen in einer Methode "leben" die ja so lange wie die Instanz der Klasse (in diesem Fall Deine Form als Instanz der Klasse Form1).
|
ja, das genau scheint mein Problem zu sein. Ich denke nicht in Objekten oder Instanzen oder was immer, sondern klicke drauf los, erstelle mein Form und merke dann, das ich eine Variable brauch.
Was ein Feld meiner Klasse ist weis ich nicht, da ich nicht bewusst eine Klasse erzeugt habe, geschweige denn genau weis, was ich da mache.
Christian S. hat folgendes geschrieben : |
Du hast zz als lokale Variable im Konstruktor deklariert - sobald der Konstruktor ausgeführt wurde, gibt's die Variable nicht mehr, sodass Du also woanders auch nicht mehr drauf zugreifen kannst.
Eine Deklaration als privates Feld könnte z.B. so aussehen:
C#-Quelltext 1: 2: 3: 4:
| public partial class Stoppuhr : Form { private int zwischenzeitCount = 0; |
(Ich tendiere zu sprechenden Variablen-Namen, damit ich nicht überlegen muss, wofür "zz" denn nochmal stand. Sieht hier ein bisschen doof aus, weil deutsch und englisch gemischt. Eigentlich tendiere ich auch eher zu englischen Variabelnnamen *g*)
|
Das hat funktioniert.
Frage dazu: Warum konnte ich andere Variablen ohne "cs"private int bla =x;[/cs] nutzen?
Ich nutze einfach var tag = DateTime.UtcNow.ToShortDateString(); und das funktioniert, und ich kann es nutzen.
Ich werde mich in der Noemklatur noch was ändern.
Christian S. hat folgendes geschrieben : |
Es dürfte sinnvoll sein, wenn Du mal Deinen ganzen Quelltext hier postest (oder alternativ die Datei anhänst, wenn's viel Quelltext). Es gibt sicherlich noch ein paar Tipps, die man Dir da geben kann
Grüße
Christian |
Danke dafür.
Wo sollte ich denn meinen Code posten? Hier? Oder unter Projekte? (ich habs mal Unten angehangen)
Für meine Stoppuhr suche ich noch zwei, drei Erweiterungen, die ich gerne da rein hätte.
Die erste: Ich möchte von der Start- und Endezeit eine Dauer errechnen, wenn ich Stop drücke.
In Delphi würde ich str2int oder sowas nutzen, um damit rechnen zu können, da z.B. "tag" (s.O.) das Datum enthält.
Ich habe herausgefunden, das ich das mit "System.Convert.ToUIntxx" machen muss.
Wie aber würde man nun so eine "var", die ein "DateTime" Inhalt hat wandeln?
int startzeitcount = System.Convert.ToInt16(startzeit); gibt eine "FormatException", die ich nicht verstehe. Die Hilfe dazu wird zwar aufgerufen, aber ich werde nicht schlau daraus.
hier mal mein Form1 der Stoppuhr:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53:
| namespace Stoppuhr { public partial class Stoppuhr : Form { private int zz = 0; private int startzeitcount = 0; private int stopzeitcount = 0;
public Stoppuhr() { InitializeComponent(); this.timer1.Enabled = true; }
private void button1_Click(object sender, EventArgs e) { if (this.button1.Text == "Start") { this.button1.Text = "Stop"; this.button2.Enabled = true; var tag = DateTime.UtcNow.ToShortDateString(); var startzeit = DateTime.Now.ToLongTimeString(); this.ausgabe.Text += (tag + " | " + startzeit + " | Start" + Environment.NewLine); startzeitcount = System.Convert.ToInt32(startzeit); } else { this.button1.Text = "Start"; this.button2.Enabled = false; var tag = DateTime.UtcNow.ToShortDateString(); var stopzeit = DateTime.Now.ToLongTimeString(); this.ausgabe.Text += (tag + " | " + stopzeit + " | Stop" + Environment.NewLine); stopzeitcount = System.Convert.ToInt32(stopzeit); int dauer = stopzeitcount - startzeitcount; this.ausgabe.Text += " | " + dauer + " | Dauer"; } }
private void button2_Click(object sender, EventArgs e) { var tag = DateTime.UtcNow.ToShortDateString(); var startzeit = DateTime.Now.ToLongTimeString(); zz = zz + 1; this.ausgabe.Text += (tag + " | " + startzeit + " | Zwischenzeit"+zz + Environment.NewLine ); }
private void timer1_Tick(object sender, EventArgs e) { textBox1.Text = DateTime.UtcNow.ToShortDateString() + " " + DateTime.Now.ToLongTimeString(); }
} } |
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: So 09.11.08 17:00
Hallo,
mit ein paar Hinweisen kann ich dienen, aber nicht durchgehend, weil ich durch Dein Konzept nicht durchsteige und die Deklaration aller Variablen als var mir überhaupt nicht gefällt. Typ-genaues Deklarieren als string, int, DateTime, TimeSpan usw. zwingt m.E. zu genauerem Nachdenken und führt im Missbrauchsfall schon zu Compiler-Fehlermeldungen.
Dauer berechnen: Einfach zwei DateTime-Instanzen subtrahieren liefert als Ergebnis eine TimeSpan-Instanz. Merke: DateTime ist immer ein Zeit punkt, TimeSpan eine Zeit dauer. Deshalb kannst Du auch aus DateTime keinen int machen; wofür soll denn ein Int16 stehen, wenn es vorher ein DateTime ist? (Nach Deiner Beschreibung geht es um den Tag, dann nimm doch startzeit.Day - so einfach geht es.)
Convert.ToXxx ist möglichst zu vermeiden. Besser sind (soweit vorhanden) Parse, TryParse, ParseExact, TryParseExact. Dafür gibt es immer Überladungen, mit denen Du z.B. Format-Vorgaben festlegen kannst. Dabei solltest Du Dir angewöhnen, die SDK-Doku/MSDN als wichtigstes Hilfsmittel zu benutzen; über den ausgezeichneten Index findest Du viele Erläuterungen, Hinweise und Beispiele.
Zitat: | Ich denke nicht in Objekten oder Instanzen oder was immer, sondern klicke drauf los, erstelle mein Form und merke dann, das ich eine Variable brauch. |
Das solltest Du doch ändern. Bitte arbeite Dich zielgerichtet ein, z.B. durch OpenBook Visual C#.
Viel Erfolg! Jürgen
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: So 09.11.08 17:28
JüTho hat folgendes geschrieben : | und die Deklaration aller Variablen als var mir überhaupt nicht gefällt. Typ-genaues Deklarieren als string, int, DateTime, TimeSpan usw. zwingt m.E. zu genauerem Nachdenken und führt im Missbrauchsfall schon zu Compiler-Fehlermeldungen. |
Ich glaube, da gibt es ein Missverständnis. Das Deklarieren von Variablen als var hebt die strenge Typisierung von C# nicht auf. Es wird lediglich "Type Inference" angewandt und zur Compilezeit der Typ der Variable ermittelt! Dieser ist trotzdem vollständig definiert und eindeutig. Type Inference halte ich für einen wirklichen Segen (und war froh, dass Chrome das schon lange vor C# hatte).
Was das Nachdenken angeht, kann man da sicherlich geteilter Meinung sein. Wenn ich RegEx.Matches aufrufe, ist es mir eigentlich egal, ob da ein IEnumerable<Match>, ein IEnumerable oder - wie es IIRC der Fall ist - eine MatchCollection bei rauskommt. Type Inference hilft da IMHO zu abstrahieren: Ich will eine Liste mit Matches, wie diese Liste geanu umgesetzt, ist mir erstmal egal - daher ist das für mich ein Implementationsdetail, über welches ich nicht nachdenken müssen will (<-- oder so ähnlich *g*).
Dem Rest habe ich - wie eigentlich immer  - nichts hinzuzfügen 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
M.Lach 
Hält's aus hier
Beiträge: 4
|
Verfasst: So 09.11.08 18:47
JüTho hat folgendes geschrieben : |
Dauer berechnen: Einfach zwei DateTime-Instanzen subtrahieren liefert als Ergebnis eine TimeSpan-Instanz. Merke: DateTime ist immer ein Zeitpunkt, TimeSpan eine Zeitdauer. Deshalb kannst Du auch aus DateTime keinen int machen; wofür soll denn ein Int16 stehen, wenn es vorher ein DateTime ist? (Nach Deiner Beschreibung geht es um den Tag, dann nimm doch startzeit.Day - so einfach geht es.)
|
Was ich erreichen wollte: Zum Startzeitpunkt diesen "festhalten", in einer Variable, sodass ich später damit rechnen kann. das passiert ja auch, da ich das ausgebe. Was fehlt, ist eine Form, in der ich rechnen kann. Ich dachte halt, das convert.to mein Werkzeug dafür ist. Die Endezeit dito, sodass ich als "Dauer" das herausbekomme, was zwischen Start und Stopp vergangen ist.
Da dachte ich (wohl falsch gedacht), ich nehme das DateTime-"Ding", wandle es um, und kann damit rechnen.
An Alle, vielen Dank für die Literaturhinweise.
|
|
|