Problem mit EVENT_KEYDOWN

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

danibert

Betreff: Problem mit EVENT_KEYDOWN

BeitragMi, Jun 09, 2010 18:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo

ich versuche, eine Tastatureingabe abzufragen, bekomme es aber leider nicht zum Laufen. Alle Beispiele, die ich hier im Forum finden konnte, zeigen keine Reaktion auf das Drücken einer Taste.

Code: [AUSKLAPPEN]
Import maxgui.drivers

Strict

Local MyWindow:TGadget=CreateWindow("Fenstertitel", 200,200,320,240)
Local MyButton:TGadget=CreateButton("Text",140,60,80,40, MyWindow,BUTTON_OK)

Repeat
  WaitEvent()
  Select EventID()

      Case EVENT_WINDOWCLOSE
           End
       
      Case EVENT_KEYDOWN
         Select EventData()
            Case KEY_ENTER
               
               Print "TASTE GEDRÜCKT"
               
            End Select   
   End Select
Forever


Hat jemand einen Tipp, wie ich das hin bekomme?
Danke im Voraus

mpmxyz

BeitragMi, Jun 09, 2010 19:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Hast du ein Canvas-Gadget erstellt?
Nein.
So viel ich weiß, werden diese Events nur bei diesen speziellen Zeichenflächen und bei keinem anderen Gadget erstellt.
Da es bei dir aber nur ein Fenster und einen Button gibt, passiert nichts.
Wenn du irgendeine Tastenkombination erstellen möchtest, ist "SetHotKeyEvent" wahrscheinlich eher angebracht.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Thunder

BeitragMi, Jun 09, 2010 19:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Buttons, die den Parameter BUTTON_OK verwenden, sollte man genauso abfragen können wie normale Buttons wenn ich mich recht erinnere. Einfach nur
BlitzMax: [AUSKLAPPEN]
If EventSource()=MyButton Then ...
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit
 

danibert

BeitragMi, Jun 09, 2010 20:40
Antworten mit Zitat
Benutzer-Profile anzeigen
ich möchte das Ganze in einem Panel mit Eingabefeldern verwenden, damit man die Eingaben auch mit Return abschicken kann.
Wenn ich in dem Panel Code: [AUSKLAPPEN]
SetGadgetSensitivity panel_Eingabe, SENSITIZE_KEYS
angebe, kann ich die Tasten mit EVENT_KEYDOWN abfragen.
Allerdings muss ich zuerst mit der Maus in das Panel klicken, um den Fokus darauf zu setzen.
Gibt es einen Befehl, mit dem ich den Focus automatisch auf das Panel setzen kann?

Thunder

BeitragMi, Jun 09, 2010 21:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Sollte mit ActivateGadget(panel) funktionieren.
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit
 

danibert

BeitragDo, Jun 10, 2010 11:04
Antworten mit Zitat
Benutzer-Profile anzeigen
OK, ich versuche das jetzt mal noch einfacher aufzubauen:
Ich habe also ein Eingabeformular mit 2 Eingabefeldern und einer Schaltfläche. Wenn ich die Schaltfläche mit activategadget() fokussiere, kann ich das Formular mit Return abschicken. Sobald ich den Cursor in ein Eingabefeld stelle, geht das natürlich nicht mehr.

Code: [AUSKLAPPEN]
Import maxgui.drivers
Strict

Local MyWindow:TGadget=CreateWindow("Fenster", 200,200,320,240)
Local in01:TGadget=CreateTextField(10,10,180,20,MyWindow)
Local in02:TGadget=CreateTextField(10,40,180,20,MyWindow)
Local btn1:TGadget = CreateButton("Weiter", 10, 80, 100, 22, MyWindow)

activategadget(btn1)

Function machwas()
   Print "OK"
End Function

Repeat
   WaitEvent()
   Select EventID()
 
   Case EVENT_WINDOWCLOSE
      End

   Case EVENT_GADGETACTION
      Select EventSource()
      
         Case btn1
            machwas()
      
      End Select
   End Select
Forever


Ich habe schon versucht, die Eingaben auszuwerten, bekomme aber für die Returntaste keinen Wert zurückgeliefert. Ich habe hier im Forum einige Beiträge zu dem Thema gefunden, aber nichts davon funktioniert. Wie kann ich das denn nun bewerkstelligen, dass die Return-Taste abgefragt wird, wenn eines der Eingabefelder aktiv ist?
 

jsp

BeitragSa, Jun 12, 2010 9:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Wie kann ich das denn nun bewerkstelligen, dass die Return-Taste abgefragt wird, wenn eines der Eingabefelder aktiv ist?

Dafuer ist der BUTTON_OK Style gedacht. Der Event vom Button wird erzeugt wenn man drauf klickt oder wenn die Return Taste gedrückt wurde.
Das Gegenstück dazu ist der BUTTON_CANCEL Style, der wird auch aufgerufen wenn man ESC gedrückt hat.
Wenn die Buttons nicht gewünscht sind aber ihre Funktion gebraucht wird, einfach den Button mit HideGadget verstecken.
Eine andere Variante ist die Events von den TextFields abzufangen und praktisch bei jeder Tasteneingabe zu prüfen was nun darin steht...
TextFields verfügen auch über Filter die gesetzt werden können falls bestimmte Tasten nicht erlaubt sind oder einer besonderen Behandlung bedürfen.

EDIT: Es gibt auch noch den nützlichen EVENT_GADGETLOSTFOCUS für TextFields. Der Event ist praktisch wenn man sich von einem Textfeld zum nächsten weitergeht - z.B. mit Tab - dann verliert das vorherige TextField den Focus, darauf kann man dann reagieren und z.B. den Wert speichern oder so...

Code: [AUSKLAPPEN]
Import maxgui.drivers
Strict

Local MyWindow:TGadget=CreateWindow("Fenster", 200,200,320,240)
Local in01:TGadget=CreateTextField(10,10,180,20,MyWindow)
Local in02:TGadget=CreateTextField(10,40,180,20,MyWindow)
Local btn1:TGadget = CreateButton("Weiter", 10, 80, 100, 22, MyWindow,BUTTON_OK)

ActivateGadget(btn1)

Function machwas()
   Print "OK"
End Function

Repeat
   WaitEvent()
   Select EventID()
 
   Case EVENT_WINDOWCLOSE
      End

   Case EVENT_GADGETACTION
      Select EventSource()
       
         Case btn1
            machwas()
       
      End Select
   End Select
Forever
Logic Gui Professional a Gui Designer for MaxGui
 

danibert

BeitragSa, Jun 12, 2010 14:23
Antworten mit Zitat
Benutzer-Profile anzeigen
@jsp
Danke, so werde ich es umsetzen.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group