C# [Help]Incremeto progressbar (Sveglia)

Stato
Discussione chiusa ad ulteriori risposte.

djmandrukkj

Bannato
22 Novembre 2009
64
14
0
74
Ultima modifica:
Salve ragazzi ho bisogno di un piccolo aiuto, sto creando una sveglia con timer di spegnimeto incorporato in C# e vorrei inserirci all'interno una progressbar che si incrementa dal momento in cui è stato attivato il timer della sveglia fino alla sua azione k sarebbe quella di emettere un suono oppure qll di spegnere il pc qlk1 di voi può aiutarmi in qst impresa?

Nessuno che può aiutarmi?? ;(
 
Ultima modifica:
Salve ragazzi ho bisogno di un piccolo aiuto, sto creando una sveglia con timer di spegnimeto incorporato in C# e vorrei inserirci all'interno una progressbar che si incrementa dal momento in cui è stato attivato il timer della sveglia fino alla sua azione k sarebbe quella di emettere un suono oppure qll di spegnere il pc qlk1 di voi può aiutarmi in qst impresa?

Nessuno che può aiutarmi?? ;(

Ok, credo di aver capito.
Per aumentare la progressBar in modo tale che si trovi correttamente al 100% a quella determinata ora devi calcolare di quanto deve aumentare. Se la vuoi aumentare ogni secondo bisogna calcolare quanti secondi distaccano l'ora attuale a quella prestabilita, rispetto ad un riferimento. In questo modo: 100/secondi di distacco. Se invece vuoi farlo con i minuti vale lo stesso ragionamento, 100/minuti di distacco. Se vuoi farlo con le ore, stessa cosa.
Per il resto bisogna vedere quando la barra è a 100% ed effettuare l'operazione.

PseudoCodice:
Ottieni i secondi di differenza tra l'ora attuale e quella rispetto ad un riferimento (un giorno...)
Ottieni i secondi di differenza tra l'ora prestabilita e quella rispetto ad un riferimento
Calcoli la differenza fra le differenze di secondi
Calcoli la percentuale, 100/Secondi di differenza
Finché il valore della progressBar è disuguale da 100
Aumenti il valore della progressBar con la percentuale calcolata
Effettua l'azione prestabilita

Esempio numerico:
Secondi di differenza fra l'ora attuale e quella rispetto ad un riferimento = 200s
Secondi di differenza fra l'ora prestabilita e quella rispetto ad un riferimento = 1000s
Differenza = 1000-200
Percentuale = 100/800 (aumenti di 0.125% al secondo la progressBar). In questo modo passati gli 800s di differenza, il valore della progressBar sarà di 100%.
 
ti chiedo molto se puoi farmi un esempio con un piccolo form in C# la sveglia porta anche il giorno, la selezione del giorno dell'ora avviene attraverso un dateTimePicker.
Grazie in anticipo
 
Ultima modifica:
EDIT: Ho letto troppo tardi del dateTimePicker. Sono sicuro che sarà facile inserirlo..
EDIT2: Aggiunto piccolo commento, per aumentare il giorno è più sicuro usare .AddDays
A me è venuto qualcosa del genere in mente

Praticamente tre numericbox: ora, minuti e secondi.
E anche un bottone che avvia il timer.

Un timer che si aggiorna ogni secondo.

Quando l'utente preme il bottone viene creato un DateTime ( Metodi DateTime (System) ) della data scelta (se l'utente sceglie un'ora superiore a quella attuale viene considerato il giorno successivo.. leggere i commenti perchè questo sistema deve essere migliorato) poi avvio il timer.

Il timer non fa altro che confrontare le due date usando DateTime.Compare ( Metodo DateTime.Compare (System) ) (le due date, quella attuale e quella inserita dall'utente) se compare ritorna 0 o un valore superiore ferma il timer e fa succedere qualcosa.

Per aggiornare la progressbar ho usato TimeSpan ( C# TimeSpan Examples , ottimo sito comunque ), infatti facendo la sottrazione tra le due date posso sapere quanti secondi ci sono tra le due date, poi basta 100 / numero_secondi_rimanenti.

Fino ad ora ho usato raramente timespan o datetime per questo genere di cose, quindi forse lo stesso codice lo si può fare in un modo migliore.

Forse qualcuno considera tutto questo una pappa pronta, errore mio in questo caso ;)
Ho linkato la documentazione microsoft ( e anche un altro sito ) che ti può essere utile a capirlo..


Il form me lo sono immaginato cosi ( mi trovavo a scrivere questo codice.. )

a401d234d6258c8024352c762833c352839833f4.png

Codice:
namespace Progresso
{
    public partial class Form1 : Form
    {
        private Timer timer;
        private DateTime sveglia;


        public Form1()
        {
            InitializeComponent();


            ora.Value = DateTime.Now.Hour;
            minuti.Value = DateTime.Now.Minute;
            sec.Value = DateTime.Now.Second;


            timer = new Timer();
            timer.Tick += timer_Tick;
            timer.Interval = 1000; // 1 secondo, io ho paura che possa uscire sbilanciato potresti provare ogni 500 ms?
        }


        // Viene chiamato ogni secondo
        void timer_Tick(object sender, EventArgs e)
        {
            //
            // Prendo il tempo attuale e lo confronto
            // DateTime.Compare ritorna un valore maggiore di zero se t1 (datetime.now) è successivo a t2 (sveglia)
            //


            int compare = DateTime.Compare(DateTime.Now, sveglia);
            
            // Aggiorna la progressbar
            // TimeSpan mi dice quanto tempo manca tra due date
            TimeSpan ts = (sveglia - DateTime.Now);


            if (ts.Seconds > 0)
            {
                progressBar1.Value = (100 / ts.Seconds);
            }
            else
            {
                progressBar1.Value = 100;
            }


            //MessageBox.Show(progressBar1.Value.ToString());


            // 0 o maggiore di 0 perchè in caso sia uguale o superiore deve succedere qualcosa
            if (compare >= 0)
            {
                //
                // Fermo il timer
                //
                timer.Stop();


                // Succede qualcosa
                MessageBox.Show("Finito.");


                // cambio il testo..
                button1.Text = "Nuova sveglia";


                //
                // Sblocco i controlli
                //
                ora.Enabled = true;
                minuti.Enabled = true;
                sec.Enabled = true;
            }
        }


        private void button1_Click(object sender, EventArgs e)
        {
            //
            // Il sistema è molto rozzo a mente mi vengono alcuni bug riguardo al fatto che non viene effettuato nessun controllo sul mese etc.
            // tranne quello del giorno
            //


            //
            // Creo il DateTime relativo alla data specificata
            //
            int giorno = DateTime.Now.Day;
            
            //
            // Se l'utente scrive come ora le 17 e ora sono le 18 significa che si riferisce alle 17 di domani
            // 
            if (ora.Value > DateTime.Now.Hour)
            {
                  // Invece di fare questo sistema puoi usare DateTime.AddDay(1); dovrebbe essere più sicuro
                 //giorno++;


                // leggi sopra
                // In questo punto andrebbe controllato che:
                // Il nuovo giorno non superi il mese attuale
                // Se lo supera, aumentare il mese e resettare il giorno
                // Dopo, controllare se il mese non supera l'anno
                // IN questo caso resettare il mese e aumentare l'anno
            }


            //
            // Anche Now.Year e Now.Mounth meritano un controllo migliore
            // Ma per il momento ho deciso di metterlo da parte (è più che altro un esempio questo che ti sto facendo per questo..)
            //


            sveglia = new DateTime(DateTime.Now.Year, DateTime.Now.Month, giorno, (int)ora.Value, (int)minuti.Value, (int)sec.Value);


            //
            // Avvia timer
            //
            timer.Start();


            //
            // Cambio il testo..
            //
            button1.Text = "Ferma";


            //
            // Blocco i controlli
            //
            ora.Enabled = false;
            minuti.Enabled = false;
            sec.Enabled = false;
        }
    }
}
 
scusatemi sono riuscito da poco ad aggiustare il mio pc che per motivi economici non potevo ripararlo cmq ok ti rigrazio rrev ora mi rimetto a lavoro da dove ho lasciato e ti aggiorno
 
Stato
Discussione chiusa ad ulteriori risposte.