Entrez une valeur numérique bornée avec souplesse

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Entrez une valeur numérique bornée avec souplesse

Message par Le Soldat Inconnu »

Salut,

un petit code bien pratique qui permet ceci de faire une requête sur une valeur numérique comprise entre 2 valeurs en laissant le temps à l'utilisateur de finir de taper le nombre avant de le corriger.
Par exemple, on souhaite un nombre compris entre 1000 et 10000, le nombre par défaut est 5000, si l'utilisateur efface un 0, on se retrouve avec 500 qui n'est pas une valeur correcte.
Si on change la valeur directement, on empêche l'utilisateur de taper la valeur qu'il souhaitait.
Mon astuce permet de changer la valeur seulement au bout d'un certain temps pour que l'utilisateur puisse finir de taper la valeur.

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 3.81
; 
; Explication du programme :
; Faire une requête sur une valeur numérique comprise entre 2 valeurs en laissant le temps à l'utilisateur de finir de taper le nombre avant de le corriger.
; Par exemple, on souhaite un nombre compris entre 1000 et 10000, le nombre par défaut est 5000, si l'utilisateur efface un 0, on se retrouve avec 500 qui n'est pas une valeur correcte.
; Si on change la valeur directement, on empêche l'utilisateur de taper la valeur qu'il souhaitait.
; Mon astuce permet de changer la valeur seulement au bout d'un certain temps pour que l'utilisateur puisse finir de taper la valeur.


Enumeration
  #String
  #Texte
EndEnumeration


Procedure ChangeValeur(Valeur)
  Delay(2000) ; On attend 2 secondes
  
  If Valeur = Val(GetGadgetText(#String)) ; On regarde le contenu du StringGadget n'a pas changer
    
    Valeur = Val(GetGadgetText(#String)) ; On enregistre le contenu
    
    ; On corrige le contenu
    If Valeur < 1000
      SetGadgetText(#String, "1000")
    ElseIf Valeur > 10000
      SetGadgetText(#String, "10000")
    EndIf
  
  EndIf
EndProcedure


; Création de la fenêtre et dela GadgetList
If OpenWindow(0, 0, 0, 300, 100, #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget, "Test") = 0 Or CreateGadgetList(WindowID()) = 0
  End
EndIf

; On affiche les gadgets
TextGadget(#Texte, 5, 5, 290, 15, "Entrez un nombre compris entre 1000 et 10000 :")
StringGadget(#String, 5, 20, 290, 20, "5000", #PB_String_Numeric)
Nombre = 5000

; Boucle d'évènements
Repeat
  Event = WaitWindowEvent()
  
  If Event = #PB_EventGadget
    Select EventGadgetID() ; boutons, zone de texte, ...
      Case #String
        If Nombre <> Val(GetGadgetText(#String)) ; Si le contenu du StringGadget à changer
          Nombre = Val(GetGadgetText(#String)) ; On enregistre la nouvelle valeur
          
          If Nombre < 1000 ; si la valeur est inférieure à la limite
            CreateThread(@ChangeValeur(), Nombre) ; on lance un thread qui vérifiera le texte au bout de 2 secondes
            Nombre = 1000 ; on change la valeur
            
          ElseIf Nombre > 10000 ; si la valeur est supérieure à la limite
            CreateThread(@ChangeValeur(), Nombre) ; on lance un thread qui vérifiera le texte au bout de 2 secondes
            Nombre = 10000 ; on change la valeur
            
          EndIf
          
        EndIf
        
    EndSelect
  EndIf
  
Until Event = #PB_EventCloseWindow

End
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]