VERSION 1.0 CLASS BEGIN MultiUse = -1 'True Persistable = 0 'NotPersistable DataBindingBehavior = 0 'vbNone DataSourceBehavior = 0 'vbNone MTSTransactionMode = 0 'NotAnMTSObject END Attribute VB_Name = "CTimer" Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = True Attribute VB_PredeclaredId = False Attribute VB_Exposed = True Option Explicit ' Taken from Bruce McKinney's Hardcore VB Private iInterval As Long Private id As Long ' User can attach any Variant data they want to the timer Public Item As Variant Public Event ThatTime() ' SubTimer is independent of VBCore, so it hard codes error handling Public Enum EErrorTimer eeBaseTimer = 13650 ' CTimer eeTooManyTimers ' No more than 100 timers allowed eeCantCreateTimer ' Can't create system timer End Enum Friend Sub ErrRaise(e As Long) Dim sText As String, sSource As String If e > 1000 Then sSource = App.EXEName & ".WindowProc" Select Case e Case eeTooManyTimers sText = "No more than 100 timers allowed" Case eeCantCreateTimer sText = "Can't create system timer" End Select err.Raise e Or vbObjectError, sSource, sText Else ' Raise standard Visual Basic error err.Raise e, sSource End If End Sub Property Get Interval() As Long Attribute Interval.VB_UserMemId = -520 Interval = iInterval End Property ' Can't just change interval--you must kill timer and start a new one Property Let Interval(iIntervalA As Long) Dim f As Boolean ' Don't mess with it if interval is the same If iInterval = iIntervalA Then Exit Property If iIntervalA Then ' Must destroy any existing timer to change interval If iInterval Then f = TimerDestroy(Me) 'BugAssert f ' Shouldn't fail End If ' Create new timer with new interval iInterval = iIntervalA If TimerCreate(Me) = False Then ErrRaise eeCantCreateTimer Else If iInterval Then iInterval = iIntervalA f = TimerDestroy(Me) 'BugAssert f ' Shouldn't fail End If End If End Property ' Must be public so that Timer object can't terminate while client's ThatTime ' event is being processed--Friend wouldn't prevent this disaster Public Sub PulseTimer() Attribute PulseTimer.VB_MemberFlags = "40" RaiseEvent ThatTime End Sub Friend Property Get TimerID() As Long TimerID = id End Property Friend Property Let TimerID(idA As Long) id = idA End Property Private Sub Class_Initialize() Debug.Print "Timer initialize" End Sub Private Sub Class_Terminate() If Interval Then Interval = 0 Debug.Print "Timer terminate" End Sub