Hier kommt ein kleines Update.
Das mit den PopUp-Menü habe ich verworfen und Pfeile sucht man vergebens, aber man darf das Scrollrad verwenden.
Es dürfen nur Zahlen(0-9) und das Zeichen(:) eingegeben werden.
Code: Alles auswählen
;My Time-Gadget-Module
;Code-Name: "PinkPanther"
DeclareModule TimeGadget
ImportC ""
time(time_t = #Null)
localtime(*tm = #Null)
gmtime(time_t.i)
EndImport
Structure TTimeValue
second.l
minute.l
hour.l
mday.l
mon.l
year.l
wday.l
yday.l
isdst.l
EndStructure
Structure TCursor
pos.i
fpos.i
cheight.i
cwidth.i
length.i
EndStructure
Structure TTimeInput
gid.i
value.s
length.i
isfocus.b
center.b
x.i
y.i
h.i
w.i
bgcolor.i
fgcolor.i
font.i
time.TTimeValue
cursor.TCursor
EndStructure
Declare.i TimeGadget(gid.i, xpos.i, ypos.i, width.i, height.i, timeStr.s, flag.i = 0)
Declare TimeGadget_Destroy(*pTimeGadget.TTimeInput)
Declare TimeGadget_Event(*pTimeGadget.TTimeInput, Win.i, WindowEvent.i)
Declare TimeGadget_Update(*pTimeGadget.TTimeInput, show_cursor.b = #False)
Declare.i TimeGadget_GetHour(*pTimeGadget.TTimeInput)
Declare.i TimeGadget_GetMinute(*pTimeGadget.TTimeInput)
Declare.i TimeGadget_GetSecond(*pTimeGadget.TTimeInput)
Declare.s TimeGadget_GetTimeString(*pTimeGadget.TTimeInput)
Declare TimeGadget_SetTimeString(*pTimeGadget.TTimeInput, timeStr.s)
Declare TimeGadget_SetHour(*pTimeGadget.TTimeInput, hour.i)
Declare TimeGadget_SetMinute(*pTimeGadget.TTimeInput, minute.i)
Declare TimeGadget_SetSecond(*pTimeGadget.TTimeInput, second.i)
Declare.i TimeGadget_GetCursorPosition(*pTimeGadget.TTimeInput)
Declare TimeGadget_ChangeTime(*pTimeGadget.TTimeInput, pos.i, down.b = #False)
Declare TimeGadget_Resize(*pTimeGadget.TTimeInput, x, y, w, h)
Declare TimeGadget_SetLocalTime(*pTimeGadget.TTimeInput)
Declare TimeGadget_SetUTCTime(*pTimeGadget.TTimeInput)
Declare TimeGadget_ChangeFont(*pTimeGadget.TTimeInput, font_nr.i)
Declare TimeGadget_ChangeColor(*pTimeGadget.TTimeInput, bgcolor.i, fgcolor.i = 0)
Declare TimeGadget_SetEvent_MenuExceptions(Map MenuExceptions())
EndDeclareModule
Module TimeGadget
Global AClockWin.i
Global NewMap MenuExceptions.i()
Procedure TimeGadget_GetHour(*pTimeGadget.TTimeInput)
Protected.i regex, pass.b = #False, h, rh
If IsGadget(*pTimeGadget\gid)
regex = CreateRegularExpression(#PB_Any, "[0-2][0-9]:[0-5][0-9]:[0-5][0-9]")
If regex
ExamineRegularExpression(regex, *pTimeGadget\value)
While NextRegularExpressionMatch(regex)
pass = #True
Wend
FreeRegularExpression(regex)
EndIf
If pass = #True
h = Val(StringField(*pTimeGadget\value, 1, ":"))
If h < 24 And h >= 0
rh = h
ProcedureReturn rh
EndIf
EndIf
EndIf
ProcedureReturn -1
EndProcedure
Procedure TimeGadget_GetMinute(*pTimeGadget.TTimeInput)
Protected.i regex, pass.b = #False, m, rm
If IsGadget(*pTimeGadget\gid)
regex = CreateRegularExpression(#PB_Any, "[0-2][0-9]:[0-5][0-9]:[0-5][0-9]")
If regex
ExamineRegularExpression(regex, *pTimeGadget\value)
While NextRegularExpressionMatch(regex)
pass = #True
Wend
FreeRegularExpression(regex)
EndIf
If pass = #True
m = Val(StringField(*pTimeGadget\value, 2, ":"))
If m < 60 And m >= 0
rm = m
ProcedureReturn rm
EndIf
EndIf
EndIf
ProcedureReturn -1
EndProcedure
Procedure TimeGadget_GetSecond(*pTimeGadget.TTimeInput)
Protected.i regex, pass.b = #False, s, rs
If IsGadget(*pTimeGadget\gid)
regex = CreateRegularExpression(#PB_Any, "[0-2][0-9]:[0-5][0-9]:[0-5][0-9]")
If regex
ExamineRegularExpression(regex, *pTimeGadget\value)
While NextRegularExpressionMatch(regex)
pass = #True
Wend
FreeRegularExpression(regex)
EndIf
If pass = #True
s = Val(StringField(*pTimeGadget\value, 3, ":"))
If s < 60 And s >= 0
rs = s
ProcedureReturn rs
EndIf
EndIf
EndIf
ProcedureReturn -1
EndProcedure
Procedure.s TimeGadget_GetTimeString(*pTimeGadget.TTimeInput)
If IsGadget(*pTimeGadget\gid)
ProcedureReturn *pTimeGadget\value
Else
ProcedureReturn "-1"
EndIf
EndProcedure
Procedure TimeGadget_SetTimeString(*pTimeGadget.TTimeInput, timeStr.s)
Protected.i regex, h, s.s, pass.b = #False
If IsGadget(*pTimeGadget\gid)
regex = CreateRegularExpression(#PB_Any, "[0-2][0-9]:[0-5][0-9]:[0-5][0-9]")
If regex
ExamineRegularExpression(regex, timeStr)
While NextRegularExpressionMatch(regex)
pass = #True
Wend
FreeRegularExpression(regex)
EndIf
If pass = #True
h = Val(StringField(timeStr, 1, ":"))
s = StringField(timeStr, 3, ":")
If h < 24 And h >= 0 And Len(s) = 2
*pTimeGadget\value = timeStr
Else
*pTimeGadget\value = "00:00:00"
EndIf
Else
*pTimeGadget\value = "00:00:00"
EndIf
EndIf
EndProcedure
Procedure TimeGadget_SetHour(*pTimeGadget.TTimeInput, hour.i)
Protected ntimeStr.s
If IsGadget(*pTimeGadget\gid)
With *pTimeGadget
If hour >= 0 And hour < 24
\time\hour = hour
\time\minute = TimeGadget_GetMinute(*pTimeGadget)
\time\second = TimeGadget_GetSecond(*pTimeGadget)
ntimeStr = RSet(Str(\time\hour), 2, "0") + ":" + RSet(Str(\time\minute), 2, "0") + ":" + RSet(Str(\time\second), 2, "0")
TimeGadget_SetTimeString(*pTimeGadget, ntimeStr)
EndIf
EndWith
EndIf
EndProcedure
Procedure TimeGadget_SetMinute(*pTimeGadget.TTimeInput, minute.i)
Protected ntimeStr.s
If IsGadget(*pTimeGadget\gid)
With *pTimeGadget
If minute >= 0 And minute < 60
\time\hour = TimeGadget_GetHour(*pTimeGadget)
\time\minute = minute
\time\second = TimeGadget_GetSecond(*pTimeGadget)
ntimeStr = RSet(Str(\time\hour), 2, "0") + ":" + RSet(Str(\time\minute), 2, "0") + ":" + RSet(Str(\time\second), 2, "0")
TimeGadget_SetTimeString(*pTimeGadget, ntimeStr)
EndIf
EndWith
EndIf
EndProcedure
Procedure TimeGadget_SetSecond(*pTimeGadget.TTimeInput, second.i)
Protected ntimeStr.s
If IsGadget(*pTimeGadget\gid)
With *pTimeGadget
If second >= 0 And second < 60
\time\hour = TimeGadget_GetHour(*pTimeGadget)
\time\minute = TimeGadget_GetMinute(*pTimeGadget)
\time\second = second
ntimeStr = RSet(Str(\time\hour), 2, "0") + ":" + RSet(Str(\time\minute), 2, "0") + ":" + RSet(Str(\time\second), 2, "0")
TimeGadget_SetTimeString(*pTimeGadget, ntimeStr)
EndIf
EndWith
EndIf
EndProcedure
Procedure TimeGadget_ChangeTime(*pTimeGadget.TTimeInput, pos.i, down.b = #False)
Protected.i aSec = 0, aMin = 0, aHrs = 0
If IsGadget(*pTimeGadget\gid)
If pos >= 0 And pos < 3
aHrs = TimeGadget_GetHour(*pTimeGadget)
If down = #False And aHrs > -1
TimeGadget_SetHour(*pTimeGadget, aHrs + 1)
ElseIf down = #True And aHrs > 0
TimeGadget_SetHour(*pTimeGadget, aHrs - 1)
EndIf
ElseIf pos > 2 And pos < 6
aMin = TimeGadget_GetMinute(*pTimeGadget)
If down = #False And aMin > -1
TimeGadget_SetMinute(*pTimeGadget, aMin + 1)
ElseIf down = #True And aMin > 0
TimeGadget_SetMinute(*pTimeGadget, aMin - 1)
EndIf
ElseIf pos > 5 And pos < 9
aSec = TimeGadget_GetSecond(*pTimeGadget)
If down = #False And aSec > -1
TimeGadget_SetSecond(*pTimeGadget, aSec + 1)
ElseIf down = #True And aSec > 0
TimeGadget_SetSecond(*pTimeGadget, aSec - 1)
EndIf
EndIf
EndIf
EndProcedure
Procedure TimeGadget_GetInputPosition(*pTimeGadget.TTimeInput, x.i, y.i)
Protected mouse_x.d, mouse_y.d, min_distance.d = Infinity(), distance.d, cursor_pos.i, cursor_x.i, cursor_y.i, i.i
If IsGadget(*pTimeGadget\gid)
With *pTimeGadget
mouse_x = GetGadgetAttribute(\gid, #PB_Canvas_MouseX)
mouse_y = GetGadgetAttribute(\gid, #PB_Canvas_MouseY)
\length = Len(\value)
StartDrawing(CanvasOutput(\gid))
cursor_y = y + TextHeight(\value) / 2
For i = 0 To \length
cursor_x = x + TextWidth(Left(\value, i))
distance = (mouse_x - cursor_x) * (mouse_x - cursor_x) + (mouse_y - cursor_y) * (mouse_y - cursor_y)
If distance < min_distance
min_distance = distance
cursor_pos = i
EndIf
Next
StopDrawing()
If Not IsInfinity(min_distance)
ProcedureReturn cursor_pos
Else
ProcedureReturn -1
EndIf
EndWith
ProcedureReturn -1
EndIf
EndProcedure
Procedure TimeGadget_DeleteSelection(*pTimeGadget.TTimeInput)
If IsGadget(*pTimeGadget\gid)
With *pTimeGadget
If \cursor\length < 0
\value = Left(\value, \cursor\fpos) + Mid(\value, \cursor\pos + 1)
\cursor\pos = \cursor\fpos
\cursor\length = 0
ProcedureReturn #True
ElseIf \cursor\length > 0
\value = Left(\value, \cursor\pos) + Mid(\value, \cursor\fpos + 1)
\cursor\fpos = \cursor\pos
\cursor\length = 0
ProcedureReturn #True
EndIf
EndWith
EndIf
ProcedureReturn #False
EndProcedure
Procedure TimeGadget_SetLocalTime(*pTimeGadget.TTimeInput)
Protected now.i, *ltime.TTimeValue, timeStr.s
time(@now)
*ltime = localtime(@now)
timeStr = RSet(Str(*ltime\hour),2,"0") + ":"+ RSet(Str(*ltime\minute),2,"0") + ":" + RSet(Str(*ltime\second),2,"0")
TimeGadget_SetTimeString(*pTimeGadget, timeStr)
EndProcedure
Procedure TimeGadget_SetUTCTime(*pTimeGadget.TTimeInput)
Protected now.i, *utime.TTimeValue, timeStr.s
time(@now)
*utime = gmtime(@now)
timeStr = RSet(Str(*utime\hour),2,"0") + ":"+ RSet(Str(*utime\minute),2,"0") + ":" + RSet(Str(*utime\second),2,"0")
TimeGadget_SetTimeString(*pTimeGadget, timeStr)
EndProcedure
Procedure DrawClock(*pTimeGadget.TTimeInput, gid)
Protected.i hour, minute, ufont
Protected.i h, m, s
h = TimeGadget_GetHour(*pTimeGadget)
m = TimeGadget_GetMinute(*pTimeGadget)
s = TimeGadget_GetSecond(*pTimeGadget)
StartVectorDrawing(CanvasVectorOutput(gid))
VectorSourceColor(RGBA(0, 0, 0, 255))
MovePathCursor(0, 0)
AddPathCircle(50, 50, 50)
FillPath()
StrokePath(1)
ClosePath()
ufont = LoadFont(#PB_Any, "Times", 8)
VectorFont(FontID(ufont))
;Stunden-Ziffern
For hour = 1 To 12
ux = 50 + Sin(Radian(360/12*hour)) * 40 - VectorTextWidth(Str(hour))/2
uy = 50 + -Cos(Radian(360/12*hour)) * 40 - VectorTextHeight(Str(hour))/2
VectorSourceColor(RGBA(255, 255, 255, 255))
MovePathCursor(ux, uy)
DrawVectorText(Str(hour))
Next
;Minuten/Sekunden
For minute = 1 To 60
ux = 50 + Sin(Radian(360/60*minute)) * 40
uy = 50 + -Cos(Radian(360/60*minute)) * 40
Next
;(Die Uhr wird auf 360 Grad (12 Uhr) oben eingestellt!)
;Die Zeiger:
;Degree = 360 / Anzahl_Ziffern * Aktuelle_Ziffer
;x = mitte_x + Sin(Rad(Degree)) * radius
;y = mitte_y + -Cos(Rad(Degree)) * radius
;Stundenzeiger
ux = 50 + Sin(Radian(360/12*(h+(m/60)))) * 30
uy = 50 + -Cos(Radian(360/12*(h+(m/60)))) * 30
MovePathCursor(50, 50)
AddPathLine(ux, uy)
StrokePath(3)
ClosePath()
;Minutenzeiger
ux = 50 + Sin(Radian(360/60*m)) * 40
uy = 50 + -Cos(Radian(360/60*m)) * 40
MovePathCursor(50, 50)
AddPathLine(ux, uy)
StrokePath(2)
ClosePath()
;Sekundenzeiger
ux = 50 + Sin(Radian(360/60*s)) * 40
uy = 50 + -Cos(Radian(360/60*s)) * 40
MovePathCursor(50, 50)
AddPathLine(ux, uy)
StrokePath(1)
ClosePath()
StopVectorDrawing()
EndProcedure
Procedure TimeGadget_ShowAnalog(*pTimeGadget.TTimeInput)
Protected.i mouse_x, mouse_y, cav
If IsGadget(*pTimeGadget\gid)
ExamineDesktops()
mouse_x = DesktopMouseX()
mouse_y = DesktopMouseY()
AClockWin = OpenWindow(#PB_Any, mouse_x, mouse_y, 100, 100, "", #PB_Window_BorderLess)
If AClockWin <> 0
cav = CanvasGadget(#PB_Any, 0, 0, 100, 100)
DrawClock(*pTimeGadget, cav)
EndIf
EndIf
EndProcedure
Procedure TimeGadget_SetEvent_MenuExceptions(Map vMenuExceptions())
CopyMap(vMenuExceptions(), MenuExceptions())
EndProcedure
Procedure TimeGadget_Event(*pTimeGadget.TTimeInput, Win.i, WindowEvent.i)
Protected evt.b = #False
Protected cursor_pos.i
Protected afocus.b = #False
Protected select_mode.b = #False
Protected regex.i
If IsGadget(*pTimeGadget\gid)
With *pTimeGadget
Select WindowEvent
Case #PB_Event_Menu
If GetActiveGadget() = \gid
ForEach MenuExceptions()
If Str(EventMenu()) = MapKey(MenuExceptions())
Select MenuExceptions()
Case #PB_Shortcut_Left
If \cursor\pos > 0 : \cursor\pos - 3 : EndIf
evt = #True
Case #PB_Shortcut_Right
If \cursor\pos < Len(\value) : \cursor\pos + 3 : EndIf
evt = #True
Case #PB_Shortcut_Down
TimeGadget_ChangeTime(*pTimeGadget, \cursor\pos, #True)
evt = #True
Case #PB_Shortcut_Up
TimeGadget_ChangeTime(*pTimeGadget, \cursor\pos, #False)
evt = #True
Case #PB_Shortcut_End
\cursor\pos = Len(\value)
evt = #True
Case #PB_Shortcut_Home
\cursor\pos = 0
evt = #True
Case #PB_Shortcut_Back
If Not TimeGadget_DeleteSelection(*pTimeGadget)
If \cursor\pos > 0
\value = Left(\value, \cursor\pos - 1) + Mid(\value, \cursor\pos + 1)
\cursor\pos - 1
EndIf
EndIf
evt = #True
Case #PB_Shortcut_Delete
If Not TimeGadget_DeleteSelection(*pTimeGadget)
If \cursor\pos < Len(\value)
\value = Left(\value, \cursor\pos) + Mid(\value, \cursor\pos + 2)
EndIf
EndIf
evt = #True
EndSelect
EndIf
Next
EndIf
Case #PB_Event_Gadget
If EventGadget() = \gid
Select EventType()
Case #PB_EventType_LeftButtonDown
If \center = #True
cursor_pos = TimeGadget_GetInputPosition(*pTimeGadget, (\w / 2)-(\cursor\cwidth / 2), (\h / 2)-(\cursor\cheight / 2))
Else
cursor_pos = TimeGadget_GetInputPosition(*pTimeGadget, 2, (\h / 2)-(\cursor\cheight / 2))
EndIf
If cursor_pos <> -1
If cursor_pos < 3
cursor_pos = 1
ElseIf cursor_pos > 2 And cursor_pos < 6
cursor_pos = 4
ElseIf cursor_pos > 5 And cursor_pos < 9
cursor_pos = 7
EndIf
\cursor\pos = cursor_pos - 1
\cursor\fpos = cursor_pos - 1
\cursor\length = 2
evt = #True
Else
\cursor\length = 0
EndIf
Case #PB_EventType_RightButtonDown
If AClockWin = 0
TimeGadget_ShowAnalog(*pTimeGadget)
ElseIf AClockWin <> 0
CloseWindow(AClockWin)
AClockWin = 0
EndIf
Case #PB_EventType_RightButtonUp
If AClockWin <> 0
CloseWindow(AClockWin)
AClockWin = 0
EndIf
Case #PB_EventType_MouseWheel
If GetGadgetAttribute(\gid, #PB_Canvas_WheelDelta) = 1
TimeGadget_ChangeTime(*pTimeGadget, \cursor\pos, #False)
ElseIf GetGadgetAttribute(\gid, #PB_Canvas_WheelDelta) = -1
TimeGadget_ChangeTime(*pTimeGadget, \cursor\pos, #True)
EndIf
Case #PB_EventType_Focus
\isfocus = #True
Case #PB_EventType_LostFocus
\isfocus = #False
\cursor\length = 0
Case #PB_EventType_LeftButtonUp
select_mode = #False
Case #PB_EventType_Input
regex = CreateRegularExpression(#PB_Any, "[0-9 :]")
If regex
ExamineRegularExpression(regex, Chr(GetGadgetAttribute(\gid, #PB_Canvas_Input)))
If Not NextRegularExpressionMatch(regex)
Debug "Input Error!"
ElseIf Len(\value) <= 8
If TimeGadget_DeleteSelection(*pTimeGadget)
\value = Left(\value, \cursor\pos) + Chr(GetGadgetAttribute(\gid, #PB_Canvas_Input)) + Mid(\value, \cursor\pos + 3)
If Len(\value) > 8
\value = Left(Left(\value, \cursor\pos) + Chr(GetGadgetAttribute(\gid, #PB_Canvas_Input)) + Mid(\value, \cursor\pos + 1), Len(\value)-1)
EndIf
Else
\value = Left(\value, \cursor\pos) + Chr(GetGadgetAttribute(\gid, #PB_Canvas_Input)) + Mid(\value, \cursor\pos + 1)
If Len(\value) > 8
\value = Left(Left(\value, \cursor\pos) + Chr(GetGadgetAttribute(\gid, #PB_Canvas_Input)) + Mid(\value, \cursor\pos + 1), Len(\value)-1)
EndIf
EndIf
\cursor\pos + 1
EndIf
FreeRegularExpression(regex)
EndIf
evt = #True
Case #PB_EventType_KeyDown
Select GetGadgetAttribute(\gid, #PB_Canvas_Key)
Case #PB_Shortcut_Left
If \cursor\pos > 0 : \cursor\pos - 3 : EndIf
evt = #True
Case #PB_Shortcut_Right
If \cursor\pos < Len(\value) : \cursor\pos + 3 : EndIf
evt = #True
Case #PB_Shortcut_Down
TimeGadget_ChangeTime(*pTimeGadget, \cursor\pos, #True)
evt = #True
Case #PB_Shortcut_Up
TimeGadget_ChangeTime(*pTimeGadget, \cursor\pos, #False)
evt = #True
Case #PB_Shortcut_End
\cursor\pos = Len(\value)
evt = #True
Case #PB_Shortcut_Home
\cursor\pos = 0
evt = #True
Case #PB_Shortcut_Back
If Not TimeGadget_DeleteSelection(*pTimeGadget)
If \cursor\pos > 0
\value = Left(\value, \cursor\pos - 1) + Mid(\value, \cursor\pos + 1)
\cursor\pos - 1
EndIf
EndIf
evt = #True
Case #PB_Shortcut_Delete
If Not TimeGadget_DeleteSelection(*pTimeGadget)
If \cursor\pos < Len(\value)
\value = Left(\value, \cursor\pos) + Mid(\value, \cursor\pos + 2)
EndIf
EndIf
evt = #True
EndSelect
EndSelect
EndIf
EndSelect
EndWith
EndIf
EndProcedure
Procedure GetCursorPosition(*pTimeGadget.TTimeInput)
ProcedureReturn TextWidth(Left(*pTimeGadget\value, *pTimeGadget\cursor\pos))
EndProcedure
Procedure GetCursorLength(*pTimeGadget.TTimeInput)
ProcedureReturn TextWidth(Left(*pTimeGadget\value, *pTimeGadget\cursor\pos + *pTimeGadget\cursor\length)) - TextWidth(Left(*pTimeGadget\value, *pTimeGadget\cursor\pos))
EndProcedure
Procedure TimeGadget_GetCursorPosition(*pTimeGadget.TTimeInput)
ProcedureReturn *pTimeGadget\cursor\pos
EndProcedure
Procedure TimeGadget_ChangeFont(*pTimeGadget.TTimeInput, font_nr.i)
If IsGadget(*pTimeGadget\gid)
With *pTimeGadget
\font = font_nr
EndWith
EndIf
EndProcedure
Procedure TimeGadget_ChangeColor(*pTimeGadget.TTimeInput, bgcolor.i, fgcolor.i = 0)
If IsGadget(*pTimeGadget\gid)
With *pTimeGadget
\bgcolor = bgcolor
\fgcolor = fgcolor
EndWith
EndIf
EndProcedure
Procedure TimeGadget_Update(*pTimeGadget.TTimeInput, show_cursor.b = #False)
Protected.i a
If IsGadget(*pTimeGadget\gid)
With *pTimeGadget
StartDrawing(CanvasOutput(\gid))
DrawingMode(#PB_2DDrawing_Default)
If IsFont(\font)
DrawingFont(FontID(\font))
EndIf
\cursor\cheight = TextHeight(\value)
\cursor\cwidth = TextWidth(\value)
Box(0, 0, \w, \h, \bgcolor)
If \center = #True
DrawText((\w / 2)-(TextWidth(\value) / 2), (\h / 2)-(TextHeight(\value) / 2), \value, \fgcolor, \bgcolor)
Else
DrawText(2, (\h / 2)-(TextHeight(\value) / 2), \value, \fgcolor, \bgcolor)
EndIf
DrawingMode(#PB_2DDrawing_XOr)
If \cursor\length < 0
If \center = #True
Box((\w / 2)-(TextWidth(\value) / 2) + GetCursorPosition(*pTimeGadget) + GetCursorLength(*pTimeGadget), (\h / 2)-(TextHeight(\value) / 2), -GetCursorLength(*pTimeGadget), TextHeight(" "))
Else
Box(2 + GetCursorPosition(*pTimeGadget) + GetCursorLength(*pTimeGadget), (\h / 2)-(TextHeight(\value) / 2), -GetCursorLength(*pTimeGadget), TextHeight(" "))
EndIf
ElseIf \cursor\length > 0
If \center = #True
Box((\w / 2)-(TextWidth(\value) / 2) + GetCursorPosition(*pTimeGadget) + 1, (\h / 2)-(TextHeight(\value) / 2), GetCursorLength(*pTimeGadget) - 1, TextHeight(" "))
Else
Box(2 + GetCursorPosition(*pTimeGadget) + 1, (\h / 2)-(TextHeight(\value) / 2), GetCursorLength(*pTimeGadget) - 1, TextHeight(" "))
EndIf
EndIf
DrawingMode(#PB_2DDrawing_Default)
If show_cursor = #True And \isfocus = #True
If \center = #True
Line((\w / 2)-(TextWidth(\value) / 2) + GetCursorPosition(*pTimeGadget), (\h / 2)-(TextHeight(\value) / 2), 1, TextHeight(" "), RGB(0,0,0))
Else
Line(2 + GetCursorPosition(*pTimeGadget), (\h / 2)-(TextHeight(\value) / 2), 1, TextHeight(" "), RGB(0,0,0))
EndIf
EndIf
StopDrawing()
EndWith
EndIf
EndProcedure
Procedure TimeGadget_Resize(*pTimeGadget.TTimeInput, x, y, w, h)
If IsGadget(*pTimeGadget\gid)
With *pTimeGadget
If x <> #PB_Ignore And x > 0
\x = x
EndIf
If y <> #PB_Ignore And y > 0
\y = y
EndIf
If w <> #PB_Ignore And w > 0
\w = w
EndIf
If h <> #PB_Ignore And h > 0
\h = h
EndIf
ResizeGadget(*pTimeGadget\gid, \x, \y, \w, \h)
TimeGadget_Update(*pTimeGadget)
EndWith
EndIf
EndProcedure
;Time-Gadget-Constructor
Procedure.i TimeGadget(gid.i, xpos.i, ypos.i, width.i, height.i, timeStr.s, flag.i = 0)
Protected *pTimeGadget.TTimeInput = AllocateMemory(SizeOf(TTimeInput))
Protected pid.i, k.i
pid = CanvasGadget(gid, xpos, ypos, width, height, #PB_Canvas_Border|#PB_Canvas_Keyboard)
If pid <> 0
If gid = -1
SetGadgetAttribute(pid, #PB_Canvas_Cursor, #PB_Cursor_IBeam)
Else
SetGadgetAttribute(gid, #PB_Canvas_Cursor, #PB_Cursor_IBeam)
EndIf
With *pTimeGadget
If gid = -1
\gid = pid
Else
\gid = gid
EndIf
\x = xpos
\y = ypos
\h = height
\w = width
If flag = 0
;auto-center
\center = #True
Else
;no-center
\center = #False
EndIf
\font = -1
\bgcolor = RGB(255,255,255)
\fgcolor = RGB(0,0,0)
EndWith
TimeGadget_SetTimeString(*pTimeGadget, timeStr)
ProcedureReturn *pTimeGadget
EndIf
ProcedureReturn -1
EndProcedure
;Time-Gadget-Destructor
Procedure TimeGadget_Destroy(*pTimeGadget.TTimeInput)
If IsGadget(*pTimeGadget\gid)
FreeGadget(*pTimeGadget\gid)
FreeMemory(*pTimeGadget)
EndIf
EndProcedure
EndModule
Enumeration
#Win
#ControlTimer
#SecondTimer
EndEnumeration
UseModule TimeGadget
Global *vTimeGadget.TTimeInput, atimeStr.s
Global *vTimeGadget2.TTimeInput
If OpenWindow(#Win, 0, 0, 200, 100, "Time-Control", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
atimeStr = RSet(Str(Hour(Date())), 2, "0") + ":" + RSet(Str(Minute(Date())), 2, "0") + ":" + RSet(Str(Second(Date())), 2, "0")
*vTimeGadget = TimeGadget(0, 10, 10, 80, 20, "00:00:00", #True)
;Debug *vTimeGadget
*vTimeGadget2 = TimeGadget(1, 10, 50, 80, 20, "00:00:00")
;Debug *vTimeGadget2
TimeGadget_SetTimeString(*vTimeGadget, atimeStr)
TimeGadget_ChangeColor(*vTimeGadget, RGB(0,0,0), RGB(255, 255, 0))
TimeGadget_ChangeColor(*vTimeGadget2, RGB(255,255,0))
LoadFont(0, "ComicSansMS", 14)
TimeGadget_ChangeFont(*vTimeGadget2, 0)
TimeGadget_Resize(*vTimeGadget2, 10, 40, 180, 50)
;TimeGadget_SetLocalTime(*vTimeGadget2)
TimeGadget_SetUTCTime(*vTimeGadget2)
;Beim Shortcut-Problem ...
AddKeyboardShortcut(#Win, #PB_Shortcut_Right, 1)
AddKeyboardShortcut(#Win, #PB_Shortcut_Left, 2)
AddKeyboardShortcut(#Win, #PB_Shortcut_Up, 3)
AddKeyboardShortcut(#Win, #PB_Shortcut_Down, 4)
;.. muss/sollte/kann eine Ausnahmeliste erstellt werden!
NewMap ExMenuItem.i()
ExMenuItem("1") = #PB_Shortcut_Right
ExMenuItem("2") = #PB_Shortcut_Left
ExMenuItem("3") = #PB_Shortcut_Up
ExMenuItem("4") = #PB_Shortcut_Down
TimeGadget_SetEvent_MenuExceptions(ExMenuItem())
AddWindowTimer(#Win, #ControlTimer, 200)
AddWindowTimer(#Win, #SecondTimer, 1000) ;Durch Deaktivieren\Kommentieren läuft die Zeit nicht weiter !
Repeat
event = WaitWindowEvent()
If TimeGadget_Event(*vTimeGadget, #Win, event)
TimeGadget_Update(*vTimeGadget, #False)
EndIf
If TimeGadget_Event(*vTimeGadget2, #Win, event)
TimeGadget_Update(*vTimeGadget2, #False)
EndIf
Select event
Case #PB_Event_Menu
;Test!
If EventMenu() = 1 Or EventMenu() = 2 Or EventMenu() = 3 Or EventMenu() = 4
Debug "Key-Exception!"
EndIf
Case #PB_Event_CloseWindow
End
Case #PB_Event_Timer
Select EventTimer()
Case #ControlTimer
TimeGadget_Update(*vTimeGadget, #True)
TimeGadget_Update(*vTimeGadget2, #True)
Case #SecondTimer
atimeStr = RSet(Str(Hour(Date())), 2, "0") + ":" + RSet(Str(Minute(Date())), 2, "0") + ":" + RSet(Str(Second(Date())), 2, "0")
TimeGadget_SetTimeString(*vTimeGadget, atimeStr)
EndSelect
EndSelect
ForEver
TimeGadget_Destroy(*vTimeGadget)
TimeGadget_Destroy(*vTimeGadget2)
EndIf
UnuseModule TimeGadget
Was könnte man so alles an meiner "Wer hat an der Uhr gedreht"(TimeGadget) -Version noch alles verbessern ?