Saisie numérique dans un string gadget avec 1 à n décimales

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Saisie numérique dans un string gadget avec 1 à n décima

Message par Backup »

..........
Dernière modification par Backup le dim. 02/oct./2011 12:51, modifié 1 fois.
Avatar de l’utilisateur
falsam
Messages : 7318
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Saisie numérique dans un string gadget avec 1 à n décima

Message par falsam »

Dobro a écrit :je t'avais donné le lien mais bon ...

Typhoon avait fait ça
Rhoooo Dobro, je pense que tu n'as pas pris la peine de lire mon post qui est certes trop long :) J'ai inclus la procedure de Typhoon en n'oubliant pas de citer son nom.

Dobro a écrit :pis bon arrete avec tes PBI
Les include (Pbi) sont très pratiques et évitent ainsi d'alourdir un programme avec du code maintes fois testé.
Dobro a écrit :utilise les procedures comme ci dessus
Justement Dobro, ce sont des procédures :p
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Saisie numérique dans un string gadget avec 1 à n décima

Message par Backup »

falsam a écrit :
Dobro a écrit :pis bon arrete avec tes PBI
Les include (Pbi) sont très pratiques et évitent ainsi d'alourdir un programme avec du code maintes fois testé.
comprends pas l'intérêt !
autant utiliser une librairie dans ce cas ..
l'avantage , si tu n'utilise pas la fonction, elle n'est pas inclue !



falsam a écrit :
Dobro a écrit :utilise les procedures comme ci dessus
Justement Dobro, ce sont des procédures :p
pas forcement !
un pbi peut contenir du code autre que des procedures !!
des constantes par ex ;)
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Saisie numérique dans un string gadget avec 1 à n décima

Message par MLD »

Pour le fun. Une autre façon de voir les choses :mrgreen:

Code : Tout sélectionner

;********* MLD le 6/4/2011 *****************
Enumeration
#MainForm
#MntTtc
#MntHt
EndEnumeration

ind = 0 : text2$ = ""

