zwei Timer in einen ...

  • VB.NET

SSL ist deaktiviert! Aktivieren Sie SSL für diese Sitzung, um eine sichere Verbindung herzustellen.

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    zwei Timer in einen ...

    Komme mal wieder einfach nicht weiter:

    ich möchte das Oben quasi solch eine anzeige läuft:

    am anfang so, mit 10 Sek, wartezeit:



    dann wechselt alles und zählt neu 5 sek:



    VB.NET-Quellcode

    1. Private RestlicheZeit As TimeSpan
    2. Private Sub Set_StichtagTimers()
    3. TimerStichTag1.Interval = New TimeSpan(0, 0, 5).TotalMilliseconds
    4. TimerWaitForStichtag.Interval = New TimeSpan(0, 0, 10).TotalMilliseconds
    5. RestlicheZeit -= New TimeSpan(0, 0, 1)
    6. Label2.Text = RestlicheZeit.ToString()
    7. AddHandler TimerStichTag1.Tick, AddressOf TimerStichTag1_Tick
    8. AddHandler TimerWaitForStichtag.Tick, AddressOf TimerWaitForStichtag_Tick
    9. Label1.Text = "Zeit bis zum nächsten Stichtag: "
    10. TimerStichTag1.Start()
    11. End Sub
    12. Private Sub TimerStichTag1_Tick(sender As Object, e As EventArgs) Handles TimerStichTag1.Tick
    13. Set_StichtagTimers()
    14. TimerStichTag1.Stop()
    15. TimerWaitForStichtag.Start()
    16. Label1.Text = "Stichtag! Es wird jetzt eine Minute abgerechnet. "
    17. End Sub
    18. Private Sub TimerWaitForStichtag_Tick(sender As Object, e As EventArgs) Handles TimerWaitForStichtag.Tick
    19. Set_StichtagTimers()
    20. TimerWaitForStichtag.Stop()
    21. TimerStichTag1.Start()
    22. End Sub
    23. Private Sub Spiel_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    24. Set_StichtagTimers()
    25. End Sub


    Mit
    Label1 funktioniert alles die Texte wechseln, dass eine nach 5, dass
    andere nach 10 sek ... aber mit Label2 funktioniert das leider nicht, er
    Zählt die Zeit nicht runter. Bei beginn zeigt er 5 sek lang 00:00:00
    danach -00:00:05 usw....
    Keine Ahnung was du da machst oder vor hast. Aber evtl. Hilft dir die StopWatch Klasse ja dabei... So als Idee, keine Ahnung obs hilft :)
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Hm ich weiß nicht wenn ich das so lese denke ich das sie nicht so ganz das ist was ich suche bzw. erreichen will.

    Also ich ich hab ein Label links mit Text "zeit bis zum nächsten Stichtag"... dann rechts daneben ein Label mit "dem Countdown" der Countdown soll 10 Sek laufen bis auf 0, dann soll sich das linke Label ändern in "Stichtag" und das daneben wieder anfangen zu zählen, aber diesmal 5 Sek. dann das ganze von vorn beginnen. Als endlosschleife.....
    Hier ist eine Demo mit einem Timer:

    VB.NET-Quellcode

    1. Public Class MainForm
    2. Private _random As New Random
    3. Private _deadline As DateTime
    4. Private _changeCounter As Integer = 0
    5. Private _showCountdown As Boolean = True
    6. Private _countdown As TimeSpan = _deadline.Subtract(Now)
    7. Private Sub MainForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    8. Me.CountdownTimer.Interval = 1000
    9. Me.CountdownTimer.Enabled = True
    10. _deadline = Now.AddDays(_random.Next(0, 365)).
    11. AddHours(_random.Next(0, 60)).
    12. AddMinutes(_random.Next(0, 60)).
    13. AddSeconds(_random.Next(0, 60))
    14. End Sub
    15. Private Sub CountdownTimer_Tick(sender As Object, e As EventArgs) Handles CountdownTimer.Tick
    16. _changeCounter -= 1
    17. If _changeCounter <= 0 Then
    18. _changeCounter = 10
    19. _showCountdown = Not _showCountdown
    20. End If
    21. Me.CountdownLabel.Text = $"Anzeige ändern in {_changeCounter} Sekunde(n)."
    22. _countdown = _deadline.Subtract(Now)
    23. If _showCountdown Then
    24. Me.DeadlineLabel.Text = $"Zeit bis zum Stichtag: {_countdown.Days} Tag(e), {_countdown.Hours} Stunde(n), {_countdown.Minutes} Minute(n) und {_countdown.Seconds} Sekunde(n)"
    25. Else
    26. Me.DeadlineLabel.Text = $"Stichtag: {_deadline.ToString("dd.MM.yyyy - HH:mm:ss")}"
    27. End If
    28. End Sub
    29. End Class
    Danke für deine Antwort...

    wenn ich ihn umbaue dann läuft der Counter wieder so. Der Text wechselt jetzt nach 5 sek statt 5 sek der eine und 10 sek der andere. Der counter beginnt immer bei 5 sek.

    Wo ist da der fehler ?(

    VB.NET-Quellcode

    1. Private _random As New Random
    2. Private _deadline As DateTime
    3. Private _Counter As Integer = 0
    4. Private _showCountdown As Boolean = True
    5. Private _showCounter As Boolean = True
    6. Private _countdown As TimeSpan = _deadline.Subtract(Now)
    7. Private Sub MainForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    8. Me.Timer1.Interval = 1000
    9. Me.Timer1.Enabled = True
    10. _deadline = Now.AddDays(_random.Next(0, 365)).
    11. AddHours(_random.Next(0, 60)).
    12. AddMinutes(_random.Next(0, 60)).
    13. AddSeconds(_random.Next(0, 60))
    14. End Sub
    15. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    16. _Counter -= 1
    17. If _Counter <= 0 Then
    18. _Counter = 5
    19. _showCountdown = Not _showCountdown
    20. ElseIf _Counter <= 0 Then
    21. _Counter = 10
    22. _showCountdown = Not _showCountdown
    23. End If
    24. Me.Label2.Text = $"{_Counter} Sekunde(n)."
    25. If _showCountdown Then
    26. Me.Label1.Text = $"Zeit bis zum Stichtag: "
    27. Else
    28. Me.Label1.Text = $"Stichtag: "
    29. End If
    30. End Sub


    Oder könnte man da eine Case abfrage starten?

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VBHunter“ ()

    Neu

    Kannst Du bitte nochmal beschreiben, was Du vorhast?

    VB.NET-Quellcode

    1. _deadline = Now.AddDays(_random.Next(0, 365)).
    2. AddHours(_random.Next(0, 60)). '<- Warum 60? Nicht besser 24?
    3. AddMinutes(_random.Next(0, 60)).
    4. AddSeconds(_random.Next(0, 60))


    VB.NET-Quellcode

    1. If _Counter <= 0 Then
    2. _Counter = 5
    3. _showCountdown = Not _showCountdown
    4. ElseIf _Counter <= 0 Then
    5. _Counter = 10
    6. _showCountdown = Not _showCountdown
    7. End If

    Das ist doch Hunz. Der ElseIf-Zweig wird nie erreicht, da identisch mit der 1. Bedingung. Du müsstest da schon Dein _showCountdown mit einbauen:

    VB.NET-Quellcode

    1. If _Counter <= 0 Then
    2. _Counter = If(showCountdown, 5, 10)
    3. _showCountdown = Not _showCountdown
    4. End If
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von VaporiZed, mal wieder aus Grammatikgründen.

    ― Eine häufig von mir verwendete Abkürzung: CEs = control elements (Labels, Buttons, DGVs, ...)
    ― If Not GrammarIsOk() Then AssumeThatCodeIsOk = False
    ― »Oh, großes Spaghetticodemonster. Bitte schicke mir Durchblick! Oder zumindest eine Gabel. Oder – wenn es kein Besteck mehr gibt – zumindest Glasnudeln.«

    Neu

    Super genau das wollte ich.....

    Label eins zeit zu beginn Zeit bis zum Stichtag .... daneben läuft der Counter runter 10 Sek. dann ist Stichtag und der Counter zählt 5 sek runter und startet danach von vorn Zeit bis zum Stichtag ... 10 Sek usw.

    dein letztes beispiel funktioniert genau so wie ich es wollte :thumbsup: Danke für deine Hilfe....

    Wenn ich aber jetzt das einzeigen lassen will im format 00:00:00 statt 10,9,8,... dann muss ich ein TimeSpan machen mit Counterergebnis oder so?

    wenn ich es so angebe geht das leider auch nicht... Versucht habe ich es auch als TimeSpan aber da Steht die ganze zeit 00:00:00 aber im hintergrund läuft er weiter unf führt die Labelaktion durch.

    VB.NET-Quellcode

    1. 'Verusuch ohne Timespan
    2. Me.Label2.Text = _Counter.ToString("hh\:mm\:ss")

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VBHunter“ ()

    Neu

    VBHunter schrieb:

    Wenn ich aber jetzt das einzeigen lassen will im format 00:00:00 statt 10,9,8,... dann muss ich ein TimeSpan machen mit Counterergebnis oder so?
    Mit oder so ist schlecht.
    Überleg dir genau, was du machen willst, und frage das.

    Etwa eine sinnvolle Frage wäre: "Wie erstelle ich aus dem Counter-Ergebnis einen Timespan?"
    Weil mittm Darstellen eines Timespans liegst du nicht so verkehrt - aber das funzt natürlich nur mit Timespans, und _Counter ist wohl keiner.

    Aber bereite dich gleich auf meine Gegenfrage vor: Was ist ein "Counter-Ergebnis" - hat das einen Datentyp und wenn ja welchen?

    Neu

    Sorry da habe ich mir meine Frage nicht mehr ganz durchgelesen X/

    Ich meinte, ob ich das nur als TimeSpan machen kann, oder ob ich es auch hinter mein Labeltext: Me.Label2.Text = _Counter.ToString("hh\:mm\:ss") machen kann?

    wenn ich es so mache Me.Label2.Text = _Counter.ToString("hh\:mm\:ss") zeigt er mir nur hh:mm:ss an statt 00:00:00....

    Ich denke mal ich muss Ihn noch sagen was HH:MM:SS ist oder ?

    EDIT:
    Habs jetzt soweit hinbekommen... Danke @all

    So sieht es jetzt aus

    VB.NET-Quellcode

    1. Private _Counter As Integer = 0
    2. Private _showCountdown As Boolean = True
    3. Private Sub MainForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. Me.Timer1.Interval = 1000
    5. Me.Timer1.Enabled = True
    6. End Sub
    7. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    8. Dim ots As TimeSpan = New TimeSpan(0, 0, _Counter)
    9. Dim str As String = String.Format("{0:00}:{1:00}:{2:00}", ots.Hours, ots.Minutes, ots.Seconds)
    10. _Counter -= 1
    11. If _Counter <= -1 Then
    12. _Counter = If(_showCountdown, 5, 10)
    13. _showCountdown = Not _showCountdown
    14. End If
    15. Me.Label2.Text = oTs.ToString()
    16. If _showCountdown Then
    17. Me.Label1.Text = $"Zeit bis zum Stichtag: "
    18. Else
    19. Me.Label1.Text = $"Stichtag: "
    20. End If
    21. End Sub

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VBHunter“ ()

    Neu

    jo, und nun probiernochma was du in post#7 schon angedacht hattest:

    VB.NET-Quellcode

    1. Dim ots As TimeSpan = New TimeSpan(0, 0, _Counter)
    2. Dim str As String = ots.ToString("hh\:mm\:ss")
    Für mich etwas unbefriedigend ist, dass ich noch immer nicht weiß, ob du meine Frage "Welchen Datentyp hat _Counter?" ühaupt beantworten könntest - da haste dich jetzt drumrum-gemogelt. ;)