feed-image RSS | matteo.ferrone@yahoo.it | Your IP Address is: 54.224.79.93 | Domenica, 19 Maggio 2013

Mattepuffo.com

Creare un countdown con C#

Dettagli

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.

Commenti   

 
0 #1 Daniele 2012-12-03 16:47
Ciao, complimenti per il tuo tutorial.
Sono alle prime armi con C# e l'ho trovato utile per cominciare.
Volevo solamente farti notare che bisogna impostare il parametro "interval" dell'oggetto "timer" con 1000 millisecondi, altrimenti ogni secondo dura un decimo di secondo!
Riguardo questa modifica, dove sarebbe più opportuno inserirla nel codice? Io ho aggiunto la modifica dove viene dichiarato il metodo del timer:

this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
this.timer1.Interval=1000;
Citazione
 
 
0 #2 fermat 2012-12-04 15:34
ciao!
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.
inoltre a memoria non mi sembra che il contatore soffriva di problemi di sbalzi temporali.
tu hai avuto problemi del genere??
Citazione
 
 
0 #3 Daniele 2012-12-06 13:55
Ciao!
No infatti non lo imposti il parametro Interval, quello l'ho fatto io per sistemare il problema.
Io uso Microsoft Visual C# 2008, probabilmente in questa versione il valore di default è 100 mentre nella tua è 1000.
Citazione
 
 
0 #4 fermat 2012-12-06 14:02
mi piacerebbe provare, ma adesso ho installato addirittura la versione 2012 e il .net framework 4.5.
quindi purtroppo mi rimane un pò difficile testare le differenze!!
Citazione
 

Aggiungi commento


   
© Matteo Ferrone