PDA

View Full Version : [Vb/C#/.Net]Popup tipo Post It


RaouL_BennetH
04-11-2009, 14:12
Ciao a tutti :)

Ho fatto una piccola applicazione che mi gestisce semplicemente delle scadenze di vario tipo.

Mi piacerebbe avere da voi qualche idea su come implementare un sistemino di messaggistica a video che segnali (ad esempio ogni ora) le scadenze più vicine.

Avevo inizialmente pensato di implementare un servizio, ma sto ancora lottando con un'altra applicazione e, lato server, non sono ancora all'altezza di poter fare qualcosa di utile.

La mia soluzione si baserebbe quindi sull'avvio automatico del programma, un comune programma composto da alcune piccole dll e da un'interfaccia grafica per la gestione dei dati.

Grazie mille a tutti come sempre!

RaouL.

U235
04-11-2009, 14:34
ciao,

non ho afferato, si tratta di web o windows form?

mi spieghi meglio il meccanismo?

RaouL_BennetH
04-11-2009, 14:56
Windows forms.

Scusa, ho dimenticato di spiegarmi meglio :)

L'applicazione è molto semplice:

C'è un db dove vengono inserite le varie scadenze per alcuni adempimenti
tramite l'applicazione fatta in C#.

A livello di programma, funziona tutto bene.

La 'chicca' che mi piacerebbe aggiungere è appunto che se l'utente
è un pò 'distratto', il programma legga le scadenze, le confronti con la data odierna
e se il valore è inferiore a, per esempio 15 giorni, segnali mediante un popup a video
la scadenza.

U235
04-11-2009, 15:01
come mai non usi un timer? forse vuoi un orario preciso costante tipo tuuti i gg.alle 12, 13, 14 ecc. indipendentemente dall'orario di avvio dell'applicazione?

RaouL_BennetH
04-11-2009, 16:14
Al momento ho risolto semplicemente utilizzando una notifyIcon e, come da te suggerito, un timer.

Sembra che funzioni :)

U235
04-11-2009, 16:23
Windows forms.

Scusa, ho dimenticato di spiegarmi meglio :)

L'applicazione è molto semplice:

C'è un db dove vengono inserite le varie scadenze per alcuni adempimenti
tramite l'applicazione fatta in C#.

A livello di programma, funziona tutto bene.

La 'chicca' che mi piacerebbe aggiungere è appunto che se l'utente
è un pò 'distratto', il programma legga le scadenze, le confronti con la data odierna
e se il valore è inferiore a, per esempio 15 giorni, segnali mediante un popup a video
la scadenza.


scusami, non avevo letto l'edit :fagiano:

ok...
il meccanismo è semplice, metti un timer che fa l'estrazione e confronto dei dati, nel caso vuoi che gli impegni non vengano segnalati di continuo ad ogni tick del timer, metti un dato di confronto ad esempio una data/ora con il classico check (o altro) tipo "ricordamelo tra tot tempo") nella form che farà da popup.

se non ti è chiaro, tra un po ti posto un esempio.

U235
04-11-2009, 19:42
questo esempio l'ho creato (buttato giù rapidamente senza fronzoli) semplicemente per avere un idea di come potresti fare, ma ovviamente devi adattarlo perchè cosi' non ha molto senso, ma basterebbero delle piccole modifiche.

la prima classe è la popup che contiene due listBox, una per il testo da visualizzare e una per la scelta dell'utente che nell'ordine dovrebbe essere 1 ora, 2 ore, 3 ore e non ricordare piu', poi un bottone al quale è collegato il metodo button1_Click. in piu' ho aggiunto un evento di chiusura del form che rimanda indietro "l'impegno" modificato.

//creo un delegato per trasmettere l'impegno modificato alla form principale
public delegate void Delegato(Impegno impegno);
public partial class Form2 : Form
{
public Impegno Impegno { get; set; }
Delegato delegato = null;
public Form2()
{
InitializeComponent();
}
//creo un costruttore che accetta un Impegno come parametro
public Form2(Impegno impegno)
{
InitializeComponent();
this.Impegno = impegno;
///aggiungo il testo alla listbox
this.listBox1.Items.Add(impegno.Testo);
///imposto la prima selezione di default (ricordamelo tra 1 ora)
this.listBox2.SelectedIndex = 0;
}

public event Delegato ModificaImpegno
{
add { this.delegato += value; }
remove { this.delegato -= value; }
}

private void button1_Click(object sender, EventArgs e)
{
/// controllo la scelta dell'utente tra le varie opzioni
switch (this.listBox2.SelectedIndex)
{
///1 ora
case 0 :
{
///sottraggo il tempo stabilito dal tempo di "anticipo" dell'avviso del promemoria
this.Impegno.Promemoria -= new TimeSpan(1, 0, 0);
break;
}
///2 ore
case 1:
{
///sottraggo il tempo stabilito dal tempo di "anticipo" dell'avviso del promemoria
this.Impegno.Promemoria -= new TimeSpan(2, 0, 0);
break;
}
///3 ore
case 2:
{
///sottraggo il tempo stabilito dal tempo di "anticipo" dell'avviso del promemoria
this.Impegno.Promemoria -= new TimeSpan(3, 0, 0);
break;
}
/// non ricordare piu'
case 3:
{
///dico di non ricordarmelo più
this.Impegno.Ricordalo = false;
break;
}
}
this.Close();
}
//alla chiusura del form
private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
if (this.delegato != null)
{
///rimando indietro il promemoria modificato
this.delegato(this.Impegno);
}
}
}


la prossima classe è il form principale (partial)


public partial class Form1 : Form
{
Impegno impegno;

public Form1()
{
InitializeComponent();

///imposti il timer tenendo presente che piu' è frequesnte (intervallo minore) e piu' è preciso il promemoria, ma è
///anche vero che piu' è frequesnte e piu' lavora il codice...
this.timer1.Interval = 10000;
///abilito il timer
this.timer1.Enabled = true;
///creo un nuovo "Impegno" che in questo caso è un oggetto creato appositamente per fare un esempio
///ma potrebbe essere un dato preso dal db
this.impegno = new Impegno();
///imposto la data e ora dell'impegno
this.impegno.DataOra = new DateTime(2009, 11, 4, 20, 40, 0);
///stabilisco quanto tempo prima devo essere avvisato (in questo caso 2 ore)
this.impegno.Promemoria = new TimeSpan(2, 0, 0);
///imposto il testo da visualizzare nel promemoria
this.impegno.Testo = "prova imopegno";
///stabilisco che deve ricordarmelo
this.impegno.Ricordalo = true;
///questo serve per non fa ripetere il promemoria mentre lo sto lavorando se il timer e frequente
this.impegno.InUso = false;
}

//al tick del timer chiamo il metodo che controlla gli impegni
private void timer1_Tick(object sender, EventArgs e)
{
controlloImpegni(this.impegno);
}

void controlloImpegni(Impegno impegno)
{
///controllo se il promemoria è attivo e che non sia già in uso
if (impegno.Ricordalo&&!impegno.InUso)
{
///sottraggo dalla data di impegno il tempo del promemoria (stabilisco quanto tempo prima devo farlo)
DateTime dataOra = impegno.DataOra.Subtract(impegno.Promemoria);
///stabilisco se è il momento di mandare il promemoria
if (dataOra <= DateTime.Now)
{
///marco come in uso il dato
impegno.InUso = true;
///creo la popup
Form2 popup = new Form2(impegno);
///aggiungo l'evento per la ricezione dell'impegno modificato
popup.ModificaImpegno += new Delegato(popup_ModificaImpegno);
///faccio apparire a video la popup
popup.Show();
}
}
}
//alla chiusura o alla pressione del tasto della popup
void popup_ModificaImpegno(Impegno impegno)
{
///l'impegno non è piu' in uso
impegno.InUso = false;
///"salvo" l'impegno eventualmente nel db ad esempio....
///in questo caso di test lo rimetto in circolo
this.impegno = impegno;
}
}


in fine la prossima classe l'ho fatta per supportare l'esempio senza db


public class Impegno
{
public DateTime DataOra { get; set; }
public string Testo { get; set; }
public TimeSpan Promemoria { get; set; }
public bool Ricordalo { get; set; }
public bool InUso { get; set; }
}


Fammi sapere se hai dificolta a ricreare il tutto secondo le tue esigenze.

Ciao.

RaouL_BennetH
05-11-2009, 10:53
Nel frattempo che me lo studio, ti ringrazio per l'aiuto :)