Procedure affichemonetaire(montant.f)
text1$ = StrF(montant.f,2)
ReplaceString(text1$, ".", ",", #PB_String_InPlace, 1)
For x =  Len(text1$) To 1 Step -1
 ind = ind + 1
 text2$ = text2$ + Mid(text1$,x,1)
 If ind = 3
  ind = 0
  If Mid(text1$,x,1) <> ","
   text2$ = text2$ + " "
  EndIf
 EndIf
Next 
SetGadgetText(#MntTtc,ReverseString(text2$) + ".€")

EndProcedure 
Procedure CalculTTC()
  ;Convertissons la chaîne en une valeur numérique de type Float.
  MntHt.f=ValF(GetGadgetText(#MntHt))
  
  MntTtc.f=MntHt*(1.196)
   affichemonetaire(MntTtc.f)
EndProcedure
 OpenWindow(#MainForm,0,0,400,150,"Saisie monétaire",#PB_Window_ScreenCentered |#PB_Window_SizeGadget | #PB_Window_SystemMenu)
  
  TextGadget(#PB_Any,10,23,80,23,"Montant Ht")
  StringGadget(#MntHt,100,20,80,23,"0.00",#ES_RIGHT) 
  
  TextGadget(#PB_Any,10,43,80,23,"Montant Ttc")
  StringGadget(#MntTtc,100,40,80,23,"0.00 €",#PB_String_ReadOnly | #ES_RIGHT)
  SetGadgetColor(#MntTtc,#PB_Gadget_BackColor,$F9F9F9)
  TextGadget(#PB_Any,200,43,80,23,"Taux 19,60%")
  
  SetActiveGadget(#MntHt)
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      End 
      
    Case #PB_Event_Gadget
      If EventGadget() = #MntHt
                   
          Select EventType()
            Case #PB_EventType_LostFocus
              ;Calcul de du montant Ttc
              CalculTTC()
          EndSelect
      EndIf    
  EndSelect
ForEver
Avatar de l’utilisateur
falsam
Messages : 7318
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Saisie numérique dans un string gadget avec 1 à n décima

Message par falsam »

Hummmmmm non :) pas assez fun. Je préfère mon include certes plus long, mais qui permet de ne pas saisir deux fois la virgule par exemple.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Saisie numérique dans un string gadget avec 1 à n décima

Message par MLD »

falsam a écrit :Hummmmmm non :) pas assez fun. Je préfère mon include certes plus long, mais qui permet de ne pas saisir deux fois la virgule par exemple.
8O
Heu!. ou faut'il saisir deux fois la virgule :?: :?:
Avatar de l’utilisateur
falsam
Messages : 7318
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Saisie numérique dans un string gadget avec 1 à n décima

Message par falsam »

L'exemple que tu donnes permet de saisir des caractères alphanumériques.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Saisie numérique dans un string gadget avec 1 à n décima

Message par MLD »

falsam a écrit :L'exemple que tu donnes permet de saisir des caractères alphanumériques.
Salut
Exact. c'est pour transformer un chiffre en présentation monétaire.
Sinon, pour saisir uniquement des chiffres avec décimales dans un StringGadget, j'ai mis ceci sur le forum il y a déja quelques temps. :wink:

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
Avatar de l’utilisateur
falsam
Messages : 7318
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Saisie numérique dans un string gadget avec 1 à n décima

Message par falsam »

C'est mieux, mais le risque de saisir plus d'une fois le séparateur décimal est possible ce qui provoquera des erreurs de calcul.

Télécharge cette démo et tu verras la différence.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Saisie numérique dans un string gadget avec 1 à n décima

Message par MLD »

Ok .Il ne faut pas prendre les opérateurs pour des demeurés. Avec ton code quand je tape une virgule, elle n'est pas transformée en point, et le calcul est faux.
Alors un point partout, la balle au centre. :wink:
En ce moment le temps me manque, mais je te proposerait une solution. :wink:
Bonne journée
Michel
Avatar de l’utilisateur
falsam
Messages : 7318
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Saisie numérique dans un string gadget avec 1 à n décima

Message par falsam »

MLD a écrit :Ok .Il ne faut pas prendre les opérateurs pour des demeurés.
Sans les prendre pour des demeurés, le doigt est parfois lourd sur le clavier et certains oublient d'enlever les moufles :p

A bientôt.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Saisie numérique dans un string gadget avec 1 à n décima

Message par MLD »

Salut falsam

j'ai fait quelques modifs a mon code. en principe c'est ok :lol:

Code : Tout sélectionner

;********* MLD le 9/4/2011 *****************
Enumeration
#MainForm
#MntTtc
#MntHt
EndEnumeration

ind = 0 : text2$ = ""
Procedure String_NumericD(Gadget,NbDecim); Nombre de chiffre aprés la virgule  
If Len(GetGadgetText(Gadget)) <>0 
 SendMessage_(GadgetID(Gadget), #EM_GETSEL, @Debut_Position, @Fin_position)     
  Texte.s = GetGadgetText(Gadget)
  x = Len(Texte)
  If Mid(Texte.s,Len(Texte.s)-(NbDecim + 1),1) ="." ;limite les décimales
   SetGadgetText(Gadget,Left(Texte,x-1))
   SendMessage_(GadgetID(Gadget), #EM_SETSEL, x-1, x-1) 
   ProcedureReturn #NUL 
  EndIf
   a$ = Mid(GetGadgetText(Gadget),Debut_position,1)
    ValeurASCII = Asc(a$) 
    If ValeurASCII = 46 Or ValeurASCII = 44 ;interdit deux points
     xz = Len(Texte)
     placepoint = FindString(Left(Texte,xz-1),".",1)
     If placepoint <> 0 And  Len(Texte) <> placepoint And Mid(Texte,Len(Texte),1) = "."
      SetGadgetText(Gadget,Left(Texte,xz-1))
      SendMessage_(GadgetID(Gadget), #EM_SETSEL, xz-1, xz-1) 
     EndIf
    EndIf  
    If ValeurASCII = 46
     Else
     If ValeurASCII <48 Or ValeurASCII > 57  
      y = Debut_Position
      Texte.s = GetGadgetText(Gadget)
      xx = Len(Texte)
      If Mid(Texte,y,1) = "," ; modification d'une virgule en point
       Texte2.s = Left(Texte,y -1) + "." 
       SetGadgetText(Gadget,Texte2)
       SendMessage_(GadgetID(Gadget), #EM_SETSEL, xx + 1, xx + 1) 
      Else
       SetGadgetText(Gadget,Left(Texte,y -1))
       SendMessage_(GadgetID(Gadget), #EM_SETSEL, xx-1, xx-1)    
    EndIf 
  EndIf
 EndIf 
EndIf 
EndProcedure

Procedure affichemonetaire(montant.f);affichage en format monétaire
text1$ = StrF(montant.f,2)
ReplaceString(text1$, ".", ",", #PB_String_InPlace, 1)
For x =  Len(text1$) To 1 Step -1
ind = ind + 1
text2$ = text2$ + Mid(text1$,x,1)
If ind = 3
  ind = 0
  If Mid(text1$,x,1) <> ","
   text2$ = text2$ + " "
  EndIf
EndIf
Next 
SetGadgetText(#MntTtc,ReverseString(text2$) + ".€")
EndProcedure 
Procedure CalculTTC()
  ;Convertissons la chaîne en une valeur numérique de type Float.
  MntHt.f=ValF(GetGadgetText(#MntHt))
  
  MntTtc.f=MntHt*(1.196)
   affichemonetaire(MntTtc.f)
EndProcedure
OpenWindow(#MainForm,0,0,400,150,"Saisie monétaire",#PB_Window_ScreenCentered |#PB_Window_SizeGadget | #PB_Window_SystemMenu)
  
  TextGadget(#PB_Any,10,23,80,23,"Montant Ht")
  StringGadget(#MntHt,100,20,80,23,"0.00",#ES_RIGHT) 
  
  TextGadget(#PB_Any,10,43,80,23,"Montant Ttc")
  StringGadget(#MntTtc,100,40,80,23,"0.00 €",#PB_String_ReadOnly | #ES_RIGHT)
  SetGadgetColor(#MntTtc,#PB_Gadget_BackColor,$F9F9F9)
  TextGadget(#PB_Any,200,43,80,23,"Taux 19,60%")
  
  SetActiveGadget(#MntHt)
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      End 
      
    Case #PB_Event_Gadget
      If EventGadget() = #MntHt
           String_NumericD(2,2)         
          Select EventType()
            Case #PB_EventType_LostFocus
              ;Calcul de du montant Ttc
              CalculTTC()
          EndSelect
      EndIf    
  EndSelect
ForEver

Nombre de chiffres aprés le point illimité a la saisie, selon le choix. Point ou virgule pris en compte.

Bon W.E :lol:
Michel
Avatar de l’utilisateur
GeBonet
Messages : 453
Inscription : ven. 29/févr./2008 16:17
Localisation : Belgique

Re: Saisie numérique dans un string gadget avec 1 à n décima

Message par GeBonet »

Bonne, et intéressante collaboration... J'ajoute ma très très petite pierre à l''édifice... Par :

Code : Tout sélectionner

; -------------------------------------------------
IncludeFile "StrMaskDec.pbi"

Global TTva.f       ; <================ Pour commencer ! 

Enumeration
	#MainForm
	#MntHt
	#TauxTVA    ; <====================== ICI 
	#MntTtc
EndEnumeration

Procedure CalculTTC()
	;Convertissons la chaîne en une valeur numérique de type Float.
	;Ici nous utilisons la fonction StrToNumStr pour nous debarasser du format d'edition
	MntHt.f=ValF(StrToNumStr(GetGadgetText(#MntHt)))
	MntTtc.f=MntHt+(MntHt*TTva/100)     ; < ========================== ICI Aussi 
	SetGadgetText(#MntTtc,StrFormat(StrF(MntTtc,2),"### ###.## €"))
EndProcedure

Procedure MainFormShow()
	If OpenWindow(#MainForm,0,0,400,150,"Saisie monétaire",#PB_Window_ScreenCentered |#PB_Window_SizeGadget | #PB_Window_SystemMenu)
	  ;
  	TextGadget(#PB_Any,10,23,80,23,"Montant Ht")
  	StringGadget(#MntHt,100,20,80,23,"0.00",#ES_RIGHT) 
  	;
  	TextGadget(#PB_Any,10,46,80,23,"Taux Tva :")                   ; <====== Là 
  	StringGadget(#TauxTVA,100,43,80,23,"0.00",#ES_RIGHT)     ; <====== Et Là 
  	;
  	SetGadgetColor(#TauxTVA,#PB_Gadget_BackColor,$F9F9F9)
  	TextGadget(#PB_Any,10,69,80,23,"Montant Ttc")
  	;
  	StringGadget(#MntTtc,100,66,80,23,"0.00 €",#PB_String_ReadOnly | #ES_RIGHT)
  	SetGadgetColor(#MntTtc,#PB_Gadget_BackColor,$F9F9F9)
  	;
  	SetActiveGadget(#MntHt)
	EndIf
EndProcedure

MainFormShow()

Repeat
	Select WaitWindowEvent()
		Case #PB_Event_CloseWindow
			End 
		Case #PB_Event_Gadget
			If EventGadget() = #MntHt
					; C'est ici qu'on applique le format d'edition 
					StrMaskDec(#MntHt,5,2,"### ###.## €")
			ElseIf EventGadget() = #TauxTVA                               ; <======== ET enfin 
				  StrMaskDec(#TauxTVA,3,2,"###.## %")           ; <========
					Select EventType()
						Case #PB_EventType_LostFocus
						  ; Calcul de du montant Ttc
         			TTva=ValF(StrToNumStr(GetGadgetText(#TauxTVA))) ;  ; <========
						CalculTTC()
					EndSelect
			EndIf    
	EndSelect
ForEver
Cela n'ajoute rien de plus que de pouvoir entrer le Taux de TVA...
Et de montrer comment utiliser étendre votre code !!! :wink:
Merci :lol:
Windows 7 et Windows 8.1 Pb 5.0 jusque 5.24 Lts 64 et 5.3 (64)/b]
“Ceux qui rêvent éveillés ont conscience de mille choses qui échappent à ceux qui ne rêvent qu’endormis.”
-Edgar Allan Poe-
Avatar de l’utilisateur
falsam
Messages : 7318
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Saisie numérique dans un string gadget avec 1 à n décima

Message par falsam »

C'est drole j'ai l'impression de retrouver mon code en début de se post :p La boucle est ....bouclée.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Saisie numérique dans un string gadget avec 1 à n décima

Message par MLD »

OUI,oui
Gebonnet tu parle de quelle collaboration ? falsam as tu essayé mon dernier code?
Salut les amis
Répondre