Verlängerter Buttondruck

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Verlängerter Buttondruck

Beitrag von Velindos »

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
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Verlängerter Buttondruck

Beitrag von STARGÅTE »

>> "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
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
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Verlängerter Buttondruck

Beitrag von RSBasic »

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:

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
Das ist nur ein Beispiel. Das könnte man natürlich mit einem Timer besser machen.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Verlängerter Buttondruck

Beitrag von Velindos »

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?

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 
Gruss ... Velindos
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
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

Beitrag von HeX0R »

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()
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Verlängerter Buttondruck

Beitrag von Velindos »

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
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Verlängerter Buttondruck

Beitrag von Danilo »

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
Sollte erstmal funktionieren, wenn man es korrekt anwendet. ;)

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
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Verlängerter Buttondruck

Beitrag von Danilo »

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
Benutzeravatar
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

Beitrag von HeX0R »

Danilo hat geschrieben:Dank HeXOR kam es mir unter der Dusche [...]
:shock:
Benutzeravatar
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

Beitrag von ts-soft »

Sexy HeX0R :lol:
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.
Bild
Antworten