Page 1 sur 1

StringGadget - simulation de la touche Tab

Publié : dim. 19/nov./2006 23:52
par fd
Bonjour,

Je souhaite programmer une serie de stringgdagets qui se remplissent avec des nombres et pour gagner du temps à la saisie, je veux que la touche "entrée" remplace la touche Tab pour sauter au gadget suivant(pour cette série de gadget uniquement). Avez vous une idée ?

Bonne soirée.

Publié : lun. 20/nov./2006 0:08
par Droopy
Regarde AddKeyboardShortcut

Publié : mer. 22/nov./2006 8:40
par brossden
Bonjour à tous

Tu peux assayer ce code si tu veux !

Code : Tout sélectionner


Enumeration
#Win0
#Str0
#Str1
#Str2
#Str3
EndEnumeration

Procedure Open_Win0()
  If OpenWindow(#Win0, 339, 296, 306, 263, "New window ( 0 )",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Win0))
      StringGadget(#Str0, 70, 60, 160, 20, "")
      StringGadget(#Str1, 70, 100, 160, 20, "")
      StringGadget(#Str2, 70, 140, 160, 20, "")
      StringGadget(#Str3, 70, 180, 160, 20, "")
    EndIf
  EndIf
EndProcedure

Open_Win0()
Resultat = CreateToolBar(#PB_Any, #Win0)
AddKeyboardShortcut(#Win0,#PB_Shortcut_Return,15)
SetActiveGadget(#Str0)

Repeat ; Start of the event loop
  Event = WaitWindowEvent() ; This line waits until an event is received from Windows
  Menu = EventMenu()
  GadgetID = EventGadget() ; Is it a gadget event?
  If Event = #PB_Event_Gadget
    If GadgetID = #Str0
    ElseIf GadgetID = #Str1
    ElseIf GadgetID = #Str2
    ElseIf GadgetID = #Str3
    EndIf
  EndIf

If Menu = 15
  keybd_event_(#vk_tab,0,0,0)
Menu=0  
  
EndIf
Until Event = #PB_Event_CloseWindow ; End of the event loop
End

Publié : mer. 22/nov./2006 10:23
par Flype
voici une méthode un peu particulière.

elle a le mérite d'automatiser complètement la gestion du passage au gadget suivant. tu n'a pas besoin de gérer dans ta boucle d'évenements classique l'état du clavier et tout ce qui en résulte.

tu créé juste un StringGadget2() dans lequel tu indiques quel gadget tu veux activer si RETURN est saisie par l'utilisateur.

la procédure callback du StringGadget2() fera le travail de façon transparente pour toi.

Code : Tout sélectionner

;- 
;- EXTENSION STRINGGADGET2
;- 

Procedure.l StringGadget2_Callback(hwnd.l, msg.l, wParam.l, lParam.l)
  
  Protected result.l
  
  result = CallWindowProc_(GetProp_(hwnd, "USER_OLDPROC"), hwnd, msg, wParam, lParam) 
  
  If msg = #WM_CHAR
    If wParam = #VK_RETURN
      SetActiveGadget(GetProp_(hwnd, "USER_NEXTGAD"))
    EndIf
  EndIf 
  
  ProcedureReturn result 
  
EndProcedure
Procedure.l StringGadget2(gadget.l, x.l, y.l, w.l, h.l, string.s, flags.l = #Null, nextgadget.l = -1)
  
  Protected hGadget.l, result.l
  
  result = StringGadget(gadget, x, y, w, h, string, flags)
  
  If nextgadget <> -1
    hGadget = GadgetID(gadget)
    SetGadgetData(gadget, nextgadget)
    SetProp_(hGadget, "USER_NEXTGAD", nextgadget) 
    SetProp_(hGadget, "USER_OLDPROC", SetWindowLong_(hGadget, #GWL_WNDPROC, @StringGadget2_Callback())) 
  EndIf
  
  ProcedureReturn result
  
EndProcedure

;- 
;- EXAMPLE D'UTILISATION
;- 

Enumeration
  #Win0
  #Frame0
  #Str0
  #Str1
  #Str2
  #Str3
  #Str4
EndEnumeration

If OpenWindow(#Win0, 339, 296, 210, 263, "test",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
  If CreateGadgetList(WindowID(#Win0))
    Frame3DGadget(#Frame0, 10,  10, 190, 150, "Formulaire")
    StringGadget2(#Str0,   25,  35, 160,  20, "", #PB_String_Numeric, #Str1) ; ici, on passera au gadget #Str1 si RETURN
    StringGadget2(#Str1,   25,  65, 160,  20, "", #PB_String_Numeric, #Str2) ; ici, on passera au gadget #Str2 si RETURN
    StringGadget2(#Str2,   25,  95, 160,  20, "", #PB_String_Numeric, #Str3) ; ici, on passera au gadget #Str3 si RETURN
    StringGadget2(#Str3,   25, 125, 160,  20, "", #PB_String_Numeric, #Str0) ; ici, on passera au gadget #Str0 si RETURN
    StringGadget2(#Str4,   25, 210, 160,  20, "") ; ici, pas de gadget suivant
    SetActiveGadget(#Str0)
  EndIf 
EndIf 

Repeat 
Until  WaitWindowEvent() = #PB_Event_CloseWindow

End

;-
;- FIN
;-

voilà :wink: