VB 2008 Timer mit ProgressBar

S

spamferkel

Hallo,
ich bin in VB ein Newbie und habe folgenes Problem mit Visual Basic 2008:
Ich möchte ein Programm schreiben, welches eine Art Timer ist. Es soll in Stunden, Minuten und Sekunden runterzählen. Außerdem soll nebenbei auch noch eine ProgressBar laufen, welche den aktuellen Status anzeigt.
Kleine Teil davon habe ich schon, aber zusammen funktioniert es nicht und ich bekomme es auch nicht hin, dass die Zeit in Minuten und Stunden aufgeteilt wird: Also, dass wenn ich 0 Sekunden habe das Sekundenfeld auf 59 gesetzt wird und das im Minutenfeld auch eins abgezogen wird. usw!

Wäre echt nett wenn mir da jemand was erklären könnte oder einen Link zu einem guten Tutorial schicken könnte!

mfg.
spamferkel

P.S.:Bei google habe ich nichts gefunden!
 
Hallo allerseits,

zwar ist dieser Thread schon "eine Zeit lang" ohne Aktivität, wollte aber kein Neuen erstellen, da sich meine Frage (und meine Erfahrung[Newbie]) mit der von spamferkel ähnelt.
In VBTuturials auf youtube und in verschiedenen Foren bin ich zwar fündig geworden, jedoch sind die angewandten Methoden so unterschiedlich, dass es mir schwer fällt, einzelne Objekte zu verknüpfen.
Bisher habe ich zwei Möglichkeiten gefunden:


Wünschenswertes Resultat:
-Ein Countdown, der eine manuell eingegebene Zeit (HH:MM) herunterzählt (Ausgabe in einem Label[HH:MM:SS] sowie einer ProgressBar)

