Entwickler-Ecke

WinForms - progressbar soll verbleibende zeit anzeigen


creative100 - So 31.01.16 20:02
Titel: progressbar soll verbleibende zeit anzeigen
hallo ihr lieben,

Anfänger braucht Hilfe zu einer Progressbar. Habe einen kleinen Timer gebastelt der meinen Rechner automatisch herunter fährt. Eine Progressbar in der Status_Leiste soll mir nun noch die verbleibende Zeit Anzeigen. Leider Habe ich keine Ahnung wie ich das machen soll. Gibt es jemand der mir hierzu helfen kann? Das Projekt habe ich als Anhang beigelegt.


Ralf Jansen - So 31.01.16 20:41

Falls du bisher beim ausprobieren Probleme hattest, der Tick Event des Timers ist bei dir mit Form_Load verknüpft nicht mit der tmrUhr_Tick.

Ansonsten könnte man tmrUhr_Tick so implementieren


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
private const int maxSteps = 100;
private int steps;
private void tmrUhr_Tick(object sender, EventArgs e)
{
    if (steps == 0)
    {
        MessageBox.Show("Bäm");  //eigentlich Process.Start("ShutDown", "/a");
        tmrUhr.Enabled = false;
        Close(); // wird ja heruntergefahren also selbst beenden
    }

    pbRemaining.Value = (pbRemaining.Width / maxSteps) * steps;
    steps--;
}


in btnStart_Click den Call zu Process.Start entfernen, das mache ich lieber nach Ablauf aus dem Timer, und durch starten des Timers ersetzen z.B.

C#-Quelltext
1:
2:
3:
4:
steps = maxSteps;
pbRemaining.Value = 0;
tmrUhr.Interval = (ende * 1000) / maxSteps;
tmrUhr.Enabled = true;


creative100 - So 31.01.16 22:16

user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Falls du bisher beim ausprobieren Probleme hattest, der Tick Event des Timers ist bei dir mit Form_Load verknüpft nicht mit der tmrUhr_Tick.


Vielen dank für deine Anregungen!! Ich habe beim Test bisher keine Probleme mit dem Tick Event des Timers, da es gewollt ist, dass der Timer beim laden des Formulares eine normale Uhrzeit anzeigen soll. Der Shut Down Timer funktioniert ja auch, aber er ist halt nicht vollständig wegen der Progress Bar. Ich überlege nun, wie kann ich nach dem Ivent btnStart_Click (also den eigentlichen beginn des Timers Shut Down) die bestehende Progress Bar aktivieren kann. Ich bin halt nur eine Anfänger und hänge hier. Also wenn ich 10 Minuten eingebe, sollte nun ein Grüner Balken in der Progress Bar zu sehen sein. Sekunde für Sekunde sollte der Balken der Progress Bar nun verschwinden. Umgekehrt währe ich auch schon zu frieden, also der Balken kann auch wachsen.


creative100 - Mo 01.02.16 12:00

Habe das jetztzt mal so gemacht wie du vorgeschlagen hast.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
private const int maxSteps = 100;
private int steps;
private void tmrUhr_Tick(object sender, EventArgs e)
{
    if (steps == 0)
    {
        MessageBox.Show("Bäm");  //eigentlich 
        Process.Start("ShutDown""/a");
        tmrUhr.Enabled = false;
        Close(); // wird ja heruntergefahren also selbst beenden
    }

    pbRemaining.Value = (pbRemaining.Width / maxSteps) * steps;
    steps--;
}


in btnStart_Click den Call zu Process.Start entfernen, das mache ich lieber nach Ablauf aus dem Timer, und durch starten des Timers ersetzen z.B.

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:
        private void btnStart_Click(object sender, EventArgs e)
        {
            int stunde = int.Parse(txtStunde.Text) * 3600;
            int minute = int.Parse(txtMinute.Text) * 60;
            int sekunde = int.Parse(txtSekunde.Text);

            int ende = stunde + minute + sekunde;
            var result = DateTime.Now.AddSeconds(+ende);
            var sek = ende.ToString();

            lblDown.Text = "um: " + result.ToString("HH:mm:ss");

            int minuten = ende / 60;

            sslRemaining.Text = "min: " + minuten.ToString();
            //Process.Start("Shutdown", "/s /t" + ende.ToString());


            steps = maxSteps;
            pbRemaining.Value = 0;
            tmrUhr.Interval = (ende * 1000) / maxSteps;
            tmrUhr.Enabled = true;


        }



Die Progressbar macht keine Reaktion, aber jede Sekunde bekomme ich die MessageBox.Show("Bäm") ausgegeben. Wenn der Grüne Balken in der Progressbar jede Sekunde wachsen würde oder eben kleiner würde wäre das Problem schon gelöst. Irgend etwas willst du mir sagen ich komme jedoch nicht darauf.???

Weiterhin erhalte ich eine NullReferenceException für die Zeile pbRemaining.Value = (pbRemaining.Width / maxSteps) * steps;


Ralf Jansen - Mo 01.02.16 12:13

Der Timer sollte nicht schon im Designer auf Enabled stehen. Der sollte erst loslaufen wenn er auch benötigt wird.