Countdown stoppen zum richtigen Moment.

  • VB.NET

Es gibt 41 Antworten in diesem Thema. Der letzte Beitrag () ist von davut.

    @K4RTOFF3L: Bitte versteh das nicht als "Kindergartenkrieg", sein Code ist leider sehr schlecht, das wird irgentwann zu großen Problemen führen was er da macht (wenn es nicht schon so weit ist)
    ich will ihn ja auch nicht irgentwie beleidigen sondern helfen
    @kai996
    Ich kann dir nur zustimmen, achte aber darauf, dass du sachlich bleibst siehe: Untragbares Verhalten im Forum
    Aber das weißt du bestimmt selber.

    @K4RTOFF3L
    Die anderen haben Recht, du solltest auf keinen Fall den Code von Daniel Baumert verwenden (ist auch nicht schlimm, dass du ihn nicht verstehst).
    Sicher kannst du den Text eines Labels bearbeiten, jederzeit. Sei es direkt oder indirekt.

    Label1.Text = "abc"

    Und nun?!
    Dein Code prüft nicht einmal mehr, ob der Text des Labels eine Zahl ist oder nicht; du gehst einfach davon aus, dass da nur Zahlen drin stehen. Zudem sollten mit Controls nicht gerechnet werden; die GUI zeigt einfach nur Ergebnisse an, nichts weiter.
    das mag ja sein, ABER dieses denken wird dich früher oder später vor große Probleme stellen.
    ich geb dir mal ein anderes beispiel vll. versteht du es dann besser:
    du programmierst einen taschenrechner und möchtest das ergebniss in einer textbox ausgeben lassen
    als beispiel würdest du folgenden code verwenden:
    TextBox3.Text = TextBox1.Text - TextBox2.Text
    schön und gut (ok schön und gut ist es ja nicht) aber was machst du nun wenn ein buchstabe in einer der textboxen steht??? dann bekommst du eine fehlermeldung und fragt hier verzweifelt im forum nach und kommst nicht weiter nur weil du nicht Option Strict On benutzen willst, weil du scheinbar zu stolz dafür bist
    (tut mit leid ich will dich wirklich NICHT beleidigen)
    nein, man benutzt Integer.TryParse (bzw. in einem Taschenrechner ist der Datentyp Double sinnvoller), da brauchts auch keinen timer (wobei ich ehrlich gesagt nicht verstehe, wie du jetzt darauf kommst einen Timer zu verwenden)
    Hi

    VB.NET-Quellcode

    1. Dim d As Double 'Hier steht nach TryParse der Wert drin
    2. If Not Double.TryParse(TextBox1.Text, d) Then ' TryParse versucht, den Wert als Gleitkommazahl darzustellen und gibt zurück, ob der Wert korrekt ist (zum Beispiel 1,23 ist gueltig, 1,2,3 nicht).
    3. MessageBox.Show("Ungültige Eingabe.") 'Den Benutzer darauf aufmerksam machen, dass die Eingabe nicht dargestellt werden konnte
    4. Return 'Den Vorgang abbrechen
    5. End If
    6. result += d 'Wert weiterverwenden
    7. ErgebnisTextBox.Text = result.ToString() 'Ergebnis darstellen

    So zum Beispiel könnte das aussehen.
    Wichtig ist, dass es sich bei <Zahl> <Operator> <Zahl> für Rechnungen tatsächlich um Zahlen handelt. Jedem Typ ist eine gewisse Rolle, die er im Programm einnimmt zugewiesen. So sind Strings dazu da, Texte darzustellen und Zahlen zum Rechnen. D.h. wenn man den Inhalt zweier Texte addieren möchte, muss man erst eine Konvertierung zu einem Zahlentypen durchführen, darin dann rechnen und das Ergebnis wieder als Text darstellen. Nicht jeder Text ist aber als Zahl darstellbar, daher gibt's solche Funktionen, wie TryParse, die überprüfen, ob die Konvertierung funktioniert hat. Ansonsten würde das Programm seinen Verlauf abbrechen, wenn nicht der Fall behandelt wird, dass eine Ausnahme eintritt. Analog geht's für alle anderen Zahlentypen.
    *hat das Codebeispiel von SpaceyX übersehen*

    Gruß
    ~blaze~
    @Fibonacci
    Der Code von SpaceyX ist zu über 90% verstanden.
    Den Datentyp Integer verstehe ich nicht.

    Ich verstehe nicht wo das Programm meine Angrabe aus der TextBox1 in den Countdown einfügt.
    Wenn ich mich nicht täusche ist es folgende Stelle:

    VB.NET-Quellcode

    1. Integer.TryParse(TextBox1.Text, _countDown) Then
    2. Label1.Text = _countDown.ToString()

    und

    VB.NET-Quellcode

    1. _countDown -= 1
    2. Label1.Text = _countDown.ToString()
    Gruß K4RTOFF3L

    Das Problem zu erkennen ist wichtiger, als die Lösung zu erkennen, denn die genaue Darstellung des Problems führt zur Lösung. - Albert Einstein
    Daniel Baumert,
    vollkommen falscher Ansatz. Wie bereits schon in anderen Themen (von dir) wurde dir mehrfach Nahe gelegt, Events zu nutzen. Du musst diese Hilfestellungen aber auch nutzen, ansonsten ist es meiner Meinung nach schwachsinng, als Anfänger einem anderen Anfänger etwas beibringen zu wollen. Ein dreijähriges Kind kann ebenso wenig einem anderen dreijährigen Kind beibringen, wie es Fahrrad fahren kann. Das müssen schon die Eltern machen. Genau so ist es hier der Fall.
    Das, was SpaceyX geschrieben hat, ist der beste Ansatz; orientiere dich daran.


    K4RTOFF3L,
    da liegst du richtig; da werden deine Daten verarbeitet.

    Alle Datentypen sind einmal kurz und bündig hier zusammen gefasst: msdn.microsoft.com/de-de/library/47zceaw7%28v=vs.110%29.aspx

    Speziell dazu der Integer: msdn.microsoft.com/de-de/library/06bkb8w2.aspx

    [...] Ganzzahlen mit Vorzeichen, deren Werte sich im Bereich von -2.147.483.648 bis einschließlich 2.147.483.647 bewegen. [...]

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

    Ich habe jetzt den Code bearbeitet und stoße vor ein Problem.
    Ich möchte wenn "_countdown2" den Wert 0 erreicht und "_countdown1" noch lauft ,dass "_countdown2" sich wieder auf 60 setzt.
    Zu dem habe ich noch eine Frage, aber diese ist im Code integriert.

    VB.NET-Quellcode

    1. Public Class Form2
    2. Private WithEvents _t1 As New Timer With {.Interval = 60000}
    3. Private WithEvents _t2 As New Timer With {.Interval = 1000}
    4. Private _countDown1 As Integer = 5
    5. Private _countDown2 As Integer = 0
    6. Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
    7. Label1.Text = _countDown1.ToString() 'Ist diese Zeile nötig? In _t1 und _t2 wird es doch ebenfalls verändert.'
    8. Label2.Text = _countDown2.ToString() 'Ist diese Zeile nötig? In _t1 und _t2 wird es doch ebenfalls verändert.'
    9. _t1.Start()
    10. _t2.Start()
    11. End Sub
    12. Private Sub _t1_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles _t1.Tick
    13. _countDown1 -= 1
    14. Label1.Text = _countDown1.ToString()
    15. If _countDown1 = 0 Then
    16. _t1.Enabled = False
    17. MessageBox.Show("Zeit abgelaufen")
    18. End If
    19. End Sub
    20. Private Sub _t2_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles _t2.Tick
    21. _countDown2 -= 1
    22. Label2.Text = _countDown2.ToString()
    23. If _countDown1 >= -1 Then
    24. 'Hier müsste eig. _countdown2 wieder auf 60 gesetzt werden.'
    25. End If
    26. End Sub
    27. End Class
    Gruß K4RTOFF3L

    Das Problem zu erkennen ist wichtiger, als die Lösung zu erkennen, denn die genaue Darstellung des Problems führt zur Lösung. - Albert Einstein
    Ah. -,- Mist ich habe es Falsch verstanden. Danke dir noch mal für deine Hilfe. Ich schreibe das Script jetzt mal zu ende.

    So Leute. Mein Script ist fertig. Ich möchte nun erst mal allen Personen, die mir geholfen haben, danken. Egal ob mit dem Script oder Allgemeinen Tipps.
    Ich habe dank euch jetzt richtig Spaß an VB bekommen.
    Ich denke wir werden uns in Zukunft noch mehrmals im Forum lesen können.

    Hier ein Mal das fertige Script :

    VB.NET-Quellcode

    1. Public Class Form2
    2. Private WithEvents _t1 As New Timer With {.Interval = 60000}
    3. Private WithEvents _t2 As New Timer With {.Interval = 1000}
    4. Private _countDown1 As Integer = 1
    5. Private _countDown2 As Integer = 59
    6. Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
    7. If _countDown1 = 0 And _countDown2 = 0 Then
    8. _countDown1 = 1
    9. _countDown2 = 59
    10. Label1.Text = _countDown1.ToString()
    11. Label2.Text = _countDown2.ToString()
    12. _t1.Start()
    13. _t2.Start()
    14. Else
    15. Label1.Text = _countDown1.ToString()
    16. Label2.Text = _countDown2.ToString()
    17. _t1.Start()
    18. _t2.Start()
    19. End If
    20. End Sub
    21. Private Sub _t1_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles _t1.Tick
    22. _countDown1 -= 1
    23. Label1.Text = _countDown1.ToString()
    24. If _countDown1 = 0 Then
    25. _t1.Enabled = False
    26. End If
    27. End Sub
    28. Private Sub _t2_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles _t2.Tick
    29. _countDown2 -= 1
    30. Label2.Text = _countDown2.ToString()
    31. If _countDown1 = 0 And _countDown2 = 0 Then
    32. _t2.Enabled = False
    33. End If
    34. If _countDown1 >= -1 Then
    35. If _countDown2 = 0 Then
    36. _countDown2 = 59
    37. End If
    38. End If
    39. End Sub
    40. End Class


    Edit by der_Kurt:
    Bitte keine Doppelposts nach so kurzer Zeit. Verwende dafür den "Bearbeiten"-Button.
    Beiträge zusammengefügt
    Gruß K4RTOFF3L

    Das Problem zu erkennen ist wichtiger, als die Lösung zu erkennen, denn die genaue Darstellung des Problems führt zur Lösung. - Albert Einstein

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „der_Kurt“ ()

    Funktioniert prinzipiell, beim Umspringen von einer Minute auf null Minuten hakt es etwas, und die 59 Sekunden stehen auch nicht lange dort.
    Schau mal, ob du dich mit diesem Code auskennst. (1 Timer weniger, dafür das STOPWATCH-Objekt.)

    VB.NET-Quellcode

    1. Public Class Form2
    2. Private WithEvents _t2 As New Timer With {.Interval = 1000}
    3. Private zeit As TimeSpan = TimeSpan.FromSeconds(120)
    4. Private countdown As TimeSpan
    5. Private watch As New Stopwatch
    6. Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
    7. _t2.Start()
    8. watch.Start()
    9. End Sub
    10. Private Sub _t2_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles _t2.Tick
    11. countdown = zeit - watch.Elapsed
    12. Label1.Text = countdown.Minutes
    13. Label2.Text = countdown.Seconds
    14. End Sub
    15. End Class
    An sich verstehe ich deinen Code nur folgende stelle ist mir Unklar:

    VB.NET-Quellcode

    1. Label1.Text = countdown.Minutes
    2. Label2.Text = countdown.Seconds

    Wie kommst du auf countdown.Minutes und countdown.Secondes
    Gruß K4RTOFF3L

    Das Problem zu erkennen ist wichtiger, als die Lösung zu erkennen, denn die genaue Darstellung des Problems führt zur Lösung. - Albert Einstein