Newsgroup: it.comp.lang.visual-basic
Titolo: 6 cronometro in azione contemporanemente

Si tratta di creare sei cronometri che si avviino, si stoppino, si
resettino indipendentemente l'uno dall'altro..
Servono per misurare il tempo di utilizzo di sei cabine telefoniche..
Sono riuscito a creare solo questo codice che sě fa partire un
cronometro ma pure lo fa stoppare qualora se ne avvi un'altro..
Qualcuno mi sa suggerire una soluzione?
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As
Long)
Private Sub Command1_Click()
If Command1.Caption = "Cronometro 1" Then
Command1.Caption = "Stop"
Else
Command1.Caption = "Cronometro 1"
End If
If Command1.Caption = "Cronometro 1" Then Exit Sub
via = GetTickCount
Do: DoEvents
tempotmp& = GetTickCount - via
Sleep (5)
Label1.Caption = Format$(tempotmp& \ 3600000, "00") & ":" &
Format$(((tempotmp& - (tempotmp& \ 3600000) * 3600000)) \ 60000, "00")
& ":" & Format$((tempotmp& - (tempotmp& \ 60000) * 60000) / 1000,
"00")
Loop Until Command1.Caption = "Cronometro 1"
End Sub
Private Sub Command2_Click()
If Command2.Caption = "Cronometro 2" Then
Command2.Caption = "Stop"
Else
Command2.Caption = "Cronometro 2"
End If
If Command2.Caption = "Cronometro 2" Then Exit Sub
via = GetTickCount
Do: DoEvents
tempotmp& = GetTickCount - via
Sleep (5)
Label2.Caption = Format$(tempotmp& \ 3600000, "00") & ":" &
Format$(((tempotmp& - (tempotmp& \ 3600000) * 3600000)) \ 60000, "00")
& ":" & Format$((tempotmp& - (tempotmp& \ 60000) * 60000) / 1000,
"00")
Loop Until Command2.Caption = "Cronometro 2"
End Sub
Private Sub Command3_Click()
If Command3.Caption = "Cronometro 3" Then
Command3.Caption = "Stop"
Else
Command3.Caption = "Cronometro 3"
End If
If Command3.Caption = "Cronometro 3" Then Exit Sub
via = GetTickCount
Do: DoEvents
tempotmp& = GetTickCount - via
Sleep (5)
Label3.Caption = Format$(tempotmp& \ 3600000, "00") & ":" &
Format$(((tempotmp& - (tempotmp& \ 3600000) * 3600000)) \ 60000, "00")
& ":" & Format$((tempotmp& - (tempotmp& \ 60000) * 60000) / 1000,
"00")
Loop Until Command3.Caption = "Cronometro 3"
End Sub
Private Sub Command4_Click()
If Command4.Caption = "Cronometro 4" Then
Command4.Caption = "Stop"
Else
Command4.Caption = "Cronometro 4"
End If
If Command4.Caption = "Cronometro 4" Then Exit Sub
via = GetTickCount
Do: DoEvents
tempotmp& = GetTickCount - via
Sleep (5)
Label4.Caption = Format$(tempotmp& \ 3600000, "00") & ":" &
Format$(((tempotmp& - (tempotmp& \ 3600000) * 3600000)) \ 60000, "00")
& ":" & Format$((tempotmp& - (tempotmp& \ 60000) * 60000) / 1000,
"00")
Loop Until Command4.Caption = "Cronometro 4"
End Sub
Private Sub Command5_Click()
If Command5.Caption = "Cronometro 5" Then
Command5.Caption = "Stop"
Else
Command5.Caption = "Cronometro 5"
End If
If Command5.Caption = "Cronometro 5" Then Exit Sub
via = GetTickCount
Do: DoEvents
tempotmp& = GetTickCount - via
Sleep (5)
Label5.Caption = Format$(tempotmp& \ 3600000, "00") & ":" &
Format$(((tempotmp& - (tempotmp& \ 3600000) * 3600000)) \ 60000, "00")
& ":" & Format$((tempotmp& - (tempotmp& \ 60000) * 60000) / 1000,
"00")
Loop Until Command5.Caption = "Cronometro 5"
End Sub
Private Sub Command6_Click()
If Command6.Caption = "Cronometro 6" Then
Command6.Caption = "Stop"
Else
Command6.Caption = "Cronometro 6"
End If
If Command6.Caption = "Cronometro 6" Then Exit Sub
via = GetTickCount
Do: DoEvents
tempotmp& = GetTickCount - via
Sleep (5)
Label6.Caption = Format$(tempotmp& \ 3600000, "00") & ":" &
Format$(((tempotmp& - (tempotmp& \ 3600000) * 3600000)) \ 60000, "00")
& ":" & Format$((tempotmp& - (tempotmp& \ 60000) * 60000) / 1000,
"00")
Loop Until Command6.Caption = "Cronometro 6"
End Sub
Private Sub Command7_Click()
Label1.Caption = "00:00:00"
Label2.Caption = "00:00:00"
Label3.Caption = "00:00:00"
Label4.Caption = "00:00:00"
Label5.Caption = "00:00:00"
Label6.Caption = "00:00:00"
End Sub
Private Sub Command10_Click()
Label3.Caption = "00:00:00"
End Sub
Private Sub Command11_Click()
    Label4.Caption = "00:00:00"
