Creare un countdown con C#

Mattepuffo's logo
Creare un countdown con C#

Creare un countdown con C#

Oggi vedremo come creare un piccolo cpuntdown con C# e Windows Form.

Create una nuova applcazione Windows Form.
Nella finestra dovete mettere come minimo questi elementi:

  • una TextBox per impostare le ore
  • una TextBox per impostare i minuti
  • una TextBox per impostare i secondi
  • un Button per lo start
  • un Button per la pausa
  • un Button per lo stop
  • una Label per lo scorrere delle ore
  • una Label per lo scorrere dei minuti
  • una Label per lo scorrere dei secondi
  • un oggetto Timer che trovate nel gurppo Componenti; quando lo aggiungete verrà visualizzato nella barra in fondo alla finestra del designer

Inoltre, per fare le cose più carine, i tasti di stop e pausa all'inizio sono disabilitati.

Di volta in volta abiliteremo/disabiliteremo solo i pulsanti che ci servono.

A questo punto nel codice del form pirma di tutto aggiungiamo 4 variabili private:

private int seconds = 0;
private int minutes = 0;
private int hours = 0;
private bool paused;

Penso che non abbiano bisogno di molte spiegazioni.

Poi abbiamo bisogni di un metodo per ogni bottone più uno per controllare l'oggetto Timer.

Cominciamo col metodo del pulsante start:

private void btnStart_Click(object sender, EventArgs e)
        {
            if (paused != true)
            {
                if (txtHr.Text != String.Empty || txtMn.Text != String.Empty || txtSn.Text != String.Empty)
                {
                    try
                    {
                        if (txtHr.Text != String.Empty)
                        {
                            hours = Convert.ToInt32(txtHr.Text);
                        }
                        if (txtMn.Text != String.Empty)
                        {
                            minutes = Convert.ToInt32(txtMn.Text);
                        }
                        if (txtSn.Text != String.Empty)
                        {
                            seconds = Convert.ToInt32(txtSn.Text);
                        }
                        btnStart.Enabled = false;
                        btnPause.Enabled = true;
                        btnStop.Enabled = true;
                        cdTimer.Enabled = true;
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                }
                else
                {
                    MessageBox.Show("Inserire almeno un valore");
                }
            }
            else
            {
                cdTimer.Enabled = true;
                paused = false;
                btnStart.Enabled = false;
                btnPause.Enabled = true;
                btnStop.Enabled = true;
            }
        }

Prima controlliamo se lo stato del Timer è in pausa.

Poi controlliamo che almeno una delle TextBox sia valorizzata.

Se tutto va bene valoriaziamo le variabili int private con i valori delle TextBox e abilitiamo il Timer (cdTimer).

Il metodo per la pausa invece è questo:

     private void btnPause_Click(object sender, EventArgs e)
        {
            cdTimer.Enabled = false;
            paused = true;
            btnStart.Enabled = true;
            btnPause.Enabled = false;
        }

Non c'è moltissimo da spiegare.

Quello per lo stop:

      private void btnStop_Click(object sender, EventArgs e)
        {
            cdTimer.Enabled = false;
            btnPause.Enabled = false;
            btnStop.Enabled = false;
            btnStart.Enabled = true;
            txtHr.Clear();
            txtMn.Clear();
            txtSn.Clear();
            lblHr.Text = "00";
            lblMin.Text = "00";
            lblSec.Text = "00";
        }

Anche qua non c'è moltissimo da dire.

Infine vediamo il metodo del Timer:

       private void timer1_Tick(object sender, EventArgs e)
        {
            if (hours == 0 && minutes == 0 && seconds == 0)
            {
                txtHr.Clear();
                txtMn.Clear();
                txtSn.Clear();
                lblHr.Text = "00";
                lblMin.Text = "00";
                lblSec.Text = "00";
                cdTimer.Enabled = false;
                cdTimer.Stop();
                cdTimer.Dispose();
                MessageBox.Show("Finish!");
                btnStart.Enabled = true;
                btnPause.Enabled = false;
                btnStop.Enabled = false;
            }
            else
            {
                if (seconds < 1)
                {
                    seconds = 59;
                    if (minutes == 0)
                    {
                        minutes = 59;
                        if (hours != 0)
                            hours -= 1;

                    }
                    else
                    {
                        minutes -= 1;
                    }
                }
                else
                {
                    seconds -= 1;
                }
                lblHr.Text = hours.ToString();
                lblMin.Text = minutes.ToString();
                lblSec.Text = seconds.ToString();
            }
        }

Il tutto è nell'else.

In sostanza c'è un controllo sui secondi, minuti e ore.

Fino a che non sono tutti a zero i valori venogno ridotti.

Più sotto si impostano i valori delle Label.

Diciamo che qua è l'oggetto Timer che pensa a fare i calcoli giusti.

A noi ci viene dato giusto un minimo compito.


Condividi

4 Commenti

  • fermat

    mi piacerebbe provare, ma adesso ho installato addirittura la versione 2012 e il .net framework 4.5.<br />quindi purtroppo mi rimane un pò difficile testare le differenze!!

    06/12/2012
  • Daniele

    Ciao!<br />No infatti non lo imposti il parametro Interval, quello l'ho fatto io per sistemare il problema.<br />Io uso Microsoft Visual C# 2008, probabilmente in questa versione il valore di default è 100 mentre nella tua è 1000.

    06/12/2012
  • fermat

    ciao!<br />ho dato un'occhiata a quanto scritto (velocemente purtroppo perchè in ufficio non ho molto tempo) e non mi sembra di aver impostato un interval da qualche parte.<br />inoltre a memoria non mi sembra che il contatore soffriva di problemi di sbalzi temporali.<br />tu hai avuto problemi del genere??

    04/12/2012
  • Daniele

    Ciao, complimenti per il tuo tutorial.<br />Sono alle prime armi con C# e l'ho trovato utile per cominciare.<br />Volevo solamente farti notare che bisogna impostare il parametro "interval" dell'oggetto "timer" con 1000 millisecondi, altrimenti ogni secondo dura un decimo di secondo!<br />Riguardo questa modifica, dove sarebbe più opportuno inserirla nel codice? Io ho aggiunto la modifica dove viene dichiarato il metodo del timer:<br /><br />this.timer1.Tick += new System.EventHandler(this.timer1_Tick);<br />this.timer1.Interval=1000;

    03/12/2012

Commentami!