Page 1 sur 1

S'agit il d'un bug ?

Publié : lun. 08/mars/2010 21:23
par Francis13
Bonjour à tous
lorsqu'on veut saisir une valeur décimale dans un stringGadget avec l'option numérique
,on ne peut pas saisir le séparateur point.
Le code ci après illustre ce problème .

Code : Tout sélectionner

Define.f nb1,nb2,resultat
;- Window Constants
;
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #String_0
  #String_1
  #Text_0
  #Text_1
  #Image_0
  #Image_1
  #Button_0
  #Button_1
  #Text_2
EndEnumeration

;- Fonts
Global FontID1
FontID1 = LoadFont(1, "Arial", 16, #PB_Font_Bold)
;- Image Plugins

;- Image Globals
Global Image0
Global Image1

;- Catch Images
Image0 = CatchImage(0, ?Image0)
Image1 = CatchImage(1, ?Image1)

;- Images
DataSection
Image0:
  IncludeBinary "champignon.bmp"
Image1:
  IncludeBinary "araignee.bmp"
EndDataSection

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 216, 0, 600, 300, "Etude StringGadget",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
      StringGadget(#String_0, 420, 20, 120, 40, "",#PB_String_Numeric   )
      StringGadget(#String_1, 420, 80, 120, 40, "",#PB_String_Numeric   )
      TextGadget(#Text_0, 290, 20, 120, 40, "Rentrez le premier nombre", #PB_Text_Center | #PB_Text_Border)
      TextGadget(#Text_1, 290, 80, 120, 40, "Rentrez le deuxième nombre", #PB_Text_Center | #PB_Text_Border)
      ImageGadget(#Image_0, 430, 170, 70, 70, Image0)
      ImageGadget(#Image_1, 330, 170, 70, 70, Image1)
      ButtonGadget(#Button_0, 50, 130, 100, 50, "Calculer")
      ButtonGadget(#Button_1, 50, 190, 100, 50, "Quitter")
      TextGadget(#Text_2, 40, 20, 160, 80, "", #PB_Text_Center | #PB_Text_Border)
      SetGadgetFont(#Text_2, FontID1)
     
   
  EndIf
EndProcedure

Open_Window_0()
Repeat
       Event =WaitWindowEvent()
         If Event =#PB_Event_Gadget
             Select EventGadget()
                  Case #String_0 
                       nb1 =ValF(GetGadgetText(#String_0))
                  Case #String_1
                       nb2 =ValF(GetGadgetText(#String_1))                                             
                  Case #Button_0
                       resultat =nb1 + nb2
                       SetGadgetText(#Text_2,StrF(resultat,2))
                  Case #button_1
                       Event =#PB_Event_CloseWindow 
               EndSelect
          EndIf                     
        
 Until Event =  #PB_Event_CloseWindow 
il manque les images bmp que je ne sais pas joindre
merci pour vos remarques

Re: S'agit il d'un bug ?

Publié : lun. 08/mars/2010 21:35
par Ar-S
Salut,
ce n'est pas un bug,
la doc dit bien : #PB_String_Numeric : Mode 'numeric'. Seuls des chiffres peuvent être saisis.

Re: S'agit il d'un bug ?

Publié : lun. 08/mars/2010 22:01
par Francis13
salut,
bien compris ,pour les nombres décimaux il faut effacer cette option.
C'est un peu dommage car on perd le contrôle de la saisie.
A+
merci

Re: S'agit il d'un bug ?

Publié : lun. 08/mars/2010 22:08
par Ar-S
C'est vrai que c'est un peu gênant, ça oblige à faire une procédure qui vérifie qu'il ni a bien que des chiffres OU des points (ou virgules).
Jette un œil à la commande CreateRegularExpression(), ça te simplifiera la vie je pense.

Re: S'agit il d'un bug ?

Publié : lun. 08/mars/2010 22:33
par case
je connais pas cette fonction ars.. mais j'ai deja fait ca a ma sauce ,) je vais zieuter ma doc cependant ,)
du coup tu peux utiliser le point ou la virgule pour séparer les décimales

un petit conseil, pour les procédures il est plus simple a mon avis de les déclarer en début de programme
car sinon si une procédure en appelle une autre il faut qu'elle soit écrite avant dans le programme
par exemple

Code : Tout sélectionner


procedure b()
   procedure a()
endprocedure
procedure a()
endprocedure

b()
ne fonctionera pas et generera une erreur car le compilateur quand il rencontre le a() ne connais pas encore la proceudre a()

alors que

Code : Tout sélectionner

declare a()
declare b()

b()

procedure b()
   procedure a()
endprocedure
procedure a()
endprocedure
fonctionnera très bien

Code : Tout sélectionner

Define.f nb1,nb2,resultat
;- Window Constants
;
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #String_0
  #String_1
  #Text_0
  #Text_1
  #Image_0
  #Image_1
  #Button_0
  #Button_1
  #Text_2
EndEnumeration

;- Fonts
Global FontID1
FontID1 = LoadFont(1, "Arial", 16, #PB_Font_Bold)
;- Image Plugins

;- Image Globals
Global Image0
Global Image1

;- Catch Images
Image0 = CatchImage(0, ?Image0)
Image1 = CatchImage(1, ?Image1)

;- Images
DataSection
Image0:
  IncludeBinary "champignon.bmp"
Image1:
  IncludeBinary "araignee.bmp"
EndDataSection

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 216, 0, 600, 300, "Etude StringGadget",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
      StringGadget(#String_0, 420, 20, 120, 40, ""   )
      StringGadget(#String_1, 420, 80, 120, 40, ""   )
      TextGadget(#Text_0, 290, 20, 120, 40, "Rentrez le premier nombre", #PB_Text_Center | #PB_Text_Border)
      TextGadget(#Text_1, 290, 80, 120, 40, "Rentrez le deuxième nombre", #PB_Text_Center | #PB_Text_Border)
      ImageGadget(#Image_0, 430, 170, 70, 70, Image0)
      ImageGadget(#Image_1, 330, 170, 70, 70, Image1)
      ButtonGadget(#Button_0, 50, 130, 100, 50, "Calculer")
      ButtonGadget(#Button_1, 50, 190, 100, 50, "Quitter")
      TextGadget(#Text_2, 40, 20, 160, 80, "", #PB_Text_Center | #PB_Text_Border)
      SetGadgetFont(#Text_2, FontID1)      
  EndIf
EndProcedure
Procedure checksaisie(gadget)
  ret=1 ; renvoi cette valeur si tout est ok dans la saisieOK
  st$=GetGadgetText(#String_0)
  For a=32 To 255 
    Select a
    Case 48 To 57
      ; ne rien faire      
    Case 46,44
      If CountString(st$,Chr(a))>1
        ret=0
        Break 
      EndIf
    Default    
      If FindString(st$,Chr(a),1)        
        ret=0
        Break
      EndIf
    EndSelect
  Next  
  ProcedureReturn ret
EndProcedure
Open_Window_0()
Repeat
       Event =WaitWindowEvent()
         If Event =#PB_Event_Gadget
             Select EventGadget()
                  Case #String_0
                       If checksaisie(#String_0)
                          bck0$=GetGadgetText(#String_0)
                       Else
                         SetGadgetText(#String_0,bck0$) 
                         SendMessage_(GadgetID(#String_0),#EM_SETSEL,$FFFFFFF,$FFFFFFF)    
                       EndIf
                  Case #String_1
                       If checksaisie(#String_1)
                         bck1$=GetGadgetText(#String_1)
                       Else
                         SetGadgetText(#String_1,bck1$)     
                         SendMessage_(GadgetID(#String_1),#EM_SETSEL,$FFFFFFF,$FFFFFFF                  )
                       EndIf
                  Case #Button_0
                       resultat =ValF(ReplaceString(GetGadgetText(#String_0),",",".")) + ValF(ReplaceString(GetGadgetText(#String_1),",","."))
                       SetGadgetText(#Text_2,StrF(resultat,2))
                  Case #button_1
                       Event =#PB_Event_CloseWindow
               EndSelect
          EndIf                            
Until Event =  #PB_Event_CloseWindow 

Re: S'agit il d'un bug ?

Publié : mar. 09/mars/2010 8:08
par Francis13
Bonjour
J'ai testé cette nouvelle version avec les procédures et des api Windows.
que je ne connais pas.Je vais étudier cela.
merci
A+

Re: S'agit il d'un bug ?

Publié : mar. 09/mars/2010 10:28
par kernadec
bonjour Francis13
il y a cette solution aussi avec le code de "Netmaestro" ici:
http://www.purebasic.fr/english/viewtop ... et+decimal
il fonctionne avec les touches numérique horizontale et la virgule.
il te suffira de l'adapter pour le pavé numérique.

Cordialement

Re: S'agit il d'un bug ?

Publié : mar. 09/mars/2010 18:17
par Le Soldat Inconnu
pour tester si un texte est un chiffre

Code : Tout sélectionner

Procedure IsVal(Chaine.s)
  ; Retourne différent de 0 si la chaine est un nombre
  If RSet(StrD(ValD(Chaine)), Len(Chaine), "0") = Chaine And Chaine
    ProcedureReturn 1
  Else
    ProcedureReturn 0
  EndIf
EndProcedure

Debug IsVal("12")
Debug IsVal("-1052")
Debug IsVal("1.25")
Debug IsVal("0")
Debug IsVal("00123")
Debug IsVal("bonjour")
Debug IsVal("10 bonjour")
Debug IsVal("a198")
Debug IsVal("0011_")
Debug IsVal("")

Re: S'agit il d'un bug ?

Publié : mar. 09/mars/2010 21:29
par Francis13
bonsoir
merci à vous tous pour vos solutions
A+