Newsgroup: it.comp.appl.access
Titolo: problema con countdown salta i secondi

ho messo nella proprietà timerinterval della form il valore 1000
 
richiamo poi nell'evento timer della form il codice che segue ma ho osservato attentamente il processo di countdown di 2 minuti e in alcuni casi salta i secondi
 
=== start code ====
 
Private Sub Form_Timer()
Static StartTime As Date
 
Dim SecondsToCount As Integer
 
SecondsToCount = 2 * 60  'Set this variable to the total number of seconds to count down
 
If Loops = 0 Then StartTime = Time
 
 Min = (SecondsToCount - DateDiff("s", StartTime, Time)) \ 60
 Sec = (SecondsToCount - DateDiff("s", StartTime, Time)) Mod 60
 Forms![partita]![aaaa].Caption = "Form will close in " & Min & ":" & Format(Sec, "00")
 Loops = Loops + 1
 
 If Forms![partita]![aaaa].Caption = "Form will close in 0:00" Then
   MsgBox "inizia la nuova partita"
 End If
End Sub
 
=== end code ===
 
 
qualcuno sa dirmi quale sia l'errore?
 

Avevo dato una risposta frettolosa... ma ci sono diverse cose che sono da sistemare nel tuo codice...!
 
Prima cosa mi sa che non dichiari le VARIABILI in modo Esplicito... tant'è che Min e Sec non sono definite da nessuna parte...
 
Altra cosa, non capisco perchè Calcoli ogni TIMER [SecondsToCount]... questo dipende dal Valore di Secondi(o minuti) del countDown e dal TimerInterval che imposti... quindi non lo devi ricalcolare ogni volta.
Altra cosa non AZZERI la variabile Loops
Altra cosa non ti serve fare un DateDiff con il TIME siccome sai quanto vale LOOPS e sai il peso di ogni incremento...!
 
In sostanza questo sotto è il tuo codice sistemato in modo da essere INDIPENDENTE dal Valore di TIMERINTERVAL, ti basta definire [MinCountDown] come costante o Variabile se credi...!
 
Option Compare Database
Option Explicit
 
Dim IntToCount As Integer
Const MinCountDown As Integer = 2
 
Private Sub Form_Load()
    Me.TimerInterval = 200
    IntToCount = MinCountDown * 60 * (1000 / Me.TimerInterval)
End Sub
 
Private Sub Form_Timer()
    Static StartTime As Date
    Static Loops As Single
    Dim Min As Integer
    Dim Sec As Integer
    Dim ElapsedTime As Integer
 
    If Loops = 0 Then StartTime = Time
 
    If Loops < IntToCount Then
        ElapsedTime = (IntToCount - Loops) * (Me.TimerInterval / 1000)
        Min = ElapsedTime \ 60
        Sec = ElapsedTime Mod 60
        Loops = Loops + 1
        Me![AAA].Caption = "Form will close in " & Min & ":" & Format(Sec, "00") 
    Else
        If Me![AAA].Caption = "Form will close in 0:00" Then
            Loops = 0
            Me.TimerInterval = 0
            MsgBox "inizia la nuova partita"
        End If
    End If
End Sub
 
Tuttavia il problema non è che SALTA i numeri, ma il processo di TIMER_EVENTS non è ASINCRONO, ma SINCRONO al sistema... quindi non sempre le cadenze sono perfette... quindi potrai vedere momenti in cui i numeri ACCELERANO, altri in cui SALTANO, altri in cui RALLENTANO... 
Access non è MultiThread... ci si accontenta...
 
@Alex


ho completamente cambiato codice e questo pare funzionare, si accettano consigli
Mp è il valore di minuti partita
 
su apertura della form eseguo
    Mp = 1
    secondi = 0
    Me.aaaa.Caption = Format(Mp, "00") & ":" & Format(secondi, "00")
    Mp = Mp - 1
    secondi = 60
 
poi su timer che ha un interval timer di 1000 eseguo quanto segue:
    If secondi > 0 Then
        secondi = secondi - 1
        Me.aaaa.Caption = Format(Mp, "00") & ":" & Format(secondi, "00")
    Else
        Mp = Mp - 1
        secondi = 59
        Me.aaaa.Caption = Format(Mp, "00") & ":" & Format(secondi, "00")
    End If
    If (Mp = 0) And (secondi = 0) Then
        Me.bbbb.Caption = "partita terminata"
        Me.TimerInterval = 0
    End If
 
a me funziona se qualcuno intravede qualche bug si accettano segnalazioni e consigli grazie.
 

Sei sicuro di voler suggerimenti... perché quello che ti ho detto prima non mi pare tu lo abbia colto... 
In ogni caso il codice che ti ho suggerito in variazione al tuo è tecnicamente meglio se riesci a rendertene conto... ed il difetto si elimina riducendo il timerinterval.
 
@Alex


Certo che voglio consigli, ma ho preferito semplificare il codice come ho postato nell'ultimo post e pare che non salti più nemmeno i numeri adesso, magari mi sbaglio


quello che mi domandavo è: se io nascondo i secondi, in questo modo visivamente non si nota il difetto del salto secondi, ma alla fine del conteggio se mettoad esempio durata 3 minuti, saranno 3 minuti esatti oppure non è solo un difetto visivo e il tempo sarà ad esempio 3 minuti e 3 secondi o o 2 minuti e 58?
 
grazie.