Tastaturabfrage

In dieser Linux-Ecke dürfen nur Themen rund um Linux geschrieben werden.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
kmais
Beiträge: 45
Registriert: 09.02.2017 13:54

Tastaturabfrage

Beitrag von kmais »

Hallo Spezialisten, ....
Es gibt einiges in Purebasic, das mich vom vornehmlichen Umgang mit demselben (noch) abhält.
Entsprechend sind meine Kenntnisse eher rudimentär.
Also, ....
In diversen Sprachen wie Gambas etc. findet sich für ein Control i.R. die Möglichkeit eine gedrückte Taste bei
aktivem Control (hat den Fokus) abzufragen. Also wird ein keypress-Event zur Verfügung gestellt und man hat
die Möglichkeit den Wert der Taste auszuwerten.
Das scheint ja in Purebasic galant nicht der Fall zu sein (also über ein entsprechendes Event).
Konkret zum Beispiel hätte ich da ein textgadget in welches ich Daten eintrage und per Klick auf Return absenden möchte.

Über DirectX sollte das nicht laufen sondern ganz normal(!) in einer openWindow Umgebung.
Habe ich da etwas übersehen? oder geht das letztlich nur über eine API (gtk bzw. qt, was nicht so der Bringer wäre).

Für Rat + Hilfe wäre ich seeeehr dankbar.
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Tastaturabfrage

Beitrag von mk-soft »

Für eine Eingabe nimmt man nicht ein TextGadget, sondern ein StringGadget.

Nur mit der Return Taste zur Übernahme der Eingabe muss man ein wenig Tricksen 8)

Sonst gibt es noch das CanvasGadget, wo man alles auch selber auswerten und zeichnen kann.

Code: Alles auswählen

;-TOP

; StringGadget ReturnKey by mk-soft, Version v1.02

; ----

#MenuEvent_ReturnKey = 1000

