S'agit il d'un bug ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Francis13
Messages : 18
Inscription : dim. 21/févr./2010 7:29
Localisation : Marseille

S'agit il d'un bug ?

Message 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
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: S'agit il d'un bug ?

Message 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.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Francis13
Messages : 18
Inscription : dim. 21/févr./2010 7:29
Localisation : Marseille

Re: S'agit il d'un bug ?

Message 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
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: S'agit il d'un bug ?

Message 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.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Re: S'agit il d'un bug ?

Message 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 
ImageImage
Francis13
Messages : 18
Inscription : dim. 21/févr./2010 7:29
Localisation : Marseille

Re: S'agit il d'un bug ?

Message 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+
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: S'agit il d'un bug ?

Message 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
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: S'agit il d'un bug ?

Message 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("")
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)]
Francis13
Messages : 18
Inscription : dim. 21/févr./2010 7:29
Localisation : Marseille

Re: S'agit il d'un bug ?

Message par Francis13 »

bonsoir
merci à vous tous pour vos solutions
A+
Répondre