Newsgroup: it.comp.lang.visual-basic
Titolo: evento con timer

ciao a tutti,
mi ritrovo ad affrontare un insolito problema:
su di un form ho tre oggetti (listbox - label - timer).
quando il form viene attivato, nella listbox devono caricarsi dei dati
(solito ciclo do loop), nel frattempo la label
diventa visibile con la scritta "operazione in corso, attendere..." che
dovrebbe cambiare colore (da giallo a rosso) ogni 0,5 sec.
ma all'attivarsi del form, la label diventa visibile solamente con il primo
colore (in questo caso il giallo).
a presto
ciao
jack

Hai messo il DoEvents nel loop?
Alberto


ecco cosa mancava
...c'è sempre qualcosa dietro...
ho messo il DoEvents, ed ora funziona tutto a dovere
grazie mille
ciao
jack

Stai attento perchè con il DoEvents l'utente vede la listbox che si popola,
e potrebbe fare click lì o su qualche altro controllo mentre sei ancora in
fase di popolamento.
E' consigliabile, se usi il DoEvents, disabilitare tutti i controlli ad
inizio loop e riabilitarli alla fine.
Alberto

Lascia stare il DoEvents (è tragico e chi l'ha concepito è sicuramente un
pazzo scatenato!)
Nel tuo caso penso che basti un Label1.Refresh

 Nel tuo caso penso che basti un Label1.Refresh
Esagerato... diciamo che se lo conosci, non ti uccide :-)
Purtroppo il problema in questo caso e' il Timer... senza DoEvents gli
eventi non si scatenano correttamente.
Piuttosto, personalmente, eviterei di ricorrere al Timer; invece di fare un
refresh ogni x secondi, farei un refresh ogni x elementi inseriti,
direttamente nel ciclo principale con il "solito" sistema:
Do
    '[...] il codice di caricamento
    'refresh ogni 200 item inseriti
    If List1.ListCount Mod 200 = 0 Then Me.Refresh
Loop
Ciao
--
Luca Dormio - 
luca....@tin.it
________________________________
FICS ID: LarsenB, LarsenVB(C)
http://digilander.iol.it/larsenvb


Questa tecnica di programmazione risente della velocità della macchina e del
database. Ho visto molti programmi funzionare oggi, e non funzionare domani
quando vengono installati su macchine 3-4 volte più veloci. Pensate se una
cosa del genere fosse stata scritta per un 486. Occorreva fare il refresh
ogni, diciamo, 20 inserimenti. Poi installi il software su un PIII 1.3GHz, e
dovresti fare il refresh ogni 500 inserimenti, altrimenti la label sfarfalla
in maniera troppo rapida.
Direi che la tecnica del timer è perfetta, funziona benissimo ed è
indipendente dalla macchina. Ovviamente il doevents va fatto, ma teniamo a
mente che è richiesto affinchè il SW sia cosciente di cosa avviene. Se non
fosse richiesto, sarebbero ca**i acidi.
Alberto

 indipendente dalla macchina. [SNIP]
Funziona OK, indipendente dalla macchina OK, ma sul perfetto onestamente non
sono d'accordo... IMHO i timer andrebbero usati con moderazione; stai
comunque eseguendo una procedura asincrona e aggiungere il DoEvents per
farla funzionare a dovere, come in questo caso, ti rende vulnerabile a tutti
i problemi di eventi indesiderati che hai peraltro ben evidenziato.
Visto che lo scopo qui e' puramente una finezza estetica, suggerivo qualcosa
di piu' semplice, e, se vogliamo, anche piu' portabile (la routine di
caricamento e' incapsulata, non devi portarti dietro anche gli eventi del
timer)
Ciao
--
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

 timer)
Il sistema più bello, che riduce un po' le prestazioni ma consente di fare
lampeggiare la label con frequenza indipendente dal PC, e senza usare il
timer e il DoEvents, è:
dim Inizio as date
dim periodo as double
Periodo= 1 'espresso in secondi
Periodo=(Periodo / 24) / 3600
Inizio=now
do ....
....
if now-inizio>periodo then
    label1.backcolor=.......
    inizio=now
endif
loop ....
Alberto