Verlängerter Buttondruck
Verlängerter Buttondruck
Hallo,
möchte wenn ich einen Button 4 Sekunden lang Drücke, ein Ereignis auslösen! Mein
Problem ist, wie mache ich das mit 5 Button? Finde nicht den richtigen Ansatz, hat jemand
eine Idee!
Gruss ... Velindos
möchte wenn ich einen Button 4 Sekunden lang Drücke, ein Ereignis auslösen! Mein
Problem ist, wie mache ich das mit 5 Button? Finde nicht den richtigen Ansatz, hat jemand
eine Idee!
Gruss ... Velindos
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Re: Verlängerter Buttondruck
>> "Problem ist, wie mache ich das mit 5 Button?"
Genauso wie du es mit einem Button machst, schließlich kannst du doch eh nur einen Button gleichzeitig 4 Sekunden lange drücken oder ?
Das heißt beim ersten Anschlag, TimeStamp speichern und dann Prüfen wann der aktuelle TimeStamp > gespeicherter TimeStamp+4000 ist.
Stellt sich die Frage in welchem Bereich du das brauchst ? Screen/Window/Allgemein
Genauso wie du es mit einem Button machst, schließlich kannst du doch eh nur einen Button gleichzeitig 4 Sekunden lange drücken oder ?
Das heißt beim ersten Anschlag, TimeStamp speichern und dann Prüfen wann der aktuelle TimeStamp > gespeicherter TimeStamp+4000 ist.
Stellt sich die Frage in welchem Bereich du das brauchst ? Screen/Window/Allgemein
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Re: Verlängerter Buttondruck
Vielleicht möchte er, dass ein Button, den er gedrückt hat, erst nach einer bestimmten Zeit wieder "normal" angezeigt werden soll. Sowas könnte man vielleicht mit #PB_Button_Toggle realisieren.
Nehmen wir mal an, wir hätten eine Reihe von Buttons, die er hintereinander drücken kann. Und diese sollen in der richtigen Reihenfolge wieder normal angezeigt werden. Aber in der Zwischenzeit sollen die Buttons "gedrückt" sein, bis seine 4 Sekunden vorbei sind.
Vielleicht soll das ein Spiel sein oder ein Drücksystem sein.
Oder vielleicht habe ich Velindos auch falsch verstanden, aber um zu sehen, was ich meinte:
Das ist nur ein Beispiel. Das könnte man natürlich mit einem Timer besser machen.
Nehmen wir mal an, wir hätten eine Reihe von Buttons, die er hintereinander drücken kann. Und diese sollen in der richtigen Reihenfolge wieder normal angezeigt werden. Aber in der Zwischenzeit sollen die Buttons "gedrückt" sein, bis seine 4 Sekunden vorbei sind.
Vielleicht soll das ein Spiel sein oder ein Drücksystem sein.
Oder vielleicht habe ich Velindos auch falsch verstanden, aber um zu sehen, was ich meinte:
Code: Alles auswählen
EnableExplicit
Define EventID
Define GID
Procedure TimerThread(GID)
Delay(3000)
SetGadgetState(GID,0)
EndProcedure
If OpenWindow(0,0,0,500,400,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ButtonGadget(1,10,10,100,20,"Button 1",#PB_Button_Toggle)
ButtonGadget(2,120,10,100,20,"Button 2",#PB_Button_Toggle)
ButtonGadget(3,230,10,100,20,"Button 3",#PB_Button_Toggle)
ButtonGadget(4,340,10,100,20,"Button 3",#PB_Button_Toggle)
Repeat
EventID=WaitWindowEvent()
If EventID=#PB_Event_Gadget
GID = EventGadget()
Select GID
Case 1 To 4
CreateThread(@TimerThread(),GID)
EndSelect
EndIf
If EventID = #PB_Event_CloseWindow
End
EndIf
ForEver
EndIf
Re: Verlängerter Buttondruck
Hallo,
bin gerade Unterwegs gewesen. Danke für eure Vorschläge. Was ich genau meine definiere ich so:
Ähnlich einer Radiosender-Schaltung, ich drücke den Button 1-5 und nach 5 Sekunden kommt ein Ereigniss wo ich den Sender auf jeweiligen Button zuweise(zB.Bt1=ARD, Bt2=ZDF usw.). Nun habe ich mir ein Beispiel aufgebaut, das ich in mein bestehendes Programm integrieren möchte, aber das Problem, das ich den Timer nicht starten kann, bzw. auch nicht ganz schlau bin wie das nach Erreichen der Zeit, mit den Button mache?
Gruss ... Velindos
bin gerade Unterwegs gewesen. Danke für eure Vorschläge. Was ich genau meine definiere ich so:
Ähnlich einer Radiosender-Schaltung, ich drücke den Button 1-5 und nach 5 Sekunden kommt ein Ereigniss wo ich den Sender auf jeweiligen Button zuweise(zB.Bt1=ARD, Bt2=ZDF usw.). Nun habe ich mir ein Beispiel aufgebaut, das ich in mein bestehendes Programm integrieren möchte, aber das Problem, das ich den Timer nicht starten kann, bzw. auch nicht ganz schlau bin wie das nach Erreichen der Zeit, mit den Button mache?
Code: Alles auswählen
EnableExplicit
Enumeration
#FrameMain
EndEnumeration
;-Constant
Enumeration
#B_Button1
#B_Button2
#B_Button3
#B_Button4
#B_Button5
#Timer1
#S_Button
EndEnumeration
If OpenWindow(#FrameMain,0,0,600,400,"Button-Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ButtonGadget(#B_Button1,10,10,100,20,"Button 1")
ButtonGadget(#B_Button2,120,10,100,20,"Button 2")
ButtonGadget(#B_Button3,230,10,100,20,"Button 3")
ButtonGadget(#B_Button4,340,10,100,20,"Button 4")
ButtonGadget(#B_Button5,450,10,100,20,"Button 5")
StringGadget(#S_Button,10,50,300,20,"Event")
EndIf
AddWindowTimer(#B_Button1, #Timer1, 4000)
Define EventID, Gadget, Event
Repeat
EventID=WaitWindowEvent()
;If Event = #PB_Event_Timer And EventTimer() = #Timer1
; SetGadgetText(#S_Button,"Button1 gedrückt Zeit erreicht!")
;EndIf
Select EventID
Case #PB_Event_CloseWindow:Break
Case #PB_Event_Timer
Select EventTimer()
Case #Timer1
SetGadgetText(#S_Button,"Timer hat ausgelöst!")
EndSelect
Case #PB_Event_Gadget
Gadget = EventGadget()
Select Gadget
Case #B_Button1
SetGadgetText(#S_Button,"Button1 gedrückt")
Case #B_Button2
SetGadgetText(#S_Button,"Button2 gedrückt")
Case #B_Button3
SetGadgetText(#S_Button,"Button3 gedrückt")
Case #B_Button4
SetGadgetText(#S_Button,"Button4 gedrückt")
Case #B_Button5
SetGadgetText(#S_Button,"Button5 gedrückt")
EndSelect
EndSelect
ForEver
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
- HeX0R
- Beiträge: 3042
- Registriert: 10.09.2004 09:59
- Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3 - Kontaktdaten:
Re: Verlängerter Buttondruck
Reicht es dir, wenn es nur unter Windows funktioniert?
Code: Alles auswählen
EnableExplicit
Enumeration
#FrameMain
EndEnumeration
;-Constant
Enumeration
#B_Button1
#B_Button2
#B_Button3
#B_Button4
#B_Button5
#Timer1
#S_Button
EndEnumeration
Procedure GetGadgetUnderMouse()
Protected hWND, CursorPos.POINT, Result = -1
If GetCursorPos_(@CursorPos)
If MapWindowPoints_(0, WindowID(#FrameMain), @CursorPos, 1)
hWND = ChildWindowFromPoint_(WindowID(#FrameMain), PeekQ(@CursorPos))
If hWND
Result = GetDlgCtrlID_(hWND)
EndIf
EndIf
EndIf
ProcedureReturn Result
EndProcedure
Procedure main()
Protected Gadget, Event, i, Clicked, ClickTimeout
If OpenWindow(#FrameMain, 0, 0, 600, 400, "Button-Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ButtonGadget(#B_Button1, 10, 10, 100, 20, "Button 1")
ButtonGadget(#B_Button2, 120, 10, 100, 20, "Button 2")
ButtonGadget(#B_Button3, 230, 10, 100, 20, "Button 3")
ButtonGadget(#B_Button4, 340, 10, 100, 20, "Button 4")
ButtonGadget(#B_Button5, 450, 10, 100, 20, "Button 5")
StringGadget(#S_Button, 10, 50, 300, 20, "Event")
EndIf
Clicked = -1
Repeat
Select WaitWindowEvent(250)
Case #PB_Event_CloseWindow
Break
Case #WM_LBUTTONDOWN
;Check, if buttonhover:
Clicked = GetGadgetUnderMouse()
If Clicked >= #B_Button1 And Clicked <= #B_Button5
;Start
ClickTimeout = ElapsedMilliseconds() + 3000
SetGadgetText(#S_Button, "#B_Button" + Str(Clicked + 1) + " getting focus")
EndIf
Case #WM_LBUTTONUP
ClickTimeout = 0
Clicked = -1
SetGadgetText(#S_Button, "")
Case #WM_MOUSEMOVE
If Clicked <> -1
i = GetGadgetUnderMouse()
If i <> Clicked
ClickTimeout = 0
SetGadgetText(#S_Button, "#B_Button" + Str(Clicked + 1) + " lost focus")
ElseIf ClickTimeout = 0
SetGadgetText(#S_Button, "#B_Button" + Str(Clicked + 1) + " has the focus again, waiting 3 secs")
ClickTimeout = ElapsedMilliseconds() + 3000
EndIf
EndIf
Case 0
If ClickTimeout And ClickTimeout < ElapsedMilliseconds()
SetGadgetText(#S_Button, "Clicked 3 seconds on #B_Button" + Str(Clicked + 1))
ClickTimeout = 0
Clicked = -1
EndIf
EndSelect
ForEver
EndProcedure
main()
{Home}.:|:.{Codes}.:|:.{Downloads}.:|:.{History Viewer Online}.:|:.{Bier spendieren}
Re: Verlängerter Buttondruck
Hallo HeX0R, danke für den Vorschlag. Kann aber diese Sache nicht integrieren, da ich die Tasten einmal für Zuweisung(Normales Drücken des Button) verwende und nun beim Drücken länger als 4 Sekunden für die Speicherung. Das heisst es geht nicht übern Focus, sondern rein über die Button.
Nebenbei Danke an alle für die Vorschläge, wie gesagt ich denke es geht schon irgendwie über einen Timer, jedoch über die Verkettung der Button und Überwachung der Zeit, mit Ablauf der Zeit einer Abfrage des Button, ob er noch gedrückt ist.
Resume: Wo ich mir schwer tue, ist mit den Timer. Gibt es in Purebasic die Möglichkeit einen Timer zu starten bzw. bei Erreichen des eingestellten Wertes, ein Event? Das mit den ElapsedMilliseconds() ist woll nicht alles? Hat jemand vielleicht einen Ersatz etc...
Gruss ... Velindos
Nebenbei Danke an alle für die Vorschläge, wie gesagt ich denke es geht schon irgendwie über einen Timer, jedoch über die Verkettung der Button und Überwachung der Zeit, mit Ablauf der Zeit einer Abfrage des Button, ob er noch gedrückt ist.
Resume: Wo ich mir schwer tue, ist mit den Timer. Gibt es in Purebasic die Möglichkeit einen Timer zu starten bzw. bei Erreichen des eingestellten Wertes, ein Event? Das mit den ElapsedMilliseconds() ist woll nicht alles? Hat jemand vielleicht einen Ersatz etc...
Gruss ... Velindos
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Re: Verlängerter Buttondruck
Code: Alles auswählen
EnableExplicit
Enumeration
#FrameMain
EndEnumeration
;-Constant
Enumeration
#__firstButton
#B_Button1
#B_Button2
#B_Button3
#B_Button4
#B_Button5
#__lastButton
#S_Button
EndEnumeration
If OpenWindow(#FrameMain,0,0,600,400,"Button-Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ButtonGadget(#B_Button1,10,10,100,20,"Button 1")
ButtonGadget(#B_Button2,120,10,100,20,"Button 2")
ButtonGadget(#B_Button3,230,10,100,20,"Button 3")
ButtonGadget(#B_Button4,340,10,100,20,"Button 4")
ButtonGadget(#B_Button5,450,10,100,20,"Button 5")
StringGadget(#S_Button,10,50,300,20,"Event")
EndIf
Define EventID, Gadget, Event, activeGadget, timer
Define wmX, wmY, gadgetX, gadgetY, gadgetW, gadgetH
Repeat
EventID=WaitWindowEvent()
Select EventID
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Timer
timer = EventTimer()
If timer > #__firstButton And timer < #__lastButton
If GetGadgetData(timer)=#True
wmX = WindowMouseX(#FrameMain)
wmY = WindowMouseY(#FrameMain)
gadgetX = GadgetX(timer)
gadgetY = GadgetY(timer)
gadgetW = gadgetX + GadgetWidth(timer)
gadgetH = gadgetY + GadgetHeight(timer)
; Mouse Cursor noch immer über dem Button?
If wmX >= gadgetX And wmX <= gadgetW And wmY >= gadgetY And wmY <= gadgetH
SetGadgetData(timer,#False)
SetGadgetText(#S_Button,GetGadgetText(timer)+" - gespeichert")
EndIf
EndIf
RemoveWindowTimer(#FrameMain,timer)
EndIf
Case #WM_LBUTTONDOWN
activeGadget = GetActiveGadget()
If activeGadget > #__firstButton And activeGadget < #__lastButton
AddWindowTimer(#FrameMain, activeGadget, 4000)
SetGadgetData(activeGadget,#True)
EndIf
Case #PB_Event_Gadget
gadget = EventGadget()
If gadget > #__firstButton And gadget < #__lastButton
RemoveWindowTimer(#FrameMain,gadget)
SetGadgetData(gadget,#False)
SetGadgetText(#S_Button,GetGadgetText(gadget)+" gedrückt")
EndIf
EndSelect
ForEver

Wenn man aber einen Button drückt und dann, während des drückens,
den Button mit der Mouse verlässt, haut es nicht mehr hin - wenn
man innerhalb der Timerzeit wieder mit der Mouse über den Button geht.
Habe im Moment keine Zeit mehr, muß gleich auf Arbeit.
Vielleicht kann man das als Grundidee nehmen und Du oder
andere Helfer erweitern es.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Re: Verlängerter Buttondruck
Dank HeXOR kam es mir unter der Dusche: #WM_LBUTTONUP fehlte. 

Code: Alles auswählen
EnableExplicit
Enumeration
#FrameMain
EndEnumeration
;-Constant
Enumeration
#__firstButton
#B_Button1
#B_Button2
#B_Button3
#B_Button4
#B_Button5
#__lastButton
#S_Button
EndEnumeration
If OpenWindow(#FrameMain,0,0,600,400,"Button-Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ButtonGadget(#B_Button1,10,10,100,20,"Button 1")
ButtonGadget(#B_Button2,120,10,100,20,"Button 2")
ButtonGadget(#B_Button3,230,10,100,20,"Button 3")
ButtonGadget(#B_Button4,340,10,100,20,"Button 4")
ButtonGadget(#B_Button5,450,10,100,20,"Button 5")
StringGadget(#S_Button,10,50,300,20,"Event")
EndIf
Define EventID, Gadget, Event, activeGadget, timer
Define wmX, wmY, gadgetX, gadgetY, gadgetW, gadgetH
Repeat
EventID=WaitWindowEvent()
Select EventID
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Timer
timer = EventTimer()
If timer > #__firstButton And timer < #__lastButton
If GetGadgetData(timer)=#True ; Button noch gedrückt?
wmX = WindowMouseX(#FrameMain)
wmY = WindowMouseY(#FrameMain)
gadgetX = GadgetX(timer)
gadgetY = GadgetY(timer)
gadgetW = gadgetX + GadgetWidth(timer)
gadgetH = gadgetY + GadgetHeight(timer)
; Mouse Cursor noch immer über dem Button?
If wmX >= gadgetX And wmX <= gadgetW And wmY >= gadgetY And wmY <= gadgetH
SetGadgetData(timer,#False)
SetGadgetText(#S_Button,GetGadgetText(timer)+" - gespeichert")
EndIf
EndIf
RemoveWindowTimer(#FrameMain,timer)
EndIf
Case #WM_LBUTTONDOWN
activeGadget = GetActiveGadget()
If activeGadget > #__firstButton And activeGadget < #__lastButton
AddWindowTimer(#FrameMain, activeGadget, 4000)
SetGadgetData(activeGadget,#True) ; #True = Button gedrückt
EndIf
Case #WM_LBUTTONUP
activeGadget = GetActiveGadget()
If activeGadget > #__firstButton And activeGadget < #__lastButton
SetGadgetData(activeGadget,#False) ; #False = Button nicht mehr gedrückt
EndIf
Case #PB_Event_Gadget
gadget = EventGadget()
If gadget > #__firstButton And gadget < #__lastButton
RemoveWindowTimer(#FrameMain,gadget)
SetGadgetData(gadget,#False) ; #False = Button nicht mehr gedrückt
SetGadgetText(#S_Button,GetGadgetText(gadget)+" gedrückt")
EndIf
EndSelect
ForEver
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
- HeX0R
- Beiträge: 3042
- Registriert: 10.09.2004 09:59
- Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3 - Kontaktdaten:
Re: Verlängerter Buttondruck
Danilo hat geschrieben:Dank HeXOR kam es mir unter der Dusche [...]

{Home}.:|:.{Codes}.:|:.{Downloads}.:|:.{History Viewer Online}.:|:.{Bier spendieren}
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: Verlängerter Buttondruck
Sexy HeX0R 

PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
