Seite 1 von 1

Enter/Return soll StringGadget ausführen

Verfasst: 02.04.2010 13:49
von Tombi
Liebe Community,
wie lasse ich durch einen Klick auf Enter ein StringGadget ausführen?
Bzw, wie prüfe ich, ob in einem StringGadget Enter gedrückt wurde?

MFG, Tombi

Re: Enter/Return soll StringGadget ausführen

Verfasst: 02.04.2010 14:00
von iostream
So kannst du z.B. ein Enter im StringGadget abfragen.

Code: Alles auswählen

Enumeration
	#Window
	#StringGadget
	#Shortcut
EndEnumeration

If OpenWindow(#Window, 0, 0, 400, 200, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	AddKeyboardShortcut(#Window, #PB_Shortcut_Return, #Shortcut)
	
	StringGadget(#StringGadget, 10, 10, 100, 20, "")
	SetActiveGadget(#StringGadget)
	
	Repeat
		EventID = WaitWindowEvent()
		
		If EventID = #PB_Event_Menu
			If EventMenu() = #Shortcut And GetActiveGadget() = #StringGadget
				Debug "Enter im StringGadget"
			EndIf
		EndIf
	Until EventID = #PB_Event_CloseWindow 
EndIf

Re: Enter/Return soll StringGadget ausführen

Verfasst: 03.04.2010 19:43
von Hyper
...Du must nur aufpassen: Falls Du auch ein EditorGadget auf dem Screen hast und dort Enter drückst, wird kein Zeilenumbruch mehr erzeugt, da Du das Enter für andere Zwecke abfängst. Du könntest aber das so lösen, dass Du immer dann, wenn das StringGadget den Fokus erhält, den Shortcut zufügst und beim Fokusverlust wieder entfernst.

Aber wahrscheinlich hast Du ja gar kein EditorGadget...

Re: Enter/Return soll StringGadget ausführen

Verfasst: 11.08.2014 15:04
von schleicher
Diese Thread ist zwar uralt, aber das genau habe ich gesucht.(Enter-Taste im Stringgadget). Danke

Re: Enter/Return soll StringGadget ausführen

Verfasst: 11.08.2014 16:01
von Andreas21
Der Code wenn man noch ein Editor Feld benutzt währ dieser.

Code: Alles auswählen

EnableExplicit

Define EventID
Define check

Enumeration
  #Window
  #StringGadget
  #EditorGadget
  #Shortcut
EndEnumeration

If OpenWindow(#Window, 0, 0, 400, 200, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  StringGadget(#StringGadget, 10, 10, 100, 20, "")
  EditorGadget(#EditorGadget, 10, 40, 100, 100)
  SetActiveGadget(#StringGadget)
  check = #False
  
  Repeat
    EventID = WaitWindowEvent()
    
    If GetActiveGadget() = #StringGadget
      If check = #False
        AddKeyboardShortcut(#Window, #PB_Shortcut_Return, #Shortcut)
        check = #True
      EndIf
    Else
      If check = #True
        RemoveKeyboardShortcut(#Window, #PB_Shortcut_Return)
        check = #False
      EndIf
      
    EndIf
    If EventID = #PB_Event_Menu
      If EventMenu() = #Shortcut
        Debug "Enter im StringGadget"
      EndIf
    EndIf
  Until EventID = #PB_Event_CloseWindow 
EndIf

Re: Enter/Return soll StringGadget ausführen

Verfasst: 11.08.2014 16:16
von Derren

Code: Alles auswählen

Repeat
    EventID = WaitWindowEvent()
   
    If GetActiveGadget() = #StringGadget
Du überprüfst also ständig (bei jeder noch so kleinen Mausbewegung), ob das aktive Gadget das StringGadget ist?

Wie wär's mit EventGadget() abfragen?
Dann brauchst du auch kein "check" Flag, dank EventType() (Focus/LostFocus)

Code: Alles auswählen

EnableExplicit

Define EventID

Enumeration
  #Window
  #StringGadget
  #EditorGadget
  #Shortcut
EndEnumeration

If OpenWindow(#Window, 0, 0, 400, 200, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
 
  StringGadget(#StringGadget, 10, 10, 100, 20, "")
  EditorGadget(#EditorGadget, 10, 40, 100, 100)
  SetActiveGadget(#StringGadget)  
 
  Repeat
  	EventID = WaitWindowEvent()
  	
  	Select EventID
  		Case #PB_Event_Gadget
  			
  			Select EventGadget()
  				Case #StringGadget  					
  					Select EventType()
  						Case #PB_EventType_Focus 
  							AddKeyboardShortcut(#Window, #PB_Shortcut_Return, #Shortcut)  							
  						Case #PB_EventType_LostFocus 
  							RemoveKeyboardShortcut(#Window, #PB_Shortcut_Return)
  					EndSelect   					
  			EndSelect 
  			
  		Case #PB_Event_Menu  			
  			If EventMenu() = #Shortcut
  				Debug "Enter im StringGadget"
  			EndIf
  	EndSelect 
  	
  Until EventID = #PB_Event_CloseWindow
EndIf

Re: Enter/Return soll StringGadget ausführen

Verfasst: 11.08.2014 22:06
von hjbremer
oder so

Code: Alles auswählen

EnableExplicit

Structure StringGadgetData
   parent.i
   gadget.i
   oldprc.i
   ;xyz
   laenge.i
EndStructure

Enumeration #PB_EventType_FirstCustomValue  
   #PB_EventType_StrgReturn
   #PB_EventType_StrgEscape
   #PB_EventType_StrgUp
   #PB_EventType_StrgDown
EndEnumeration


Procedure.i StringGadgetCallBack(hwnd, msg, wParam, lParam) 
   
   Protected *strg.StringGadgetData = GetWindowLongPtr_(hwnd, #GWL_USERDATA)
   
   Select msg
         
      Case #WM_CHAR            
         Select wparam 
            Case #VK_RETURN               
               PostEvent(#PB_Event_Gadget, *strg\parent, *strg\gadget, #PB_EventType_StrgReturn)
               
            Case #VK_ESCAPE 
               PostEvent(#PB_Event_Gadget, *strg\parent, *strg\gadget, #PB_EventType_StrgEscape)
               
            Default
               ;wParam = CheckChar()  
                              
         EndSelect
         
      Case #WM_KEYDOWN
         Select wparam 
            Case #VK_DOWN               
               PostEvent(#PB_Event_Gadget, *strg\parent, *strg\gadget, #PB_EventType_StrgDown)
               ProcedureReturn 0
               
            Case #VK_UP               
               PostEvent(#PB_Event_Gadget, *strg\parent, *strg\gadget, #PB_EventType_StrgUp)               
               ProcedureReturn 0
         EndSelect
         
         ;weitere Messages
      Case #WM_KILLFOCUS
         Debug "#WM_KILLFOCUS"
         
   EndSelect
   
   ProcedureReturn CallWindowProc_(*strg\oldprc, hwnd, msg, wParam, lParam) 
   
EndProcedure 

Procedure StringGadgetSetCallback(pbnr, parent, xyz = 0)
   
   Protected strgid = GadgetID(pbnr)      
   
   Protected *strg.StringGadgetData = AllocateMemory(SizeOf(StringGadgetData))
   
   *strg\gadget = pbnr
   *strg\parent = parent
   *strg\oldprc = GetWindowLongPtr_(strgid, #GWL_WNDPROC)   
   
   SetWindowLongPtr_(strgid, #GWL_USERDATA, *strg)   
   SetWindowLongPtr_(strgid, #GWL_WNDPROC, @StringGadgetCallBack())
   
EndProcedure



Define EventID

Enumeration 
   #Window
   #StringGadget
   #EditorGadget
   #Shortcut
EndEnumeration

If OpenWindow(#Window, 0, 0, 400, 200, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
   
   StringGadget(#StringGadget, 10, 10, 100, 20, "")
   EditorGadget(#EditorGadget, 10, 40, 100, 100)
   SetActiveGadget(#StringGadget) 
   
   StringGadgetSetCallback(#StringGadget, #Window)
   
   
   Repeat
      EventID = WaitWindowEvent()
      
      Select EventID
         Case #PB_Event_Gadget
            
            Select EventGadget()
               Case #StringGadget                 
                  Select EventType()
                     Case #PB_EventType_StrgReturn: Debug "Hurra Return"
                     Case #PB_EventType_StrgEscape: Debug "Hurra Escape"
                     Case #PB_EventType_StrgUp:     Debug "Hurra Up"
                     Case #PB_EventType_StrgDown:   Debug "Hurra Down"                        
                  EndSelect 
                  
            EndSelect 
            
            
      EndSelect 
      
   Until EventID = #PB_Event_CloseWindow
EndIf

Re: Enter/Return soll StringGadget ausführen

Verfasst: 11.08.2014 22:09
von Derren
WinApi lastig aber nützlich :)

Rauf Runter Links Rechts. Ein paar SetGadgetText() dazu und man kann im EditorGadget Snake oder Tetris spielen :bounce:

Re: Enter/Return soll StringGadget ausführen

Verfasst: 28.04.2015 04:32
von Marty2PB
Hallo,

Sorry das ich diesen alten Post ausgrab.
Aber wiso wird unter windows immer der 'Standardton Warn Signal' abgspielt ab wenn man die Return Taste oder die Escape taste im Stringadget drückt abgespielt ? Sobald man aber ein AddkeyboardShortcut hinzufügt hört das auf. Ist das unter Windows auch ohne AddkeyboardShortcut zu lösen das dieser nervige Sound nicht abgespielt wird wenn der user im Stringgadget 'Return' drückt.?

ich habe das für mich so in etwa gelöst

Code: Alles auswählen

            Case DC::#String_005, DC::#String_006, DC::#String_007, DC::#String_008, DC::#String_009,
                 DC::#String_010, DC::#String_011, DC::#String_012, DC::#String_013
                
                Select MainEventType
                    Case #PB_EventType_Focus
                        AddKeyboardShortcut(DC::#_Window_001, #PB_Shortcut_Return,1000)
                        SetGadgetColor(ObjectID,#PB_Gadget_BackColor,RGB(205,205,206))
                        SetGadgetColor(ObjectID,#PB_Gadget_FrontColor,RGB(0,0,0))
                    Case  #PB_EventType_LostFocus
                        RemoveKeyboardShortcut(DC::#_Window_001, #PB_Shortcut_Return)
                        SetGadgetColor(ObjectID,#PB_Gadget_BackColor,BaseForm::SetColorGray4)
                        SetGadgetColor(ObjectID,#PB_Gadget_FrontColor,RGB(90,90,90))                        
                EndSelect

Re: Enter/Return soll StringGadget ausführen

Verfasst: 28.04.2015 16:29
von edel
Bei dem Beispiel von hjbremer musst du einfach nur die weitere Verarbeitung durch Windows stoppen.

Aus :

Code: Alles auswählen

Case #WM_CHAR            
         Select wparam 
            Case #VK_RETURN               
               PostEvent(#PB_Event_Gadget, *strg\parent, *strg\gadget, #PB_EventType_StrgReturn)               
            Case #VK_ESCAPE
Wird :

Code: Alles auswählen

Case #WM_CHAR            
         Select wparam 
            Case #VK_RETURN               
               PostEvent(#PB_Event_Gadget, *strg\parent, *strg\gadget, #PB_EventType_StrgReturn) 
               ProcedureReturn 0
            Case #VK_ESCAPE