Mausrad- (wheel-) Event-Signale stoppen? [erledigt]

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Mausrad- (wheel-) Event-Signale stoppen?

Beitrag von brandelh »

Tom hat geschrieben:Aus "CLEAR TYPEAHEAD" macht der Präprozessor "_Keyboard()". Aus "KEYBOARD ''" wird _Keyboard(''). Ist also dasselbe.
ich sehe da noch einen Parameter beim KEYBOARD "" ;-)
Es kann sein, dass es intern das Gleiche macht, aber es könnte auch sein, dass ein Stringparameter nur auf Tastatureingaben reagiert ;-)

Probieren sollte man es auf jeden Fall :D
Gruß
Hubert
DelUser01

Re: Mausrad- (wheel-) Event-Signale stoppen?

Beitrag von DelUser01 »

Hallo

habe da jetzt Mal eine mehrstufige Bremse zusammengebaut:
- die ersten 10 Events werden durchgelassen,
- bis 25 werden die Events nur alle 0.075 Sek durchgelassen,
- ab 25 nur noch alle 0.15 Sekunden.
- Eine Wheel-Pause von 0.5 Sekunden setzt alles wieder zurück.
- (korrigiert:) Events auf GUI-Ebene werden gleich weitergegeben.

Code: Alles auswählen

Function EinMWheelKey( aIn , lGUI )

Static nLastSecU := 0
Static nLastSecD := 0
Static nCountU   := 0
Static nCountD   := 0

Local  lWheelOK  := .F.
Local  lNotInGUI := .T.
Local  nSecChk   := Seconds()
Local  nFastCnt1 := 10         // Zähler
Local  nFastCnt2 := 25         // Zähler
Local  nFastRes  := 0.5        // Sekunden
Local  nSecSkip1 := 0.075      // Sekunden
Local  nSecSkip2 := 0.15       // Sekunden
Local  nSecSkipX
Local  nDif

If aIn[6,2] >= 1   // UP
   aIn[1] := xbeK_UP
Else
   aIn[1] := xbeK_DOWN
EndIf

If lGUI .And. lNotInGUI
   lWheelOK := .T.
Else

   If aIn[6,2] >= 1   // UP
      nCountD := 0
      nCountU++

      If nCountU <= nFastCnt1
         lWheelOK := .T.
      Else
         If nCountU > nFastCnt2
            nSecSkipX := nSecSkip2
         Else
            nSecSkipX := nSecSkip1
         EndIf
         nDif := nSecChk - nLastSecU
         If nDif > nFastRes
            nCountU  := 1
            lWheelOK := .T.
         ElseIf nDif > nSecSkipX
            lWheelOK := .T.
         EndIf
      EndIf
      If lWheelOK
         nLastSecU := nSecChk
      EndIf
   Else   // DOWN
      nCountU := 0
      nCountD++

      If nCountD <= nFastCnt1
         lWheelOK := .T.
      Else
         If nCountD > nFastCnt2
            nSecSkipX := nSecSkip2
         Else
            nSecSkipX := nSecSkip1
         EndIf
         nDif := nSecChk - nLastSecD
         If nDif > nFastRes
            nCountD  := 1
            lWheelOK := .T.
         ElseIf nDif > nSecSkipX
            lWheelOK := .T.
         EndIf
      EndIf
      If lWheelOK
         nLastSecD := nSecChk
      EndIf
   EndIf

EndIf

If lWheelOK
   If lGUI
      PostAppEvent( xbeP_Keyboard , aIn[1] , , aIn[7] )
   Else
      aIn[7]:Wheel := { | aPos , aWheel | MainWheelDistance( aWheel[2] ) }
   EndIF
Else
   aIn[1] := xbe_None
   aIn[7] := NIL
EndIF
Return( aIn )
// aIn:
// 1 = nEvent
// 5 = mp1
// 6 = mp2
// 7 = oXbp
Zuletzt geändert von DelUser01 am Mo, 27. Okt 2014 16:17, insgesamt 1-mal geändert.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Mausrad- (wheel-) Event-Signale stoppen?

Beitrag von brandelh »

hast du mal probiert ob CLEAR TYPEAHEAD eine Wirkung zeigt ?
Gruß
Hubert
DelUser01

Re: Mausrad- (wheel-) Event-Signale stoppen?

Beitrag von DelUser01 »

Hallo Hubert

habe das Mal nur mit "Clear TypeAhead" gemacht. Die Wheel-Events sind damit weg. Wenn man das Rad anhält bleiben die Wheel-Events sofort weg.
ABER leider auch alle anderen Events. Damit ist dieser Lösungsweg an zentraler Stelle nicht sinnvoll. Unter anderem kommunizieren in meiner Applikation verschiedene Threads über die Event-Queue untereinander.

Wenn man bei Clear TypeAhead auch noch angeben könnte welche Signale gelöscht werden sollen dann würde das passen...
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9355
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Mausrad- (wheel-) Event-Signale stoppen?

Beitrag von Tom »

Hallo, Roland.

Mit meiner Beispielfunktion könntest Du das realisieren. Du müsstest nur in der Schleife abfragen, ob das zu löschende Event von der Maus kommt und ein Wheel-Event ist. Alle andere speicherst Du in einem Array und schickst sie mit PostAppEvent anschließend (!) wieder in die Queue.
Herzlich,
Tom
DelUser01

Re: Mausrad- (wheel-) Event-Signale stoppen?

Beitrag von DelUser01 »

Hallo Tom

mit der jetzigen Lösung kann ich vermutlich leben.
Die Events über ein Array abzufangen würde vielleicht einen größeren Eingriff in meine zentrale Event-Steuerung mit sich bringen. Könnte mir aber vorstellen dass es aber weitere Vorteile hätte.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Mausrad- (wheel-) Event-Signale stoppen?

Beitrag von brandelh »

Bei einer GUI Anwendung würde mann sinnvollerweise die Events entweder beim Control oder gleich in der Schleife blockieren.
Da du aber eh eine Funktion aufrufst die die Reaktion auf die MausRad Events erst erzeugen muss,
ist es am sinnvollsten in dieser Funktion einfach keine Reaktion zu erzeugen, solange du das so willst ;-)
Gruß
Hubert
DelUser01

Re: Mausrad- (wheel-) Event-Signale stoppen?

Beitrag von DelUser01 »

Hallo Hubert

meinen vorhin eingefügten Code habe ich geändert. Bei GUI wird der Event ungehindert durchgelassen. Ist mir erst im nachhinein aufgefallen dass die "Bremse" auch für GUI wirkt.
Wie schon gesagt, das läuft alles über die gleichen zentralen Stellen. Unterschieden wird nur über den Parameter lGUI.
Antworten