Entwickler-Ecke
WinForms - wecker mit datum
conway96 - Di 02.03.10 20:07
Titel: wecker mit datum
Hi,
bin absoluter Anfänger in der Sprache C#.
ich hab es geschaft einen wecker zu programmieren (zumindest gitb er ein "hallo" zu einer bestimmten zeit aus).
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| private void timer1_Tick(object sender, EventArgs e) { System.DateTime zeit; int stunde, minute, sekunde;
zeit = System.DateTime.Now;
this.txt_uhrzeit.Text = zeit.ToLongTimeString();
stunde = zeit.Hour; minute = zeit.Minute; sekunde = zeit.Second;
if (stunde == 16 && minute == 0 && sekunde == 0) { MessageBox.Show("Hallo"); } |
ich möchte gerne auch noch ein datum einstellen können...kann mir da bitte jamand helfen?
JüTho - Di 02.03.10 21:28
Hallo und :welcome:
Das ist ein guter Anfang, um in der SDK-Doku/MSDN/Hilfe nachzulesen. Schau einmal, was ein DateTime ist, aus welchen Bestandteilen er besteht bzw. bestehen kann und auf welchem Wege ein neuer DateTime erzeugt werden kann.
Gruß Jürgen
conway96 - Di 02.03.10 21:56
Danke!
conway96 - Di 02.03.10 23:10
ok...das hat jetzt funktioniert, danke nochmal
nun möchte ich datum und uhrzeit auch im fenster und nicht nur im editor einstellen können
...mein lösungsansatz dazu wäre dieser:
ich habe ich 2 textboxen in den datum und uhrzeit augegeben werden (tbdatum und tbzeit)
und außerdem 2 textboxen in denen ich je eine anderes datum und eine andere uhrzeit eingeben kann
(also einen termin) --> (tbtermindatum und tbterminzeit)
ich wollte daher, wenn die texte der beiden datum und der beiden terminboxen übereinstimmen, einen alarm ausgeben
C#-Quelltext
1: 2: 3: 4:
| if (tbdatum.Text == tbtermindatum.Text && tbzeit.Text == tbterminzeit); { MessageBox.Show("Alarm"); } |
...das hat nicht funktioniert:
Eine implizite Konvertierung vom Typ "string" in "bool" ist nicht möglich.
was muss ich anders machen? vielleicht gibt es auch einen ganz anderen (vielleicht einfacheren) lösungsansatz?
bitte um hilfe...
hier nochmal mein ganzes programm:
C#-Quelltext
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:
| using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;
namespace Wecker { public partial class Form1 : Form { public Form1() { InitializeComponent(); }
private void timer1_Tick(object sender, EventArgs e) { System.DateTime zeit; int stunde, minute; System.DateTime datum; int tag, monat, jahr;
zeit = System.DateTime.Now; datum = System.DateTime.Now;
this.tbzeit.Text = zeit.ToShortTimeString(); this.tbdatum.Text = datum.ToShortDateString();
stunde = zeit.Hour; minute = zeit.Minute; tag = datum.Day; monat = datum.Month; jahr = datum.Year;
if (tbdatum.Text == tbtermindatum.Text && tbzeit.Text == tbterminzeit); { MessageBox.Show("Alarm"); } } } } |
JüTho - Mi 03.03.10 10:13
Hallo,
die Fehlermeldung verwirrt etwas; ich vermute, dass der Compiler selbst verwirrt ist. Wenn tbterminzeit eine der TextBoxen ist, dann willst du eine Referenz auf eine TextBox mit einem String vergleichen, und das geht natürlich nicht. (Der Compiler hatte davor das "&&" gelesen und redet wohl deshalb von einem Vergleichswert bool.)
Insgesamt gehst du falsch an die Sache heran: Du willst dauernd TextBox-Inhalte vergleichen. In Wirklichkeit geht es dir aber darum, zwei
Zeiten zu vergleichen: die vorgegebene, die den Alarm auslösen soll, und die aktuelle. Also musst du dir die vorgegebene Zeit in einer DateTime-Variablen merken, z.B. dann, wenn die Eingabe abgeschlossen wird.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| private DateTime alarm = DateTime.MinValue;
private void alarmTimeLeave(object sender, EventArgs e) { DateTime date = DateTime.Parse(tbDatum.Text); DateTime time = DateTime.Parse(tbZeit.Text); alarm = new DateTime(date.Year, date.Month, date.Day, time.Hour, time.Minute, time.Second); } |
Der Timer muss dann nur prüfen, ob der Alarm auszulösen ist; wenn ja, ist der Alarm auszuschalten.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| private void timer1_Tick(object sender, EventArgs e) { tbCurrent.Text = DateTime.Now.ToString(); if(DateTime.Now > alarm) { MessageBox.Show("Alarm"); alarm = DateTime.MinValue; } } |
Es gibt überhaupt keinen Grund, auf die einzelnen Bestandteile zuzugreifen. Es gibt auch keinen Grund, nur zur Anzeige zwischen (aktuellem) Datum und Zeit zu trennen.
Du kannst dir die Sache noch erheblich erleichtern, indem die Eingabeprüfung statt mit TextBoxen mit
DateTimePicker erledigt wird; dann kannst du direkt
Value benutzen. Dummerweise werden zwei getrennte Picker benötigt.
Merke: TextBoxen sind nur zur Eingabe von Text gedacht; für andere Zwecke gibt es bessere Mittel. Zur Prüfung und Auswertung sind die jeweils richtigen Datentypen zu verwenden, aber nicht irgendwelche Strings.
Gruß Jürgen
conway96 - Mi 03.03.10 13:52
1) ist das jetzt das aktuelle datum in einer variable die date heißt?
C#-Quelltext
1:
| DateTime date = DateTime.Parse(tbdatum.Text); |
2) wieso kann ich dann nicht auch den aktuellen termin in variablen schreiben? (das funktioniert nicht, habs versucht)
C#-Quelltext
1: 2:
| DateTime tdate = DateTime.Parse(tbtermindatum.Text); DateTime ttime = DateTime.Parse(tbterminzeit.Text); |
3) warum muss ich alarm den kleinstmöglichen wert zuweisen?
C#-Quelltext
1:
| private DateTime alarm = DateTime.MinValue; |
4) warum "new"?
C#-Quelltext
1:
| alarm = new DateTime(date.Year, date.Month, date.Day, time.Hour, time.Minute, time.Second); |
warum "new"?
tut mir leid...bei mir scheiterts an den grundlagen, bitte trotzdem um hilfe
conway96 - Mi 03.03.10 16:28
hab jetzt ne andere lösung gefunden:
C#-Quelltext
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:
| using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;
namespace Wecker { public partial class Form1 : Form { public Form1() { InitializeComponent(); }
public void timer1_Tick(object sender, EventArgs e) { System.DateTime zeit; int stunde, minute; System.DateTime datum; int tag, monat, jahr;
zeit = System.DateTime.Now; datum = System.DateTime.Now;
this.tbzeit.Text = zeit.ToShortTimeString(); this.tbdatum.Text = datum.ToShortDateString();
stunde = zeit.Hour; minute = zeit.Minute; tag = datum.Day; monat = datum.Month; jahr = datum.Year; }
private void timer2_Tick(object sender, EventArgs e) { string vartermindatum = tbtermindatum.Text; string varterminzeit = tbterminzeit.Text; string varzeit = tbzeit.Text; string vardatum = tbdatum.Text;
if (vardatum == vartermindatum && varzeit == varterminzeit) { MessageBox.Show("Alarm"); } } } } |
um zu verhindern das jede sekunde eine Alarm-Messagebox aufpoppt (timer1 hat ein 1 sek interval) hab ich einen 2ten timer mit nem 1 minuten interval eingebaut in der die if-abfrage steht.
gibts dafür auch ne elegantere lösung?
denn "alarm" kommt nicht sofort wenn die minutenzahl umspringt...sondern irgendwann während die minutenzahl steht
JüTho - Mi 03.03.10 17:08
Zunächst zu deinen vorigen Fragen:
conway96 hat folgendes geschrieben : |
1) ist das jetzt das aktuelle datum in einer variable die date heißt?
C#-Quelltext 1:
| DateTime date = DateTime.Parse(tbdatum.Text); | |
Das kann ich nicht beantworten. Der Text, der in tbdatum.Text steht, wird als DateTime-Wert interpretiert. Als ich oben diesen Befehl hingeschrieben hatte, wollte ich das Datum, das für den Alarm gedacht ist, übernehmen. Wenn du als Datum für den Alarm immer das aktuelle Datum benutzen willst, ist das so natürlich eher Quatsch. Dann gehen diese Anweisungen so zusammen:
C#-Quelltext
1: 2: 3:
| DateTime time = DateTime.Parse(tbZeit.Text); alarm = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, time.Hour, time.Minute, 0); |
Die Sekunden auf 0 setzen ist sinnvoll wegen der späteren Prüfung, dass der Alarm beim Wechsel der Minute ausgelöst werden soll.
conway96 hat folgendes geschrieben : |
2) wieso kann ich dann nicht auch den aktuellen termin in variablen schreiben? (das funktioniert nicht, habs versucht)
C#-Quelltext 1: 2:
| DateTime tdate = DateTime.Parse(tbtermindatum.Text); DateTime ttime = DateTime.Parse(tbterminzeit.Text); | |
Du hast bisher überhaupt nichts davon geschrieben, wie ein Wert (Datum bzw. Zeit) in die TextBox eingegeben werden soll: welches Format, welches Trennzeichen. Mit der MaskedTextBox kann so etwas sauber gesteuert werden (die hatte ich bisher vergessen zu erwähnen).
"das funktioniert nicht" ist keine sinnvolle Beschreibung. Es gibt doch sicher eine Fehlermeldung. - Aber das gehört zu den Problemen mit DateTime. Es ist etwas umständlich, ein Datum mit einer Uhrzeit zu kombinieren.
conway96 hat folgendes geschrieben : |
3) warum muss ich alarm den kleinstmöglichen wert zuweisen?
C#-Quelltext 1:
| private DateTime alarm = DateTime.MinValue; | |
Aus praktischen Gründen. Wenn der Alarm ausgelöst wurde (MessageBox), dann weißt du Bescheid. Also braucht der Alarm nicht wiederholt zu werden. Wenn die Alarmzeit auf den Minimalwert gesetzt wird, kann sie niemals später als die aktuelle Zeit liegen. Damit verzichtet man auf eine zusätzliche Variable und Prüfung, ob der Alarm bereits gemeldet wurde; und du brauchst auch weiterhin nur einen Timer (siehe auch die Änderung mit der Alarmzeit bei 0 Sekunden).
conway96 hat folgendes geschrieben : |
4) warum "new"?
C#-Quelltext 1:
| alarm = new DateTime(date.Year, date.Month, date.Day, time.Hour, time.Minute, time.Second); |
warum "new"? |
Die Alarmzeit soll sich aus den genannten Bestandteilen zusammensetzen. Die einzelnen Bestandteile von DateTime sind read-only. Um einen der Werte zu ändern, muss eine vollständig neue Instanz erzeugt werden; und dazu dient eben new.
Und zur neuen Lösung:
1. In timer1_Tick stehen weiterhin die Bestandteile getrennt. Wozu eigentlich? Du willst doch nur die aktuelle Zeit anzeigen; dazu genügen doch eine oder zwei Zeilen - der ganze andere Kram kann entfallen.
2. In timer2_Tick werden die Strings übernommen. Du willst aber zwei Zeiten vergleichen, und das geht sinnvoll nur mit meinem Vorschlag: Die Eingabe muss nach dem Abschluss der Eingabe (also z.B. beim Verlassen der TextBox) in eine DateTime-Variable konvertiert werden; dieser Wert wird einfach verglichen - fertig (natürlich nicht auf Gleichheit, sondern auf >=). Wenn du zwei Zeiten vergleichen willst, nimm zwei Zeiten; wenn du zwei Strings vergleichen willst, dann nimm Strings usw.
Zitat: |
gibts dafür auch ne elegantere lösung? |
Siehe oben: Die Alarmzeit wird auf 0 Sekunden gesetzt und meldet sich damit beim ersten Aufruf des Sekunden-Timers.
Zitat: |
bei mir scheiterts an den grundlagen, |
Ich hoffe doch, du kümmerst dich darum, z.B. mit einem Buch oder wenigstens mit dem
OpenBook VC# [
http://openbook.galileocomputing.de/visual_csharp/].
Gruß Jürgen
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!