Keypad: "Bitte geben Sie Ihre Geheimzahl ein"
Verfasst: 21.05.2025 05:01
Wie die Überschrift schon sagt, hier ist ein Keypad mit 12 Tasten, so wie am Geldautomaten, und ein Keypad mit nur 9 Tasten. Beide sind dafür gedacht einen Zahlencode einzugeben. Vielleicht kann man die Keypads mal bei einem RaspberryPi mit Touchscreen einsetzen. Das habe ich aber noch nicht ausprobiert.
Keypad mit 12 Tasten (10 Ziffern + OK + Korrektur):
Keypad mit 9 Tasten (Ziffern 1...9):
Keypad mit 12 Tasten (10 Ziffern + OK + Korrektur):
Code: Alles auswählen
; Keypad mit 12 Tasten
; Eine Anzahl Ziffern müssen in der richtigen Reihenfolge angeklickt und dann mit OK bestätigt werden.
; Esc = Ende
EnableExplicit
#Stretch = 60 ; Fenstergröße = #Stretch * 3
#Code = "5193" ; beliebige Codelänge (mögliche Zeichen: 0...9)
#DrkGrn = $0DAB06 ; dunkelgrün
Global keyboard, canvas, xst, yst, nbr, code$
LoadFont(1, "Arial", #Stretch / 3, #PB_Font_Bold)
Procedure ShowKeypad(x = 0, y = 0, width = 3 * #Stretch, height = 4 * #Stretch)
Protected aa, ss = #Stretch/20, cnt, mc
keyboard = OpenWindow(#PB_Any, x, y, width, height, "", #PB_Window_BorderLess | #PB_Window_ScreenCentered)
canvas = CanvasGadget(#PB_Any, 0,0, width, height)
AddKeyboardShortcut(keyboard, #PB_Shortcut_Escape, 111) ; Fenster kann mit Escape geschlossen werden
StartDrawing(CanvasOutput(canvas))
Box(0, 0, 3 * #Stretch, 4 * #Stretch, #White) ; Grundfarbe
For aa = 0 To ss
Line(#Stretch - (ss / 2) + aa, 0, 1, 4 * #Stretch, #Black) ; vertikal
Line((#Stretch * 2) - (ss / 2) + aa, 0, 1, 4 * #Stretch, #Black) ; vertikal
Line(0, #Stretch - (ss / 2) + aa, 3 * #Stretch, 1, #Black) ; horizontal 1
Line(0, (#Stretch * 2) - (ss / 2) + aa, 3 * #Stretch, 1, #Black) ; horizontal 2
Line(0, (#Stretch * 3) - (ss / 2) + aa, 3 * #Stretch, 1, #Black) ; horizontal 3
Next
DrawingFont(FontID(1))
For cnt = 0 To 8
mc = cnt % 3 ; Modulo will nicht mit Fließkommazahlen zusammenarbeiten
DrawText((0.4 + mc) * #Stretch, (0.3 + Int(cnt / 3)) * #Stretch, Str(cnt + 1), #Black, #White)
Next
DrawText(0.4 * #Stretch, (0.3 + 3) * #Stretch, "C", #Red, #White)
DrawText(1.4 * #Stretch, (0.3 + 3) * #Stretch, "0", #Black, #White)
DrawText(2.2 * #Stretch, (0.3 + 3) * #Stretch, "OK", #DrkGrn, #White)
StopDrawing()
EndProcedure
Procedure resetNumber()
; löscht die grünen Punkte 200ms nach dem Klick
StartDrawing(CanvasOutput(canvas))
Circle(xst, yst, #Stretch / 3, #White)
DrawingFont(FontID(1))
Select nbr
Case 0 To 9
DrawText(xst - #Stretch / 10, yst - #Stretch / 5, Str(nbr), #Black, #White)
Case 10
DrawText(0.4 * #Stretch, (0.3 + 3) * #Stretch, "C", #Red, #White)
Case 12
DrawText(2.2 * #Stretch, (0.3 + 3) * #Stretch, "OK", #DrkGrn, #White)
EndSelect
StopDrawing()
RemoveWindowTimer(keyboard, 333)
EndProcedure
Procedure onLeftklick()
; Die Nummer von dem Feld, auf das geklickt wurde, in nbr speichern.
; Die Position von dem Feld, auf das geklickt wurde, in xst und yst speichern.
; Grüne Punkte bei jedem Klick auf ein Feld setzen.
; Timer setzen um jeden Punkt nach 0,2s wieder zu entfernen.
; Die Nummern sammeln und bei Klick auf "CR" auswerten.
Protected xx, yy
xx = WindowMouseX(keyboard) / #Stretch
yy = WindowMouseY(keyboard) / #Stretch
Select yy
Case 0 : nbr = xx + 1
Case 1 : nbr = xx + 4
Case 2 : nbr = xx + 7
Case 3 : nbr = xx + 10
EndSelect
xst = (0.5 + xx) * #Stretch
yst = (0.5 + yy) * #Stretch
; grüne Punkte in den Feldern anzeigen, auf die geklickt wurde
StartDrawing(CanvasOutput(canvas))
Circle(xst, yst, #Stretch / 3, #DrkGrn)
StopDrawing()
AddWindowTimer(keyboard, 333, 200) ; grüne Punkte nach 200ms wieder löschen
Select nbr
Case 1 To 9
code$ = code$ + Str(nbr)
Case 10
code$ = Left(code$, Len(code$) - 1) ; Backspace
; code$ = "" ; alternativ
Case 11
nbr = 0
code$ = code$ + "0" ; Null
Case 12
If code$ = #Code
Debug "Ok"
Else
Debug "Fehler"
EndIf
code$ = ""
EndSelect
EndProcedure
CompilerIf #PB_Compiler_IsMainFile
Define event
ShowKeypad()
Repeat
event = WaitWindowEvent()
Select event
Case #PB_Event_Gadget
If EventType() = #PB_EventType_LeftClick
onLeftklick()
EndIf
Case #PB_Event_Timer
If EventTimer() = 333
resetNumber() ; die grünen Punkte wieder löschen
EndIf
Case #PB_Event_Menu
If EventMenu() = 111
Break ; Escape-Taste zum beenden
EndIf
EndSelect
ForEver
CompilerEndIf
Keypad mit 9 Tasten (Ziffern 1...9):
Code: Alles auswählen
; Keypad mit 9 Tasten
; In einer vorgegebenen Zeit muss eine Anzahl Ziffern in der richtigen Reihenfolge angeklickt werden.
; Esc = Ende
EnableExplicit
#Stretch = 60 ; Fenstergröße = #Stretch * 3
#Code = "5193" ; beliebige Codelänge (mögliche Zeichen: 1...9)
#ReplyNow = 1 ; 1 = Antwortet sofort, 0 = wartet bis #TimeOut abgelaufen ist und wertet dann erst die geklickten Felder aus
#Color = $0DAB06 ; grün
#TimeOut = 2000 ; ms zwischen den Klicks
Global keyboard, canvas, xst, yst, nbr, code$
LoadFont(1, "Arial", #Stretch/3, #PB_Font_Bold)
Procedure ShowKeypad(x = 0, y = 0, width = 3*#Stretch, height = 3*#Stretch)
Protected aa, ss = #Stretch/20, cnt, mc
keyboard = OpenWindow(#PB_Any, x, y, width, height, "", #PB_Window_BorderLess | #PB_Window_ScreenCentered)
canvas = CanvasGadget(#PB_Any, 0,0, width, height)
AddKeyboardShortcut(keyboard, #PB_Shortcut_Escape, 111) ; Fenster kann mit Escape geschlossen werden
StartDrawing(CanvasOutput(canvas))
Box(0, 0, 3 * #Stretch, 3 * #Stretch, #White) ; Grundfarbe
For aa = 0 To ss
Line(#Stretch - (ss / 2) + aa, 0, 1, 3 * #Stretch, #Color)
Line((#Stretch * 2) - (ss / 2) + aa, 0, 1, 3 * #Stretch, #Color)
Line(0, #Stretch - (ss / 2) + aa, 3 * #Stretch, 1, #Color)
Line(0, (#Stretch * 2) - (ss / 2) + aa, 3 * #Stretch, 1, #Color)
Next
DrawingFont(FontID(1))
For cnt = 0 To 8
mc = cnt % 3 ; Modulo will nicht mit Fließkommazahlen zusammenarbeiten
DrawText((0.4 + mc) * #Stretch, (0.3 + Int(cnt / 3)) * #Stretch, Str(cnt + 1), #Color, #White)
Next
StopDrawing()
EndProcedure
Procedure resetNumber()
; löscht die grünen Punkte
StartDrawing(CanvasOutput(canvas))
Circle(xst, yst, #Stretch/4, #White)
DrawingFont(FontID(1))
DrawText(xst - #Stretch/10, yst - #Stretch / 5, Str(nbr), #Color, #White)
StopDrawing()
RemoveWindowTimer(keyboard, 333)
EndProcedure
Procedure onLeftklick()
; die Nummer von dem Feld ermitteln, auf das geklickt wurde
Protected xx, yy
RemoveWindowTimer(keyboard, 222)
xx = WindowMouseX(keyboard) / #Stretch
yy = WindowMouseY(keyboard) / #Stretch
Select yy
Case 0 : nbr = xx + 1
Case 1 : nbr = xx + 4
Case 2 : nbr = xx + 7
EndSelect
xst = (#Stretch / 2) + (#Stretch * xx)
yst = (#Stretch / 2) + (#Stretch * yy)
; grüne Punkte in den Feldern anzeigen, auf die geklickt wurde
StartDrawing(CanvasOutput(canvas))
Circle(xst, yst, #Stretch / 4, #Color)
StopDrawing()
AddWindowTimer(keyboard, 333, 200) ; grüne Punkte nach 200ms wieder löschen
code$ = code$ + Str(nbr)
AddWindowTimer(keyboard, 222, #TimeOut)
If #ReplyNow = 1
If Len(code$) = Len(#Code) ; wenn alle nötigen Klicks erfolgt sind
If code$ = #Code
Debug "Ok"
Else
Debug "Codefehler"
EndIf
RemoveWindowTimer(keyboard, 222)
code$ = ""
EndIf
EndIf
EndProcedure
Procedure onTimeout()
RemoveWindowTimer(keyboard, 222)
If #ReplyNow = 1
Debug "Zeitfehler"
Else
If code$ = #Code
Debug "Ok"
Else
Debug "Fehler"
EndIf
EndIf
code$ = ""
EndProcedure
CompilerIf #PB_Compiler_IsMainFile
Define event
ShowKeypad()
Repeat
event = WaitWindowEvent()
Select event
Case #PB_Event_Gadget
If EventType() = #PB_EventType_LeftClick
onLeftklick()
EndIf
Case #PB_Event_Timer
Select EventTimer()
Case 222
onTimeout()
Case 333 ; die grünen Punkte wieder löschen
resetNumber()
EndSelect
Case #PB_Event_Menu
Select EventMenu()
Case 111 ; Escape-Taste
Break
EndSelect
EndSelect
ForEver
CompilerEndIf