Procedure DoEventGadgetType()
  Protected gadget = EventGadget()
  If IsGadget(gadget)
    Select GadgetType(gadget)
      Case #PB_GadgetType_String
        Select EventType()
          Case #PB_EventType_Focus
            AddKeyboardShortcut(0, #PB_Shortcut_Return, #MenuEvent_ReturnKey)
          Case #PB_EventType_LostFocus
            RemoveKeyboardShortcut(0, #PB_Shortcut_Return)
        EndSelect
    EndSelect
  EndIf
EndProcedure

Procedure DoEventReturnKey()
  PostEvent(#PB_Event_Gadget, GetActiveWindow(), GetActiveGadget(), #PB_EventType_ReturnKey)
EndProcedure

; ----

If OpenWindow(0, 0, 0, 400, 300, "StringGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  StringGadget(0, 10, 10, 380, 30, "StringGadget 1")
  StringGadget(1, 10, 50, 380, 30, "StringGadget 2")
  EditorGadget(2, 10, 90, 380, 190)
  
  CreateMenu(0, WindowID(0))
  BindEvent(#PB_Event_Gadget, @DoEventGadgetType())
  BindMenuEvent(0, #MenuEvent_ReturnKey, @DoEventReturnKey())
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Break
        
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 0
            Select EventType()
              Case #PB_EventType_ReturnKey
                Debug "Return Gadget 0"
                SetActiveGadget(1)
            EndSelect
            
          Case 1
            Select EventType()
              Case #PB_EventType_ReturnKey
                Debug "Return Gadget 1"
                SetActiveGadget(2)
            EndSelect
            
        EndSelect
        
    EndSelect
  ForEver
  
EndIf
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
kmais
Beiträge: 45
Registriert: 09.02.2017 13:54

Re: Tastaturabfrage

Beitrag von kmais »

Vielen Dank für deine Antwort und den Code.
Du verknüpfst das Ereignis also mit einem unsichtbaren Menu, bzw. dem Menueintrag und weist dem Eintrag Return als ShortCut zu. Funktioniert.
Kompliziert. Und vor allem sehr proprietär auf den Code, wenn man das vielleicht öfter braucht und bei anderen Gadgets, die einen Eintrag haben.
Da muss ich mich wohl tiefer einarbeiten was die APIs betrifft.

Nochmal, vielen Dank für die Mühe.
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Tastaturabfrage

Beitrag von mk-soft »

Funktioniert so für alle OS und nur für alle StringGadget.
Da einzige was eventuell angepasst werden muss ist eventuell die MenuItem Nummer.
Mehrfachzuweisungen mit Bind Events ist auch ohne weiters möglich.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
kmais
Beiträge: 45
Registriert: 09.02.2017 13:54

Re: Tastaturabfrage

Beitrag von kmais »

Ich habe es mal folgendermaßen gelöst:

Idee:
- Lese die Eingabe in einem textaufnehmenden Gadget
- Ermittele die letzte Eingabe
- Wenn diese Return oder Enter ist, führe den gewünschten Code aus

Problem dabei: Das StringGadget nimmt keine Steuertasten an, gibt diese damit auch nicht zurück

Funktionieren tut's jedoch mit dem EditorGadget. Dieses nimmt natürlich für einen Zeilenabschluss Steuerzeichen an.

Die Routine EditorKeyPress ermittelt das letzte Zeichen (damit auch immer das aktuell geschriebene)

Code: Alles auswählen


; KeyPress Event mit Editor Gadget

;Parameter: 1. eventType aus waitwindowevent(), 2. GadgetId des Event-auslösenden Gadgets, 3. GadgetId des potentiell 
Procedure editKeyPress(evType.i,evGadget.i,gadgetId.i)     ; Event-auslösenden EditorGadgets
  If evType = #PB_EventType_Change And evGadget=gadgetId   ; Das Eventgadget kann irgendeines sein und nicht zwingend das
    ProcedureReturn Asc(Right(GetGadgetText(gadgetId),1))  ; gewollte Editorgadget. Die Routine muss also differenzieren,
  Else    ;gibt den ASCII Code des letzten Zeichens aus    ; ob es sich beim Auslöser um das Editorgadget handelt. Daher werden
    ProcedureReturn  -1                                    ; beide Id's benötigt.
  EndIf                                                    ; weiteres Kriterium ist, ob es sich um eine Änderung im Editorfeld
EndProcedure                                               ; handelt -> EventType() = #PB_EventType_Change


If OpenWindow(0, 0, 0, 400, 300, "Eingabe", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  eingabe_0.i = EditorGadget(#PB_Any, 10, 10, 380, 30)
  eingabe_1.i = EditorGadget(#PB_Any, 10, 50, 380, 30)
  myEdit.i = EditorGadget(#PB_Any, 10, 90, 380, 190)
 
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Break
      Case #PB_Event_Gadget
        Select EventGadget()
          Case eingabe_0
            keypress.i = editKeyPress(EventType(),EventGadget(),eingabe_0)
            If keypress = 10 Or keypress = 13 ; Differenzierung zw. 10 (Return) und 13 (Enter). Auf Laptops ist das 
              AddGadgetItem(myEdit,-1,"Eingabe Gadget 1")          ;manchmal so eine Sache welchen Code die Tasten auslösen
            EndIf
          Case eingabe_1
            keypress.i = editKeyPress(EventType(),EventGadget(),eingabe_1)
            If keypress = 10 Or keypress = 13 
              AddGadgetItem(myEdit,-1,"Eingabe Gadget 2")
            EndIf
        EndSelect
       
    EndSelect
  ForEver
 
EndIf
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Tastaturabfrage

Beitrag von mk-soft »

So geht es natürlich auch :wink:
Finde aber meine Methode einfacher

Oder man baut sich ein eigenes Gadget.

Habe hier mal ein Beispiel: Link Simple NumGadget Example
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
kmais
Beiträge: 45
Registriert: 09.02.2017 13:54

Re: Tastaturabfrage

Beitrag von kmais »

Yepp ... :mrgreen:

Das ist ja mal interessant, das eigene Gadget zu bauen.
Nur leider mal wieder miserabel kommentiert der Code :roll:
Da brauche ich eine Zeit um durch zusteigen.
Aber das interessiert mich doch.
Danke für den Tipp .... :allright:

... Peter ...
Antworten