StringGadget - simulation de la touche Tab

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
fd
Messages : 70
Inscription : mar. 15/mars/2005 21:41
Localisation : Savoie

StringGadget - simulation de la touche Tab

Message 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.
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

Regarde AddKeyboardShortcut
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Message 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
Denis

Bonne Jounée à tous
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message 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:
Image
Répondre