Posted: Tue Jul 08, 2008 10:51 pm
Enjoy!

Code: Select all
EnableExplicit
;{- private variables
Global __TimerSpinGadget_TotalNumber.l
Global Dim __TimerSpinGadget_spnControl.l(3, 0)
Global Dim __TimerSpinGadget_SP_Max(3)
__TimerSpinGadget_SP_Max(0) = 23
__TimerSpinGadget_SP_Max(1) = 59
__TimerSpinGadget_SP_Max(2) = 59
__TimerSpinGadget_SP_Max(3) = 99
;}
;{- private procedures
Procedure __TimerSpinGadget_Update(pTimerSpinControlID.l, pSpinGadgetID.l)
Protected Change.L
Protected Value.W = GetGadgetState(__TimerSpinGadget_spnControl(pTimerSpinControlID, pSpinGadgetID))
If Value<0
Value + (__TimerSpinGadget_SP_Max(pTimerSpinControlID) + 1) : Change = -1
EndIf
Protected MaxValue.l = GetGadgetAttribute(__TimerSpinGadget_spnControl(pTimerSpinControlID, pSpinGadgetID), #PB_Spin_Maximum)-1
If Value>__TimerSpinGadget_SP_Max(pTimerSpinControlID)
Value-(__TimerSpinGadget_SP_Max(pTimerSpinControlID) + 1) : Change = 1
EndIf
SetGadgetState(__TimerSpinGadget_spnControl(pTimerSpinControlID, pSpinGadgetID), Value)
SetGadgetText(__TimerSpinGadget_spnControl(pTimerSpinControlID, pSpinGadgetID), RSet(Str(Value), 2, "0") )
If Change And pTimerSpinControlID>0
SetGadgetState(__TimerSpinGadget_spnControl(pTimerSpinControlID-1, pSpinGadgetID), GetGadgetState(__TimerSpinGadget_spnControl(pTimerSpinControlID-1, pSpinGadgetID)) + Change)
__TimerSpinGadget_Update(pTimerSpinControlID-1, pSpinGadgetID)
EndIf
EndProcedure
;}
;{ public procedures
Procedure TimerSpinGadget_SetNumberOfInstances(pCount.l)
__TimerSpinGadget_TotalNumber = pCount-1
ReDim __TimerSpinGadget_spnControl(3, __TimerSpinGadget_TotalNumber)
EndProcedure
Procedure TimerSpinGadget_New(pGadgetArea.l, pOffsetX.l, pOffsetY.l, pInstanceNumber.l = 0)
UseGadgetList(pGadgetArea)
Protected i.l
For i = 0 To 3
__TimerSpinGadget_spnControl(i, pInstanceNumber) = SpinGadget(#PB_Any, pOffsetX + 32*(i), pOffsetY, 30, 20, -1, __TimerSpinGadget_SP_Max(i) + 1, #PB_Spin_ReadOnly | #PB_Spin_Numeric)
SetGadgetState(__TimerSpinGadget_spnControl(i, pInstanceNumber), 0)
SetGadgetText(__TimerSpinGadget_spnControl(i, pInstanceNumber), "00")
Next
EndProcedure
Procedure TimerSpinGadget_Release()
Protected i.l, j.l
For j = 0 To __TimerSpinGadget_TotalNumber
For i = 0 To 3
FreeGadget(__TimerSpinGadget_spnControl(i, j))
Next
Next
EndProcedure
Procedure TimerSpinGadget_Event(Event.l, WindowID.l, GadgetID.l, EventType.l)
If event = #PB_Event_Gadget
Protected i.l, j.l
For j = 0 To __TimerSpinGadget_TotalNumber
For i = 0 To 3
If __TimerSpinGadget_spnControl(i, j) = GadgetID
__TimerSpinGadget_Update(i, j)
EndIf
Next
Next
EndIf
EndProcedure
Procedure.s TimerSpinGadget_GetTime(pInstanceNumber.l)
Protected rv.s = ""
rv + GetGadgetText(__TimerSpinGadget_spnControl(0, pInstanceNumber)) + ":"
rv + GetGadgetText(__TimerSpinGadget_spnControl(1, pInstanceNumber)) + ":"
rv + GetGadgetText(__TimerSpinGadget_spnControl(2, pInstanceNumber)) + ":"
rv + GetGadgetText(__TimerSpinGadget_spnControl(3, pInstanceNumber))
ProcedureReturn rv
EndProcedure
;}
; This section can be in another file, just include the code above as an XInclude
CompilerIf #PB_Compiler_Debugger
OpenWindow(0, 216, 0, 300, 150, "New window ( 0 )", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_WindowCentered)
TimerSpinGadget_SetNumberOfInstances(4)
TimerSpinGadget_New(WindowID(0), 10, 10, 0)
TimerSpinGadget_New(WindowID(0), 150, 10, 1)
TimerSpinGadget_New(WindowID(0), 10, 50, 2)
TimerSpinGadget_New(WindowID(0), 150, 50, 3)
Define btnListValues.l = ButtonGadget(#PB_Any, 80, 90, 100, 24, "Display Values")
Define Event
Define WindowID
Define GadgetID
Define EventType
Repeat ; Start of the event loop
Event = WaitWindowEvent() ; This line waits until an event is received from Windows
WindowID = EventWindow() ; The Window where the event is generated, can be used in the gadget procedures
GadgetID = EventGadget() ; Is it a gadget event?
EventType = EventType() ; The event type
TimerSpinGadget_Event(Event, WindowID, GadgetID, EventType)
If Event = #PB_Event_Gadget
If GadgetID = btnListValues
Define display.s = ""
display + TimerSpinGadget_GetTime(0) + Chr(13) + Chr(10)
display + TimerSpinGadget_GetTime(1) + Chr(13) + Chr(10)
display + TimerSpinGadget_GetTime(2) + Chr(13) + Chr(10)
display + TimerSpinGadget_GetTime(3)
MessageRequester("", display)
GadgetID = 0
EndIf
EndIf
Until Event = #PB_Event_CloseWindow
TimerSpinGadget_Release()
CompilerEndIf