1.Ausgangssituation:
- 2 NumericUpDown, 3 Label, 2 Button, 1 ProgressBar, 1 Timer
Probleme:
- Zeitausgabe läuft nicht korrekt (Eingabe: 1h 0min - Ausgabe: -1:59:59 // Eingabe: 0h 1min - Ausgabe: -1:59:59)
- Programmierung der ProgressBar
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
Public Class Form1

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If LabelSekunden.Text = 0 Then
LabelSekunden.Text = 59
LabelMinuten.Text -= 1
End If
If LabelMinuten.Text = 0 Then
LabelMinuten.Text = 59
LabelStunden.Text -= 1
End If
LabelSekunden.Text -= 1
If LabelSekunden.Text = "0" And LabelMinuten.Text = "0" And LabelStunden.Text = "0" Then
Timer1.Stop()
LabelSekunden.Text = "00"
LabelMinuten.Text = "00"
LabelStunden.Text = "00"
End If
If LabelSekunden.Text = 0 Then
MsgBox("...")
My.Computer.Audio.Play("C:\WINDOWS\Media\tada.wav")
End If
End Sub

Private Sub ButtonStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonStart.Click
Timer1.Interval = 1000
LabelMinuten.Text = NumericUpDownMinuten.Value
LabelStunden.Text = NumericUpDownStunden.Value
Timer1.Enabled = True
Timer1.Start()
End Sub

Private Sub ButtonStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonStop.Click
Timer1.Stop()
End Sub

End Class
----------------------------------------------------------------------------------------------------------------------------------------------------------------------


2. Ausgangssituation(Quelle: http://www.tutorials.de/forum/net-cafe/295294-vb-net-countdown.html )
- 1 Textbox, 1 Label, 2 Button, 1 ProgressBar, 1 Timer
Probleme:
- Auslesen der Stunden bzw Minuten (bei einer Eingabe von "HHMM" etc. - es wäre umständlich in Sekunden
umzurechnen) und die entsprechende Programmierung des Timers/ der ProgressBar
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
Public Class Form1

Private Sub ButtonStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonStart.Click
LabelSekunden.Text = TextBox1.Text
ProgressBar1.Value = 0
ProgressBar1.Maximum = CType(TextBox1.Text, Integer)
Timer1.Start()
End Sub

Private Sub ButtonStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonStop.Click
Timer1.Stop()
End Sub

Private Sub Form1_Load(ByRef sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Timer1.Interval = 1000
End Sub

Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Dim N As Integer = CType(LabelSekunden.Text, Integer)
LabelSekunden.Text = CType(N - 1, String)
ProgressBar1.Value = ProgressBar1.Value + 1
If N = 1 Then
Timer1.Stop()
My.Computer.Audio.Play("C:\WINDOWS\Media\tada.wav")
End If
End Sub

End Class
----------------------------------------------------------------------------------------------------------------------------------------------------------------------

MfG
Michael

PS: Bin für jede Lösung oder jeden Verbesserungsvorschlag dankbar.
 
Eine auf die Schnelle auf die Beine gestellte Möglichkeit wäre zum Beispiel folgendermassen (mit einer progressbar, die als Maximum 500 und als Minimum 0 hat.
C#:
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private TimeSpan CurrentTimeLeft;
        private DateTime LastUpdate;
        private double TotalMilliseconds;

        private void button1_Click(object sender, EventArgs e)
        {
            numericUpDown1.Enabled = false;
            numericUpDown2.Enabled = false;
            button1.Enabled = false;
            CurrentTimeLeft = new TimeSpan(0, (int)numericUpDown1.Value, (int)numericUpDown2.Value, 0, 0);
            TotalMilliseconds = CurrentTimeLeft.TotalMilliseconds;
            label2.Text = CurrentTimeLeft.Hours.ToString("D2");
            label3.Text = CurrentTimeLeft.Minutes.ToString("D2");
            label4.Text = CurrentTimeLeft.Seconds.ToString("D2");
            LastUpdate = DateTime.Now;
            timer1.Start();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            TimeSpan diff = DateTime.Now - LastUpdate;
            CurrentTimeLeft -= diff;
            if (CurrentTimeLeft.TotalSeconds < 1.0)
            {
                numericUpDown1.Enabled = true;
                numericUpDown2.Enabled = true;
                button1.Enabled = true;
                label2.Text = "";
                label3.Text = "";
                label4.Text = "";
                timer1.Stop();
                return;
            }
            double totMsLeft = CurrentTimeLeft.TotalMilliseconds;
            double pct = totMsLeft / TotalMilliseconds;
            int value = (int)Math.Min(Math.Floor(pct * 500), 500.0);
            progressBar1.Value = 500 - value;
            LastUpdate = DateTime.Now;
            label2.Text = CurrentTimeLeft.Hours.ToString("D2");
            label3.Text = CurrentTimeLeft.Minutes.ToString("D2");
            label4.Text = CurrentTimeLeft.Seconds.ToString("D2");
        }
    }
 
Recht herzlichen Dank für die schnelle Antwort.

Bei dieser dritten Möglichkeit mit C# funktioniert die Timerfunktion nicht - jedenfalls bei mir nicht. Könnte ein Gedankenfehler von mir sein:

Eingefügt:
2 NummericUpDown, 3 Label, 1 ProgressBar, 1 Timer, 1 Button

In dem original Code Label 2-4 auf 1-3 gesetzt.
-------------------------------------------------------------------------------------------------------------------------------------------------
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 WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private TimeSpan CurrentTimeLeft;
private DateTime LastUpdate;
private double TotalMilliseconds;

private void button1_Click(object sender, EventArgs e)
{
numericUpDown1.Enabled = false;
numericUpDown2.Enabled = false;
button1.Enabled = false;
CurrentTimeLeft = new TimeSpan(0, (int)numericUpDown1.Value, (int)numericUpDown2.Value, 0, 0);
TotalMilliseconds = CurrentTimeLeft.TotalMilliseconds;
label1.Text = CurrentTimeLeft.Hours.ToString("D2");
label2.Text = CurrentTimeLeft.Minutes.ToString("D2");
label3.Text = CurrentTimeLeft.Seconds.ToString("D2");
LastUpdate = DateTime.Now;
timer1.Start();
}

private void timer1_Tick_1(object sender, EventArgs e)
{
TimeSpan diff = DateTime.Now - LastUpdate;
CurrentTimeLeft -= diff;
if (CurrentTimeLeft.TotalSeconds < 1.0)
{
numericUpDown1.Enabled = true;
numericUpDown2.Enabled = true;
button1.Enabled = true;
label1.Text = "";
label2.Text = "";
label3.Text = "";
timer1.Stop();
return;
}
double totMsLeft = CurrentTimeLeft.TotalMilliseconds;
double pct = totMsLeft / TotalMilliseconds;
int value = (int)Math.Min(Math.Floor(pct * 500), 500.0);
progressBar1.Value = 500 - value;
LastUpdate = DateTime.Now;
label1.Text = CurrentTimeLeft.Hours.ToString("D2");
label2.Text = CurrentTimeLeft.Minutes.ToString("D2");
label3.Text = CurrentTimeLeft.Seconds.ToString("D2");
}
}
}
-------------------------------------------------------------------------------------------------------------------------------------------------
 
Was daran funktioniert nicht? Wie manifestiert sich der Fehler? (Für Code kannst du [code=csharp][/code] verwenden)
 
Also Fehler werden weder im Code noch beim Debugging angezeigt.
Beim Klick auf Button1 startet anscheinend der Timer nicht oder die Verbindung zu den Labels ist fehlerhaft etc.. Jedenfalls verändern sich die ProgressBar und die Labels nicht bzw der angezeigte Wert.
 
Dann hast du wohl deinem Button kein OnClick-Event mit der button1_click-Funktion als delegat hinzugefügt.
 

Neue Beiträge

Zurück