Aktuelle Zeit: 07.06.2020 04:29

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Tastaturabfrage
BeitragVerfasst: 06.01.2020 15:41 
Offline

Registriert: 09.02.2017 13:54
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Tastaturabfrage
BeitragVerfasst: 06.01.2020 17:44 
Offline
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
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:
;-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 / OPC-Helper DLL
PB v3.30 / v5.4x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf My Webspace


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Tastaturabfrage
BeitragVerfasst: 06.01.2020 18:56 
Offline

Registriert: 09.02.2017 13:54
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Tastaturabfrage
BeitragVerfasst: 06.01.2020 20:02 
Offline
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
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 / OPC-Helper DLL
PB v3.30 / v5.4x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf My Webspace


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Tastaturabfrage
BeitragVerfasst: 07.01.2020 14:30 
Offline

Registriert: 09.02.2017 13:54
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:

; 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Tastaturabfrage
BeitragVerfasst: 07.01.2020 18:16 
Offline
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
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 / OPC-Helper DLL
PB v3.30 / v5.4x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf My Webspace


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Tastaturabfrage
BeitragVerfasst: 07.01.2020 22:27 
Offline

Registriert: 09.02.2017 13:54
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 ...


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye