Countdown

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von Eisvogel.

    Hy,
    ich will einen Countdown programmieren wo man sec,min,h eingeben kann. Bisher hatte ich nur eine TextBox, in der man eine bestimmte Zeit (in sec) eingeben konnte, diese wurde dann beim Start in ein Label verschoben und runtergezählt bis 0.

    Quellcode

    1. 'Befehl für den "Start" Button
    2. CoundtownZähler.Text = Countdown.Text
    3. Timer2.Enabled = "True"
    4. 'Befehl für den Timer der jeder sec 1x Tickt
    5. CoundtownZähler.Text = CountdownZähler.Text -1


    Nun will ich ja "00:00:00" haben. Da funktioniert es nicht mehr so einfach mit -1. Außerdem gibt es die kleine Schwierigkeit, dass nach 00:01:00 -> 00:00:59 kommt.
    Einfach mal suchen:

    Hier gibts was
    wintoolz.de
    • wintoolz.KeyLocker - Programm zum sicheren Verwalten von Passwörten
    • wintoolz.CodeGallery - Datenbank für Codebeispiele veschiedener Programmiersprachen
    • wintoolz.Haushaltsbuch - Dient zum Auflisten der Aktivitäten ihrer Bankkonten

    Benutze auch du Ecosia
    Dabei gibts doch nicht viel zu erklären.
    Das ist eine If-Abfrage im Timer bei der gefragt wird, ob die Zeit abgelaufen ist.
    Ja-> eine Nachricht ausgeben
    Nein-> Die abgelaufen Zeit im Label anzeigen
    wintoolz.de
    • wintoolz.KeyLocker - Programm zum sicheren Verwalten von Passwörten
    • wintoolz.CodeGallery - Datenbank für Codebeispiele veschiedener Programmiersprachen
    • wintoolz.Haushaltsbuch - Dient zum Auflisten der Aktivitäten ihrer Bankkonten

    Benutze auch du Ecosia
    So habe ich bisher meine Codes geschrieben:
    (so verstehe ich am besten was passiert ;))

    Quellcode

    1. Private Sub Label3_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles CoundtownZähler.TextChanged
    2. 'Wenn Countdown abgelaufen, dann ...
    3. If CoundtownZähler.Text = "0" Then
    4. 'Countdown Zähler zurücksetzen
    5. Timer2.Enabled = "False"
    6. CoundtownZähler.Text = ""
    7. 'Alarm starten
    8. Alarm()
    9. End If
    10. End Sub
    11. Private Sub CountdownStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StartCoundtown.Click
    12. 'Setzt "Error" zurück
    13. ErrorProvider1.Clear()
    14. 'Wenn kein Countdown oder kleiner 1 eingegeben ist, dann ...
    15. If Countdown.Text <= Nothing & 0 Then
    16. 'Zeigt einen "Error"
    17. ErrorProvider1.SetError(Label1, "Bitte geben sie einen Wert größer 0 ein")
    18. 'Ansonsten Countdown starten
    19. Else : CoundtownZähler.Text = Countdown.Text
    20. Timer2.Enabled = "True"
    21. End If
    22. End Sub
    23. Private Sub CountdownStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StopCountdown.Click
    24. 'Stoppt den Countdown
    25. Timer2.Enabled = "False"
    26. CoundtownZähler.Text = ""
    27. 'Stop Wiedergabe
    28. StopAlarm()
    29. End Sub
    30. Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
    31. 'Zählt jede Runde -1
    32. CoundtownZähler.Text = CoundtownZähler.Text - 1
    33. End Sub
    So... Sry dass es so lange gedauert hat. Aber hiermiet sollte es funktionieren! Ich habe noch 2 weitere Textboxen für Stunden und Minuten eingebaut und dann auch 2 weitere Labels (auch Stunden und Minuten)
    Wegen den ":" habe ich noch die "Tags" verwendet, die dann die Zahl OHNE ":" enthalten und somit zum Rechnen geeignet sind.

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
    2. CountdownZähler3.Tag = CountdownZähler3.Tag - 1
    3. CountdownZähler3.Text = CountdownZähler3.Tag
    4. If CountdownZähler3.Tag < 0 Then
    5. CountdownZähler2.Tag = CountdownZähler2.Tag - 1
    6. CountdownZähler2.Text = CountdownZähler2.Tag & " :"
    7. If CountdownZähler2.Tag < 0 Then
    8. CountdownZähler1.Tag = CountdownZähler1.Tag - 1
    9. CountdownZähler1.Text = CountdownZähler1.Tag & " :"
    10. If CountdownZähler1.Tag < 0 Then
    11. Timer2.Enabled = False
    12. CountdownZähler1.Text = 0
    13. CountdownZähler2.Text = 0
    14. CountdownZähler3.Text = 0
    15. MsgBox("Timer abgelaufen!")
    16. Else
    17. CountdownZähler2.Text = "59 :"
    18. CountdownZähler3.Text = "59"
    19. CountdownZähler2.Tag = 59
    20. CountdownZähler3.Tag = 59
    21. End If
    22. Else
    23. CountdownZähler3.Text = "59"
    24. CountdownZähler3.Tag = 59
    25. End If
    26. End If
    27. End Sub
    28. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    29. CountdownZähler1.Text = Countdown1.Text & " :"
    30. CountdownZähler2.Text = Countdown2.Text & " :"
    31. CountdownZähler3.Text = Countdown3.Text
    32. CountdownZähler1.Tag = Countdown1.Text
    33. CountdownZähler2.Tag = Countdown2.Text
    34. CountdownZähler3.Tag = Countdown3.Text
    35. Timer2.Enabled = "True"
    36. End Sub

    Ich weis, das ganze geht auch anders/kompakter... ist halt Low-Version. Funtzt aber ^^
    @Eisvogel:
    Soso, und das ist besser als der Code im meinem Link. Dann mal viel Spaß :D
    wintoolz.de
    • wintoolz.KeyLocker - Programm zum sicheren Verwalten von Passwörten
    • wintoolz.CodeGallery - Datenbank für Codebeispiele veschiedener Programmiersprachen
    • wintoolz.Haushaltsbuch - Dient zum Auflisten der Aktivitäten ihrer Bankkonten

    Benutze auch du Ecosia
    Vielen Dank,
    die Funktion hab ich jetz verstanden :)
    Jetz fehlt nurnoch die kleine Veränderung, dass es nicht mehr 3 TextBoxen und 3Labels gibt sondern nurnoch eine mit 00:00:00 :)
    Wenn du jetz keine lsut mehr hast, kann ich verstehen ;)
    Wenn mir jemand sagt wie ich die einzelnen "00" aus der TextBox auslesen kann, dann werd ich auch selber mal mein glück versuchen :)
    Da musst du dem Link folgen :D
    Das war jetzt halt die billige Variante... das geht halt nur mit 3 Boxen und 3 Labels...
    Die Funktion die mit einem Label und einer textbox funtzt ist die in dem link. Da wird die EIngabe aus der TextBox dann gesplittet und dem Timer übergeben... usw usw
    Dann schau halt morgen hier nochmal vorbei, vieleicht habe ich dir dann hier den Quellcode MIT Beschreibung (wofür was zuständig ist) gepostet, damit das erfüllt ist: "ich will ja auch etwas dabei lernen" ;)
    So,

    ich habe dir jetzt den kompletten Code MIT Beschreibung geschrieben. Den Code kopierst du in den Quellcode deiner WindowsForm (alten Code von TimerTick- und ButtonClick-Sub rauslöschen) und dann brauch deine WindowsForm folgende Elemente:

    Label1
    TextBox1
    Button1
    Timer1

    (die Namen kannste dann im [Etwurf] unter Eigenschaften wieder in deine Namen ändern, dann werden die automatisch im Quellcode angepasst)

    VB.NET-Quellcode

    1. Private alarmZeit As Date
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. Dim EingabeZeit, GesamtMinuten, GesmatSekunden As String
    4. Dim Zeit() As String
    5. EingabeZeit = TextBox1.Text
    6. 'Der eingegebene Text aus "TextBox1" wird durch das Zeichen ":" getrennt
    7. 'Also: Der Text vor dem ersten ":" wird in "Zeit(0)" gespeichert,
    8. 'der Text nach dem zweiten ":" in "Zeit(1)" usw.
    9. Zeit = EingabeZeit.Split(":")
    10. 'Hier rechne ich die eingegebenen Stunden "Zeit(0)" in Minuten um und addiere sie zu
    11. 'den eingegebenen Minuten "Zeit(1)"
    12. 'dann alle Minuten in Sekunden (das mache ich damit der *naechste Schritt* funtzt)
    13. GesamtMinuten = Zeit(0) * 60 + Zeit(1)
    14. GesmatSekunden = GesamtMinuten * 60 + Zeit(2)
    15. '*naechste Schritt*
    16. 'Zur aktuellen Systemzeit werden die "GesamtSekunden" addiert.
    17. '(die werden dann automatisch wieder auf Minuten und Stunden hochgerechnet)
    18. alarmZeit = Date.Now.AddSeconds(GesmatSekunden)
    19. Label1.Text = Zeit(0) & ":" & Zeit(1) & ":" & Zeit(2) - 1
    20. Me.Timer1.Start()
    21. End Sub
    22. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    23. 'Wenn "alarmTime" kleiner als die jetzige Systemzeit ist
    24. '(die Systemzeit ist bei der alarmTime-Zeit angekommen)
    25. 'dann wird der Timer gestoppt und die MsgBox erscheint.
    26. If alarmZeit < Date.Now Then
    27. Me.Timer1.Stop()
    28. MessageBox.Show("Zeit ist abgelaufen!")
    29. Else
    30. 'hier substrahiere ich die aktuelle Systemzeit von "alarmZeit" um die
    31. 'restliche Zeit zu ermitteln (Damit "Label1" aktuaisiert werden kann)
    32. Dim restlicheZeit As TimeSpan = Me.alarmZeit.Subtract(Date.Now)
    33. Me.Label1.Text = String.Format("{0}:{1:d2}:{2:d2}", restlicheZeit.Hours, restlicheZeit.Minutes, restlicheZeit.Seconds)
    34. End If
    35. End Sub


    Ich hoffe das ist alles verständich beschrieben , ansonsten: Nachfragen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „MA-Maddin“ ()

    Ich habs zwar nicht getestet, aber wie du oben schon gesagt hast, geht es einfacher und schneller.
    Trotzdem gut, das du dir wenigstens die Arbeit gemacht hast, auch wenn du einige Codeteile kopiert hast...
    wintoolz.de
    • wintoolz.KeyLocker - Programm zum sicheren Verwalten von Passwörten
    • wintoolz.CodeGallery - Datenbank für Codebeispiele veschiedener Programmiersprachen
    • wintoolz.Haushaltsbuch - Dient zum Auflisten der Aktivitäten ihrer Bankkonten

    Benutze auch du Ecosia