Autor Beitrag
conway96
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Di 02.03.10 20:07 
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).

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Di 02.03.10 21:56 
Danke!
conway96 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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

ausblenden 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:
ausblenden volle Höhe 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)
        {
            // Variablendeklaration
            System.DateTime zeit;
            int stunde, minute;
            System.DateTime datum;
            int tag, monat, jahr;

            // Auslesen der aktuellen Uhrzeitstruktur
            zeit = System.DateTime.Now;
            datum = System.DateTime.Now;

            // Ausgabe der Uhrzeit in der TextBox
            this.tbzeit.Text = zeit.ToShortTimeString();
            this.tbdatum.Text = datum.ToShortDateString();

            // Auslesen der aktuellen Uhrzeit
            stunde = zeit.Hour;
            minute = zeit.Minute;
            tag = datum.Day;
            monat = datum.Month;
            jahr = datum.Year;
            

            // if-Anweisungen
            if (tbdatum.Text == tbtermindatum.Text && tbzeit.Text == tbterminzeit);
            {
                MessageBox.Show("Alarm");
            }      
        }
    }
}
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: 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.
ausblenden 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.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
private void timer1_Tick(object sender, EventArgs e)
{
   tbCurrent.Text = DateTime.Now.ToString();  // ggf. mit Parameter "G" versehen
   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 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mi 03.03.10 13:52 
1) ist das jetzt das aktuelle datum in einer variable die date heißt?
ausblenden 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)
ausblenden 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?
ausblenden C#-Quelltext
1:
private DateTime alarm = DateTime.MinValue;					


4) warum "new"?
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mi 03.03.10 16:28 
hab jetzt ne andere lösung gefunden:

ausblenden volle Höhe 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)
        {
            // Variablendeklaration
            System.DateTime zeit;
            int stunde, minute;
            System.DateTime datum;
            int tag, monat, jahr;

            // Auslesen der aktuellen Uhrzeitstruktur
            zeit = System.DateTime.Now;
            datum = System.DateTime.Now;

            // Ausgabe der Uhrzeit in der TextBox
            this.tbzeit.Text = zeit.ToShortTimeString();
            this.tbdatum.Text = datum.ToShortDateString();

            // Auslesen der aktuellen Uhrzeit
            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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: Mi 03.03.10 17:08 
Zunächst zu deinen vorigen Fragen:
user profile iconconway96 hat folgendes geschrieben Zum zitierten Posting springen:
1) ist das jetzt das aktuelle datum in einer variable die date heißt?
ausblenden 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:
ausblenden 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.

user profile iconconway96 hat folgendes geschrieben Zum zitierten Posting springen:
2) wieso kann ich dann nicht auch den aktuellen termin in variablen schreiben? (das funktioniert nicht, habs versucht)
ausblenden 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.

user profile iconconway96 hat folgendes geschrieben Zum zitierten Posting springen:
3) warum muss ich alarm den kleinstmöglichen wert zuweisen?
ausblenden 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).

user profile iconconway96 hat folgendes geschrieben Zum zitierten Posting springen:
4) warum "new"?
ausblenden 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#.

Gruß Jürgen