End Sub
Private Sub Command12_Click()
Label5.Caption = "00:00:00"
End Sub
Private Sub Command13_Click()
Label6.Caption = "00:00:00"
End Sub
Private Sub Command8_Click()
    Label1.Caption = "00:00:00"
End Sub
Private Sub Command9_Click()
    Label2.Caption = "00:00:00"
End Sub
Private Sub Form_Load()
Label1.Caption = "00:00:00"
Label2.Caption = "00:00:00"
Label3.Caption = "00:00:00"
Label4.Caption = "00:00:00"
Label5.Caption = "00:00:00"
Label6.Caption = "00:00:00"
End Sub

[...]


Perchè tutte quelle API?
crea un modulo e dichiara sei variabili globali , ognuna sarà il tempo di
una cabina( ad es:
Global Cabina1 As Long )
poi crea una form con sei timer(uno che si chiama timer 1 , timer 2 ecc.)
quindi setta Enabled a false
imposta l'intervallo a 1600ms (1s)
poi basta che metti questo codicice in ognuno dei timer:
    Cabina<il numero della cabina> = Cabina<il numero della cabina> + 1
poi basta che fai sei pulsanti con questo codice:
If Cabina<numero della cabina> = True
Cabina<numero della cabina>.Enabled = False
Else
Cabina<numero della cabina>.Enabled = True
End If
Poi basta che fai della label e ci metti i risultati delle variabili.
è semplicissimo.
Ciaoo!!
--
Carmine
Webmaster di The Total Site (
http://www.tekkentag.altervista.org/
 )
giuseppe.gi...@tin.it
Account Messenger: 
thetot...@msn.com
"Diego Mazzaro" <di...@mazzaro.NOSP@M.net> ha scritto nel messaggio
news:KPD7e.1199$Bn....@tornado.fastwebnet.it...


 ha scritto nel messaggio
news:juL7e.1238146$35.45...@news4.tin.it...



Mmmm... più che di una soluzione secondo me hai bisogno di un corso di
programmazione, senza offesa, eh!
Ma magari è proprio un esercizio per un compito a casa, sbaglio?
Ti dò qualche dritta, senza fornirti il programma completo però.
Comincia a ripensare il design: se hai 6 pulsanti/label sostanzialmente identici
nel comportamento, che senso ha ripetere lo stesso codice in tutte le sub evento
xxxx_Click? Crea 2 array di controlli CommandButton e Label, dando loro dei nomi
appropriati (es. cmdStartStop(), lblTime()), ciascuno da 6 elementi (con la
proprietà Index da 0 a 5).
In tal modo, se un domani i cronometri diventassero 10, non hai che da
aggiungere i
corrispondenti controlli ma il codice è in larga parte già scritto.
Const NUM_CRONO = 6    ' Costante che indica il numero dei "cronometri"
Per memorizzare lo stato "Started" or "Stopped" del cronometro corrispondente
puoi sì "riciclare" (come hai fatto) la proprietà Caption del CommandButton, ma
non è il massimo dell'eleganza e della comprensibilità, pertanto ti consiglio di
usare un array di boolean definito a livello di modulo:
Dim Started(0 To NUM_CRONO - 1) As Boolean    ' Indica lo stato di "avviato" di
ciascuno dei cronometri
Inoltre per memorizzare l'istante di inizio conteggio non puoi usare una sola
variabile di modulo (quella da te chiamata "via"), ma te ne serviranno tante
quanti i cronometri:
Dim StartTime(0 To NUM_CRONO - 1) As Long    ' Indica l'istante di "avvio" di
ciascuno dei cronometri
Per gestire l'avvio e l'arresto di ciascun cronometro, nella sub evento
dell'i-esimo CommandButton (cmdStartStop_Click(Index As Integer)) non occorre
fare altro che:
1) Settare/resettare il relativo elemento dell'array Started, a seconda del
valore corrente (se false-->true e viceversa)
2) Cambiare eventualmente la caption del pulsante
3) In caso di avvio, memorizzare l'istante corrente nel relativo elemento
dell'array
Per l'aggiornamento delle label con gli orari, la cosa migliore non è looppare
in ciascuna sub evento, ma avere una sorta di "coordinamento" esterno del
refresh delle label. Per fare ciò potresti utilizzare un controllo Timer
piazzato sul form, che a cadenza regolare es. di 1 secondo (Timer1.Interval =
1000) va ad esaminare tutti e 6 i "cronometri" con un ciclo for, e per ciascuno,
se "avviato", calcola il tempo trascorso in millisecondi, lo formatta in stringa
"ore:minuti:secondi" e lo mostra nella corrispondente label lblTime().
Per la formattazione degli orari lascio a te il compito di trasformare un valore
in millisecondi in stringa , magari senza usaretutte quelle formule ma
suggerendoti di convertire millisecondi-->DateTime-->String usando le più comode
funzioni predefinite TimeSerial(Hour, Minute, Second) e Format$.
Buon lavoro
Raf

giusto, ottima soluzione Rafunk,
nn ci avevo pensato
--
Carmine
Webmaster di The Total Site (
http://www.tekkentag.altervista.org/
 )
giuseppe.gi...@tin.it
Account Messenger: 
thetot...@msn.com
"Rafunk" <rafun...@NOTHANKSlibero.it> ha scritto nel messaggio
news:d3oelo$t4i$1...@alix.livenet.it...
