CLEAR TYPEAHEAD löscht nur Tastatureingaben, und ich würde bezweifeln, dass das in GUI-Anwendungen überhaupt nachvollziehbar funktioniert. Das ist eine Kompatibilitätsfunktion.
In GUI-Anwendungen gibt es weitere Events, nämlich Maus-Events (dazu gehört auch das Mausrad), u.U. Gesten, aber auch virtuelle Events, die alle möglichen Ursachen haben können - xbeP_Close ist so eines, dazu gehören aber auch sämtliche Ereignisse, die über spezielle Slots abgefangen werden können, also beispielsweise ItemSelected und ähnliche.
Man kann (anstehende) Events löschen, zum Beispiel mit einer vergleichsweise simplen Funktion (teilweise basierend auf Roger Donnays "DC_ClearEvents"):
Code: Alles auswählen
FUNCTION ClearEvents()
LOCAL nEvent := 1,mp1,mp2,oXbp
DO WHILE nEvent # 0
nEvent := AppEvent(@mp1,@mp2,@oXpb,0.01) // Timeout ist wichtig, sonst wartet die Funktion auf das nächste Event
ENDDO
RETURN nil
In der Mausrad-Situation stellt sich natürlich die Frage, ab wann man Events löschen soll - wahrscheinlich geht es um Browses. In denen kann man den Wheel-Slot belegen und - je nach Richtung - Anfang oder Ende der Tabelle abfangen:
oBrowse:Wheel := {|aPos,aWheel,self|IF(aWheel[2]>0 .AND. AnfangderTabelle(),NixTun,Tabelle hochscrollen),Entsprechend für abwärts ... }
Man könnte natürlich auch in der Queue nachschauen, ob z.B. diversen Abwärtsbewegungen demnächst eine Aufwärtsbewegung folgt und dann bis dorthin löschen. Ist alles nicht ganz so einfach.
Außerdem kann man über die API setzen, um wie viele Zeilen das Mausrad scrollen soll. Achtung: Das gilt systemweit, also nicht nur für die App. Es entspricht der dazugehörigen Einstellung in der Systemsteuerung:
Code: Alles auswählen
FUNCTION SetzeScrollRadZeilen(nZeilen)
LOCAL nWheel
DEFAULT nZeilen TO 0
IF PCount()=0 // Abfrage
nWheel := 0
SystemParametersInfoA(104,0,@nWheel,0)
MsgBox('Mausrad bewegt um '+LTrim(Str(nWheel))+' Zeilen')
ELSE
SystemParametersInfoA(105,@nWheel,0,0x0002)
ENDIF
RETURN nil
DLLFUNCTION SystemParametersInfoA(nAction,nP1,@nP2,nWinInit) USING STDCALL FROM USERS32.DLL