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.
Tastaturabfrage
Re: Tastaturabfrage
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
Sonst gibt es noch das CanvasGadget, wo man alles auch selber auswerten und zeichnen kann.
Nur mit der Return Taste zur Übernahme der Eingabe muss man ein wenig Tricksen
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
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Re: Tastaturabfrage
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.
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.
Re: Tastaturabfrage
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.
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
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Re: Tastaturabfrage
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)
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
Re: Tastaturabfrage
So geht es natürlich auch
Finde aber meine Methode einfacher
Oder man baut sich ein eigenes Gadget.
Habe hier mal ein Beispiel: Link Simple NumGadget Example
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
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Re: Tastaturabfrage
Yepp ...
Das ist ja mal interessant, das eigene Gadget zu bauen.
Nur leider mal wieder miserabel kommentiert der Code
Da brauche ich eine Zeit um durch zusteigen.
Aber das interessiert mich doch.
Danke für den Tipp ....
... Peter ...
Das ist ja mal interessant, das eigene Gadget zu bauen.
Nur leider mal wieder miserabel kommentiert der Code
Da brauche ich eine Zeit um durch zusteigen.
Aber das interessiert mich doch.
Danke für den Tipp ....
... Peter ...