PDA

View Full Version : [C#]Cambiare colore di sfondo form a mò di lampeggio


Napalm
03-04-2009, 16:33
Salve,

devo cambiare colore di sfondo di un form (windows mobile 2003) in modo che emulasse un lampeggio, cioè passare da colore bianco a rosso dopo un tot di millisecondi. Ho un oggetto timer che ogni secondo esegue un operazione:

this.BackColor = System.Drawing.Color.Red;
Thread.Sleep(100);
this.BackColor = System.Drawing.Color.White;

e noto che il colore non cambia o meglio il colore diventa quello indicato dopo lo sleep e non si vede l'effetto lampeggio.
Dove ho sbagliato?

NapalM

MarcoGG
03-04-2009, 18:34
No, hai già un Timer, che te ne fai dello Sleep ?

private void timer1_Tick(object sender, EventArgs e)
{
if (this.BackColor == System.Drawing.Color.Red){
this.BackColor = System.Drawing.Color.White;
}
else {
this.BackColor = System.Drawing.Color.Red;
}
}

;)

||ElChE||88
03-04-2009, 20:19
No, hai già un Timer, che te ne fai dello Sleep ?

private void timer1_Tick(object sender, EventArgs e)
{
if (this.BackColor == System.Drawing.Color.Red){
this.BackColor = System.Drawing.Color.White;
}
else {
this.BackColor = System.Drawing.Color.Red;
}
}

;)
Perché usi il this?

Kralizek
03-04-2009, 20:39
io lo uso sempre quando sto usando membri della classe, form o page che sia. Così distinguo facilmente tra membri e variabili locali.

||ElChE||88
03-04-2009, 20:42
io lo uso sempre quando sto usando membri della classe, form o page che sia. Così distinguo facilmente tra membri e variabili locali.
Boh, a me sembra ridondante.

MarcoGG
03-04-2009, 23:20
In linea di massima sono d'accordo con Kralizek ( sei uno dei pochi che mi capisce :D ). In questo caso il motivo era semplicemente riutilizzare il codice di Napalm e far notare le uniche differenze con il mio. ;)

Kralizek
04-04-2009, 01:26
Boh, a me sembra ridondante.

Quando si lavora in un team ogni ridondanza può aiutare gli altri a capire il tuo codice. Un po' come l'indentatura ed i commenti (quando non sono scritti in svedese, scorretto tra l'altro :muro: )

In linea di massima sono d'accordo con Kralizek ( sei uno dei pochi che mi capisce :D ).

Altro motivo per cui sono abituato ad usare la keyword this è perchè gioco molto con la derivazione, polimorfismo e generics. con this e base sai sempre esattamente quale metodo stai chiamando.

Un esempio pratico:


public class MiaLista : List<MioOggetto>
{
public new void Add(MioOggetto item)
{
if (item.Proprieta1.Length > 0)
Add(item);
}

public void Add(string proprieta1, int proprieta2, bool proprieta3)
{
MioOggetto item = new MioOggetto ( proprieta1, proprieta2, proprieta3);
Add(item);
}

...
}


Nel primo metodo se non specifico "base" do luogo ad uno StackOverflow, nel secondo, se non specifico "this", non è intuitivo capire cosa sto chimando.

Insomma, 5 caratteri in più non guastano ed aiutanto tanto la comprensione tua quanto quella di altri. ;)

||ElChE||88
04-04-2009, 02:36
Quando si lavora in un team ogni ridondanza può aiutare gli altri a capire il tuo codice. Un po' come l'indentatura ed i commenti (quando non sono scritti in svedese, scorretto tra l'altro :muro: )
Questo lo so... sono all'università e già vedo codice mal scritto, pieno di commenti inutili dappertutto (il top è uno che scrive i commenti, i metodi e le variabili in gaelico... :muro: ).
Nel primo metodo se non specifico "base" do luogo ad uno StackOverflow, nel secondo, se non specifico "this", non è intuitivo capire cosa sto chimando.
Sisi, ma in questo caso il base è una scleta obbligata.
Insomma, 5 caratteri in più non guastano ed aiutanto tanto la comprensione tua quanto quella di altri. ;)
In effetti non sembra stupido... soprattutto se usato nelle Forms. Ci farò un pensierino. :O

MarcoGG
04-04-2009, 09:43
Cmq, Napalm, aumenta anche l'intervallo del Timer. 100 msec sono da mal di testa ! :D

Napalm
04-04-2009, 11:06
No, hai già un Timer, che te ne fai dello Sleep ?

private void timer1_Tick(object sender, EventArgs e)
{
if (this.BackColor == System.Drawing.Color.Red){
this.BackColor = System.Drawing.Color.White;
}
else {
this.BackColor = System.Drawing.Color.Red;
}
}

;)

mhmh non se pole, nel senso non è quello che vorrei fare io: il timer ha uno tick di 1 sec quindi in pratica rimarrebbe colorato per 1 secondo di rosso poi diventerebbe bianco ecc.. nella tua soluzione mentre io vorrei che fosse proprio un lampeggio di 100 msec e basta (questo perché il timer deve obbligatoriamente avere un tick di 1 sec)
Teoricamente dovrei aver trovato la soluzione: un timer nel timer e via :D
Grazie :)

NapalM

Napalm
04-04-2009, 11:09
Cmq, Napalm, aumenta anche l'intervallo del Timer. 100 msec sono da mal di testa ! :D

ihih si ma tanto dura solo 5 secondi, ed è un segnale visivo perché l'utente potrebbe essere distante dal palmare (infatti è accoppiato ad un segnale audio) :)

NapalM

MarcoGG
04-04-2009, 11:29
mhmh non se pole, nel senso non è quello che vorrei fare io: il timer ha uno tick di 1 sec quindi in pratica rimarrebbe colorato per 1 secondo di rosso poi diventerebbe bianco ecc.. nella tua soluzione mentre io vorrei che fosse proprio un lampeggio di 100 msec e basta (questo perché il timer deve obbligatoriamente avere un tick di 1 sec)
Teoricamente dovrei aver trovato la soluzione: un timer nel timer e via :D
Grazie :)

NapalM


Ma, scusa eh, nessuno ti vieta di fare tutto nello stesso identico Timer.
Imposti l'intervallo ad esempio a 100ms, e fai gestire il cambio di colore ogni 100 ms.
Per tutto il resto ( codice da eseguire ogni secondo = 1000 msec ) basta che crei un contatore esterno ( variabile privata a livello di Form ), e quando raggiunge un multiplo di 10 ( 10x100 ms = 1 sec ), lo esegue. ;)

Napalm
06-04-2009, 11:43
Ciao Marco, la tua soluzione è possibile ma riflettendoci sopra ho creato una classe generica dove gli passo l'oggetto, quanti "lampeggi", tempo fra i "lampeggi" e colore da inserire in modo da poterlo riutilizzare in altre cose :)

NapalM

MarcoGG
06-04-2009, 13:43
Niente da ridire, il codice riutilizzabile è sempre la scelta migliore. :)

Napalm
06-04-2009, 13:52
Niente da ridire, il codice riutilizzabile è sempre la scelta migliore. :)

giusto, grazie mille cmq per la consulenza ;)

NapalM