StringGadget entrer uniquement des chiffres, mais décimaux

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

StringGadget entrer uniquement des chiffres, mais décimaux

Message par MLD »

Salut a tous

L'option #PB_String_Numéric ne permet pas l'écriture de nombres décimaux.
Pourtant il est parfois nécéssaire dans un stringGadget d'écrire uniquement des chiffres, mais décimaux
Voici une solution. Si il y a plus court je suis preneur. :lol:

Code : Tout sélectionner

;MLD le 4/7/2010 Entrer dans un StringGaget uniquement des chiffres , mais décimaux
Procedure String_NumericD(Gadget)   
If Len(GetGadgetText(Gadget)) <>0 
 SendMessage_(GadgetID(Gadget), #EM_GETSEL, @Debut_Position, @Fin_position)     
  a$ = Mid(GetGadgetText(Gadget),Debut_position,1)
   ValeurASCII = Asc(a$) 
    If ValeurASCII = 46
     Else
     If ValeurASCII <48 Or ValeurASCII > 57  
      y = Debut_Position
      Texte.s = GetGadgetText(Gadget)
      x = Len(Texte)
      If Mid(Texte,y,1) = "," ; modification d'une virgule en point
       Texte2.s = Left(Texte,y -1) + "." + Right(Texte,x-y)
       SetGadgetText(Gadget,Texte2)
       SendMessage_(GadgetID(Gadget), #EM_SETSEL, x + 1, x + 1) 
      Else
       Texte2.s = Left(Texte,y -1) + Right(Texte,x-y)
       SetGadgetText(Gadget,Texte2)
       SendMessage_(GadgetID(Gadget), #EM_SETSEL, x-1, x-1)    
    EndIf 
  EndIf
 EndIf 
EndIf 
EndProcedure

OpenWindow(1 , 0, 0, 300, 145,  "") 
StringGadget(2,100, 50, 90, 20, "",#ES_CENTER )
SetActiveGadget(2) 
Repeat
Event = WaitWindowEvent()
 Select EventGadget()
  Case 2
  String_NumericD(2) 
 EndSelect 
Until event = #PB_Event_CloseWindow 
End
Michel
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: StringGadget entrer uniquement des chiffres, mais décima

Message par kernadec »

bonjour MLD
voila un post intéressant sur ce sujet : http://www.purebasic.fr/english/viewtop ... arseNumber

Cordialement
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: StringGadget entrer uniquement des chiffres, mais décima

Message par PAPIPP »

Bonjour MLD
VALD(xx) permet sans contrôle, de saisir tous les types numériques
Exemples 456.987 ou 0.2718E10 etc..

Code : Tout sélectionner

OpenWindow(1 , 0, 0, 300, 145,  "")
StringGadget(2,100, 50, 90, 20, "",#ES_CENTER )
ButtonGadget(3, 140, 100, 20, 20, "OK")
Repeat
  Event = WaitWindowEvent()
  eg=EventGadget()
Select EG
  Case 2
    Texte.s = GetGadgetText(2)
  Case 3  
    Debug ValD(texte) ;permet de saisir tous les types de numériques 456.78 ou 0.45657E45 sans contrôle
    SetActiveGadget(2)
EndSelect
Until event = #PB_Event_CloseWindow
End
A+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: StringGadget entrer uniquement des chiffres, mais décima

Message par MLD »

Bonjour PAPPIP
Là n'est pas la question :|
Il s'agit de pouvoir saisir a la volée que des chiffres avec éventuellement un point, ou virgule. Toute autres lettres ou signes étant proscrits :wink: comme #PB_String_Numéric mais avec décimaux, et avec la gestion du caret.



Merci a Kernadec

Code : Tout sélectionner

;MLD le 4/7/2010 Entrer dans un StringGaget uniquement des chiffres , mais décimaux
Procedure String_NumericD(Gadget)   
If Len(GetGadgetText(Gadget)) <>0 
SendMessage_(GadgetID(Gadget), #EM_GETSEL, @Debut_Position, @Fin_position)     
  a$ = Mid(GetGadgetText(Gadget),Debut_position,1)
   ValeurASCII = Asc(a$) 
    If ValeurASCII = 46
     Else
     If ValeurASCII <48 Or ValeurASCII > 57  
      y = Debut_Position
      Texte.s = GetGadgetText(Gadget)
      x = Len(Texte)
      If Mid(Texte,y,1) = "," ; modification d'une virgule en point
       Texte2.s = Left(Texte,y -1) + "." + Right(Texte,x-y)
       SetGadgetText(Gadget,Texte2)
       SendMessage_(GadgetID(Gadget), #EM_SETSEL, x + 1, x + 1) 
      Else
       Texte2.s = Left(Texte,y -1) + Right(Texte,x-y)
       SetGadgetText(Gadget,Texte2)
       SendMessage_(GadgetID(Gadget), #EM_SETSEL, x-1, x-1)    
    EndIf 
  EndIf
EndIf 
EndIf 
EndProcedure

OpenWindow(1 , 0, 0, 300, 145,  "") 
StringGadget(2,100, 30, 90, 20, "",#ES_CENTER )
SetActiveGadget(2) 
TextGadget(3,95, 60, 200, 20,"avec #PB_String_Numeric")
StringGadget(4,100, 80, 90, 20, "",#ES_CENTER |#PB_String_Numeric)
Repeat
Event = WaitWindowEvent()
Select EventGadget()
  Case 2
  String_NumericD(2) 
EndSelect 
Until event = #PB_Event_CloseWindow 
End

Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Re: StringGadget entrer uniquement des chiffres, mais décima

Message par Cls »

Pour vérifier qu'il s'agit bien d'un décimal, une expression régulière peut faire l'affaire :

Code : Tout sélectionner

CreateRegularExpression(0, "^\d+(\.\d+)?$")
Répondre