SetGadgetFilter auf MAC

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Midimaster

Betreff: SetGadgetFilter auf MAC

BeitragMo, Sep 19, 2011 11:40
Antworten mit Zitat
Benutzer-Profile anzeigen
gerade bin ich dabei ein Programm von PC auf MAC zu konvertieren und habe dabei ein unterschiedliches Verhalten eines MaxGui-Befehls gefunden.

Es geht um SetGadgetFilter. Mit dieser Funktion ist es möglich in einem TextGadget nur die Eingabe best. Zeichen zuzulassen. Rein theoretisch sieht die typische Verwendung so aus:


Theorie

BlitzMax: [AUSKLAPPEN]
NurZahlen:TGadget = CreateTextArea(200,200,100,100,Window,TEXTAREA_WORDWRAP)
SetGadgetFilter NurZahlen,ZahlenFilter

Function ZahlenFilter%(event:TEvent,context:Object)
Local Key%=event.data
Select event.id
Case EVENT_KEYDOWN
Print "filtering keydown:"+event.data+","+event.mods

Select Key
Case 8,37,38,39,40,46
Return 1
Default
Return 0
End Select
Case EVENT_KEYCHAR
Print "filtering charkey:"+event.data+","+event.mods
Select Key
Case 48,49,50,51,52,53,54,55,56,57
Return 1
Case 32,45
Return 1
Default
Return 0
End Select
End Select
End Function


Mit SetGadgetFilter wird einem TextAreaGadget eine selbstgestrickte Funktion als CallBack-Routine genannt. Diese CallBack-Funktion liefert dann TRUE oder FALSE, je nachdem, ob das Zeichen unterdrückt gehört.


Windows:

Dabei wird in Windows unterschieden in EVENT_KEYDOWN und EVENT_KEYCHAR.

EVENT_KEYDOWN wenn eine Taste gedrückt wurde

EVENT_KEYCHAR zusätzlich, wenn das Zeichen einen gültigen "Buchstaben" darstellt

Jeder Tastendruck läuft zunächst durch EVENT_KEYDOWN. Wird dort TRUE geliefert und ist das Zeichen kein Buchstabe, ist es im TextGadget erlaubt. z.b. BACK_SPACE


So erlaubt im oberen Beispiel die Zeile...
BlitzMax: [AUSKLAPPEN]
Case 8,37,38,39,40,46
...alle Steuerzeichen.

Alle Tastendrücke, die auch Buchstaben sind (z.b. "R") laufen jetzt noch durch das EVENT_KEYCHAR. Unabhängig vom Ergebnis von EVENT_KEYDOWN wird das Zeichen im TextGadget erlaubt, wenn diesmal TRUE geliefert wird.


Diese Zeile...
BlitzMax: [AUSKLAPPEN]
Case 48,49,50,51,52,53,54,55,56,57
...erlaubt alle Zahlen.


MAC

Dies scheitert auf MAC. Auf dem MAC scheint es gar keinen Event EVENT_KEYCHAR zu geben. Daher werden die Zahlen nicht ausgegeben.

Hier würde folgende Funktion genügen:

BlitzMax: [AUSKLAPPEN]
Function ZahlenFilter%(event:TEvent,context:Object)
Local Key%=event.data
Print "filtering keydown:"+event.data+","+event.mods
Select Key
Case 8,32,37,38,39,40,46,109,191
Return 1
Case 48,49,50,51,52,53,54,55,56,57
Return 1
Default
Return 0
End Select
End Function



Beide Systeme

Allerdings führt diese Schreibweise auf dem Windows-PC dazu, dass die Zahlen nun wieder nicht mehr durchgelassen werden. Eine gemeinsame Routine für beide Systeme muss also so aussehen:

BlitzMax: [AUSKLAPPEN]
Function ZahlenFilter%(event:TEvent,context:Object)
Local Key%=event.data
Select event.id
Case EVENT_KEYDOWN
Print "filtering keydown:"+event.data+","+event.mods

Select Key
Case 8,32,37,38,39,40,46,109,191
Return 1
Case 48,49,50,51,52,53,54,55,56,57
Return 1
Default
Return 0
End Select
Case EVENT_KEYCHAR
Print "filtering charkey:"+event.data+","+event.mods
Select Key
Case 48,49,50,51,52,53,54,55,56,57
Return 1
Case 32,45
Return 1
Default
Return 0
End Select
End Select
Return 1
End Function


Anmerkung I:
Die beiden Tastaturcodes 32 und 45, 109, 191 dienen dazu, das Leerzeichen und den Bindestrich zusätzlich zuzulassen.

Anmerkung II:
Da ich mir nicht ganz sicher bin, dass meine Untersuchungen 100% den wirklichen Ursachen entsprechen, habe ich das ganze mal als BMax-Beitrag und noch nicht als Tutorial veröffentlicht. Vielleicht hilft es ja mal irgendwem...

Anmerkung III:
Auf dem MAC scheint der Bindestrich nicht den KeyCode 45, sondern 109 und 191 zu haben.
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

ZEVS

BeitragMo, Sep 19, 2011 12:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Wieso benutzt du Zahlen-Keycodes und nicht die KEY_*-Varianten? Die sind doch genau für die Plattformunabhängigkeit da.

ZEVS

Midimaster

BeitragMo, Sep 19, 2011 12:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für den Tipp. Ich werde das beim Bindestrich ändern.

Aber das ändert natürlich nichts an dem Kernproblem.
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group