Seite 1 von 2

Verlängerter Buttondruck

Verfasst: 27.04.2011 08:06
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

Re: Verlängerter Buttondruck

Verfasst: 27.04.2011 09:46
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

Re: Verlängerter Buttondruck

Verfasst: 27.04.2011 12:01
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.

Re: Verlängerter Buttondruck

Verfasst: 27.04.2011 13:21
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

Re: Verlängerter Buttondruck

Verfasst: 27.04.2011 19:31
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()

Re: Verlängerter Buttondruck

Verfasst: 27.04.2011 19:56
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

Re: Verlängerter Buttondruck

Verfasst: 27.04.2011 20:03
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.

Re: Verlängerter Buttondruck

Verfasst: 27.04.2011 20:41
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

Re: Verlängerter Buttondruck

Verfasst: 27.04.2011 23:32
von HeX0R
Danilo hat geschrieben:Dank HeXOR kam es mir unter der Dusche [...]
:shock:

Re: Verlängerter Buttondruck

Verfasst: 27.04.2011 23:54
von ts-soft
Sexy HeX0R :lol: