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.. )
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;
}
}
}