Page 1 sur 1

String Gadget Numérique

Publié : sam. 06/déc./2014 22:48
par Lord Nelson
Bonsoir,

Bha voilà, j'en avais besoin donc j'ai créer ça, c'est très simple mais rudement efficace !

Code : Tout sélectionner

Procedure.l IsNumerique(Chaine$)
  
  If Chaine$ = "" Or Chaine$ = "."
    ProcedureReturn #False
  EndIf
  
  For Caractere = 0 To 255
    
    Select Caractere
        
      Case 0 To 45, 47, 58 To 255
        
        If FindString(Chaine$, Chr(Caractere), 1)
          ProcedureReturn #False
        EndIf
        
    EndSelect
    
  Next
  
  If CountString(Chaine$, ".") > 1 
    ProcedureReturn #False
  EndIf
  
  ProcedureReturn #True
EndProcedure

If OpenWindow(0, 0, 0, 322, 205, "Entrez un nombre", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  StringGadget(1, 8,  35, 306, 20, "")
  
  Repeat
    
    Evenement = WaitWindowEvent(1)
    EventType = EventType() 
    
    If EventType = #PB_EventType_Change
      
      Chaine$ = GetGadgetText(1)
      
      If Not IsNumerique(Chaine$)
        
        If SauvegardeChaine$ > ""
          
          SetGadgetText(1, SauvegardeChaine$)
          
          keybd_event_(#VK_END,0,0,0)
          keybd_event_(#VK_END,0,2,0)
          
        Else
          SetGadgetText(1, "")
          
        EndIf
        
      Else
        SauvegardeChaine$ = Chaine$
        
      EndIf
      
    EndIf
    
    
  Until Evenement = #PB_Event_CloseWindow
  
EndIf

Re: StringGadget Numérique

Publié : sam. 06/déc./2014 22:58
par falsam
Sujet déja évoqué mais c'est pas mal. Je dis pas mal car on ne peut pas effacer le 1er caractère saisi.

Ensuite j'aurais appelé cette procédure IsDecimal()

Amélioration à apporter : Spécifier le nombre de chiffres aprés le point décimal.

Fonction : IsDecimal(Chaine$, Decimal = 2) (2 par défaut)

Re: StringGadget Numérique

Publié : sam. 06/déc./2014 23:32
par Lord Nelson
Correction:

Code : Tout sélectionner

Procedure.l IsNumerique(Chaine$)
 
  If Chaine$ = "" Or Chaine$ = "."
    ProcedureReturn #False
  EndIf
 
  For Caractere = 0 To 255
   
    Select Caractere
       
      Case 0 To 45, 47, 58 To 255
       
        If FindString(Chaine$, Chr(Caractere), 1)
          ProcedureReturn #False
        EndIf
       
    EndSelect
   
  Next
 
  If CountString(Chaine$, ".") > 1
    ProcedureReturn #False
  EndIf
 
  ProcedureReturn #True
EndProcedure

If OpenWindow(0, 0, 0, 322, 205, "Entrez un nombre", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  StringGadget(1, 8,  35, 306, 20, "")
  
  Repeat
    
    Evenement = WaitWindowEvent(1)
    EventType = EventType() 
    
    If EventType = #PB_EventType_Change
      
      Chaine$ = GetGadgetText(1)
      
      If Not IsNumerique(Chaine$)
        
        If SauvegardeChaine$ > ""
          
          If Chaine$ = ""
            SauvegardeChaine$ = ""
          EndIf
          
          SetGadgetText(1, SauvegardeChaine$)
          
          keybd_event_(#VK_END,0,0,0)
          keybd_event_(#VK_END,0,2,0)
          
        Else
          SetGadgetText(1, "")
          
        EndIf
        
      Else
        
        SauvegardeChaine$ = Chaine$
        
      EndIf
      
    EndIf
    
  Until Evenement = #PB_Event_CloseWindow
  
EndIf
Pour le reste, non, c'est bien Si numérique et pas décimale car tu peut entrer un nombre entier comme décimale !
De plus, pourquoi Spécifier le nombre de chiffres aprés le point décimal ?

Re: StringGadget Numérique

Publié : sam. 06/déc./2014 23:54
par falsam
Lord Nelson a écrit :De plus, pourquoi Spécifier le nombre de chiffres aprés le point décimal ?
Parce que c'est souvent le cas dans des applications de gestion.

Re: StringGadget Numérique

Publié : dim. 07/déc./2014 0:34
par nico
Je t'encourage pas à poster dans cette section, "Trucs et astuces" est une vitrine; c'est pas un fourre tout.

Re: StringGadget Numérique

Publié : dim. 07/déc./2014 0:39
par falsam
Nico tu me surprends. Tu ne lui a pas dit d'utiliser une méthode de subclassing pour contrôler la saisie avant l'affichage :)