Seite 1 von 2

Stringeingabe mit RETURN beenden [gelöst]

Verfasst: 17.12.2007 13:36
von Sebastian
Gerade ärgere ich mich darüber, dass ich ein Fenster generiert habe, in welchem ein Stringgadget (und nur dies) vorhanden ist. Wenn ich diese Eingabe mit RETURN bestätige, dann passiert leider nichts, ich muss erst auf OK klicken. Wie kann ich die Eingabebestätigung mit RETURN zulassen? Muss ich dabei auf AddKeyboardShortcut zurückgreifen oder gibt es noch eine andere Möglichkeit?

Verfasst: 17.12.2007 13:41
von STARGÅTE
wenn du

Code: Alles auswählen

Event = EventType()
anfragst

kannst du mit:

Code: Alles auswählen

#PB_EventType_ReturnKey
Die Eingabe von 'Return' in einem StringGadget() abfragen

Code: Alles auswählen

If EventType() = #PB_EventType_ReturnKey
 ; Mache was nach RETRUN
EndIf

Verfasst: 17.12.2007 13:54
von Sebastian
Klasse! Genau das habe ich gesucht. VIELEN DANK!

Verfasst: 17.12.2007 14:08
von Sebastian
:freak:
Leider funktioniert es irgendwie nicht:

Code: Alles auswählen

Repeat
EventID=WaitWindowEvent()
If (EventID=#PB_Event_Gadget And EventGadget()=#LayerWindow_Window_LayerName_Gadget_Button_OK) Or EventType()=#PB_EventType_ReturnKey
 LayerName$=GetGadgetText(#LayerWindow_Window_LayerName_Gadget_String_LayerName)
 CloseWindow(#LayerWindow_Window_LayerName)
EndIf
Until EventGadget()=#LayerWindow_Window_LayerName_Gadget_Button_OK Or EventType()=#PB_EventType_ReturnKey
Was läuft da schief? Wenn ich RETURN drücke passiert gar nichts!

Verfasst: 17.12.2007 14:40
von STARGÅTE
ah mist, ich glaube das es das in PB 4.x garnicht mehr gibt oder ?
...
dann wäre wohl ein AddKeyboardShortcut die einfachste lösung, da kannst du ja einfach mit abfragen ob RETURN zusätzlich noch im richtigen Gadget gedrückt wurde

Verfasst: 17.12.2007 15:04
von scholly

Code: Alles auswählen

Procedure SelectAll(StringGadget.l)
  SendMessage_(GadgetID(StringGadget), #EM_SETSEL, Len(GetGadgetText(StringGadget)), 0)
EndProcedure 

If OpenWindow(0, 0, 0, 322, 55, "StringGadget Flags", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
  StringGadget(1, 8,  10, 306, 20, "Normal StringGadget...")
  AddKeyboardShortcut(0, #PB_Shortcut_Return, 4711)
EndIf
SelectAll(1)
SetActiveGadget(1)
Debug "start"
Debug GetGadgetText(1)
Repeat 
  EventID = WaitWindowEvent() 
  If EventID = #PB_Event_Menu
    If EventMenu() = 4711
      Debug "RETURN im StringGadget" 
      Debug GetGadgetText(1) 
      End
    EndIf
  EndIf
Until WaitWindowEvent() = #PB_Event_CloseWindow

Verfasst: 17.12.2007 16:25
von Sebastian
Vielen Dank für Eure vorschläge! Ich habe das aktuelle Beispiel getestet. Es funktioniert (komisch) nicht immer. Ich muss ja keinen anderen String eingeben, ich kann ja den bestehenden stehen lassen und einfach Return drücken. Jedoch nimmt er ab und zu die Eingabe nicht... Warum?

Verfasst: 17.12.2007 17:01
von scholly
hm... tut bei mir immer - solange das "End" drin is :?
keine Ahnung woher die Aussetzer kommen...

Mit ner while-wend schleife scheints aber keine Aussetzer zu geben:

Code: Alles auswählen

EventID = WaitWindowEvent()
While EventID <> #PB_Event_CloseWindow
  If (EventID = #PB_Event_Menu) 
    If EventMenu() = 4711
      Debug "RETURN im StringGadget"
      Debug GetGadgetText(1)
    EndIf
  EndIf
  EventID = WaitWindowEvent()
Wend
hdh... scholly

Verfasst: 17.12.2007 18:40
von Häns
Hallo Sebastian,

das Thema hat mich auch interessiert, bis ich auf Thomas Beispiel kam: http://www.purebasic.fr/german/viewtopi ... 924#121924

Für Dich hier leicht geändert, funktioniert der Code immer und sofort, zumindest bei mir :) :

Code: Alles auswählen

Procedure SelectAll(StringGadget.l)
  SendMessage_(GadgetID(StringGadget), #EM_SETSEL, Len(GetGadgetText(StringGadget)), 0)
EndProcedure

If OpenWindow(0, #PB_Ignore, 0, 640, 480, "")
  AddKeyboardShortcut(0, #PB_Shortcut_Return, 0)

  If CreateGadgetList(WindowID(0))
    StringGadget(0, 10, 10, 620, 30, "Hallejuja, bald ist Weihnachten!")
    SelectAll(0)

    Repeat

    SetActiveGadget(0)
    
      Select WaitWindowEvent()
        Case #PB_Event_Menu
          If EventMenu() = 0 ;Return
            If GetActiveGadget() = 0 ; Stringgadget

              MessageRequester("",GetGadgetText(0))
            EndIf
          EndIf
        Case #PB_Event_CloseWindow
          Break
      EndSelect
    ForEver   
  EndIf
EndIf


Häns

Verfasst: 17.12.2007 19:55
von Sebastian
Wow, ja das funktioniert. Ich wusste nicht, dass man auf ein Menu zugreifen darf (mit EventMenu()), das gar nicht existiert! Aber es läuft. Vielen Dank!