Progression SpinGadget

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
ChrisR
Messages : 235
Inscription : sam. 14/févr./2015 16:20

Progression SpinGadget

Message par ChrisR »

Y a t-il un moyen, a partir d'un SpinGadget de changer le pas de progression des boutons haut, bas ?
J'ai essayé, voir le code exemple ci-dessous. Il fonctionne si on va doucement.
Mais en restant appuyé sur haut ou bas, la progression de 1 par défaut va plus vite que la gestion des events.

Code : Tout sélectionner

Enumeration FormGadget
  #WinMain
  #SpinGadget
EndEnumeration

Define Progression = 10

OpenWindow(#WinMain, x, y, 140, 50, "Spin Progress", #PB_Window_SystemMenu)
SpinGadget(#SpinGadget, 20, 10, 100, 25, 140, 1920, #PB_Spin_Numeric)
SetGadgetState(#SpinGadget, WindowWidth(#WinMain))

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      End

    Case #PB_Event_Gadget
      Select EventGadget()
        Case #SpinGadget
              If EventType() = #PB_EventType_Up : SetGadgetState(#SpinGadget, GetGadgetState(#SpinGadget)+Progression-1) : EndIf
              If EventType() = #PB_EventType_Down : SetGadgetState(#SpinGadget, GetGadgetState(#SpinGadget)-Progression+1) : EndIf
              If EventType() = #PB_EventType_Change
                ResizeWindow(#WinMain, #PB_Ignore, #PB_Ignore, GetGadgetState(#SpinGadget), #PB_Ignore)
              EndIf
      EndSelect
  EndSelect
ForEver
Shadow
Messages : 1413
Inscription : mer. 04/nov./2015 17:39

Re: Progression SpinGadget

Message par Shadow »

Je ne sais pas si ont peut changer le pas, c'est vraie qu'il n'y à pas de paramètre pour ça.
Voici ton code avec des correction, ça fonctionne mieux:

Code : Tout sélectionner

Enumeration FormGadget
  #WinMain
  #SpinGadget
EndEnumeration

Define Progression = 10

OpenWindow(#WinMain, x, y, 140, 50, "Spin Progress", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
SpinGadget(#SpinGadget, 20, 10, 100, 25, 140, 1920, #PB_Spin_Numeric)
SetGadgetState(#SpinGadget, WindowWidth(#WinMain))

Repeat
  
  Select WaitWindowEvent()
      
    Case #PB_Event_CloseWindow
      End
      
    Case #PB_Event_Gadget
      
      Select EventGadget()
          
        Case #SpinGadget
          
          Select EventType()
              
            Case #PB_EventType_Up
              SetGadgetState(#SpinGadget, GetGadgetState(#SpinGadget) + Progression - 1)
              ResizeWindow(#WinMain, #PB_Ignore, #PB_Ignore, GetGadgetState(#SpinGadget), #PB_Ignore)
              
            Case #PB_EventType_Down
              SetGadgetState(#SpinGadget, GetGadgetState(#SpinGadget) - Progression + 1)
              ResizeWindow(#WinMain, #PB_Ignore, #PB_Ignore, GetGadgetState(#SpinGadget), #PB_Ignore)
              
          EndSelect
          
      EndSelect
      
  EndSelect
  
ForEver
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Progression SpinGadget

Message par Ollivier »

Ça:

Code : Tout sélectionner

#PB_Spin_Numeric
-> c'est de trop
Pourquoi? Parce que tu prends "déjà" (dans la boucle d'événements) en charge les événements. Il me semble que cette option convient bien pour une progression automatique "un par un", qui ne nécessite aucune gestion d'événement.

Ensuite, ça

Code : Tout sélectionner

Progression + 1
ça se traduit par:
0, 11, 22, 33, etc...

Intuitivement, j'ai l'impression que tu cherches un simple :
0, 10, 20, 30, etc...

Donc le +1 me semble de trop.

En enlevant les +1 et les -1, et l'option #PB_Spin_Numeric, tu devrais retomber sur tes pattes.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Progression SpinGadget

Message par falsam »

@Shadow : Ton code ne change rien au comportement du spin. Presse le bouton Up suffisamment longtemps. La progression n'est plus de 10 en 10.

@Ollivier : Hummm sans #PB_Spin_Numeric pas de calcul
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
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Progression SpinGadget

Message par falsam »

De cette manière il n'y a plus de souci de décalage d'incrémentation/décrémentation.

Code : Tout sélectionner

Enumeration FormGadget
  #WinMain
  #SpinGadget
EndEnumeration

Define Count = 140, Progression = 10

OpenWindow(#WinMain, x, y, 140, 50, "Spin Progress", #PB_Window_SystemMenu)
SpinGadget(#SpinGadget, 20, 10, 100, 25, 140, 1920, #PB_Spin_Numeric)
SetGadgetText(#SpinGadget, "140")
SetGadgetState(#SpinGadget, WindowWidth(#WinMain))

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      End
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #SpinGadget
          Select EventType()
            Case #PB_EventType_Up   : Count + 10
            Case #PB_EventType_Down : Count - 10
          EndSelect 
          SetGadgetText(#SpinGadget, Str(Count))
          ResizeWindow(#WinMain, #PB_Ignore, #PB_Ignore, GetGadgetState(#SpinGadget), #PB_Ignore)
      EndSelect
  EndSelect
ForEver
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
ChrisR
Messages : 235
Inscription : sam. 14/févr./2015 16:20

Re: Progression SpinGadget

Message par ChrisR »

En effet Olivier, je veux 0, 10, 20, 30... j'avais ajouté pour cela le +1 ou -1 dans GetGadgetState(#SpinGadget)+Progression-1)

C'est résolu avec le code de Falsam, en gérant avec son propre compteur. Parfait, merci :)
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: Progression SpinGadget

Message par PAPIPP »

Bonjour à tous

Et pour éviter d’avoir un texte du spingadget qui diminue en dessous de la valeur originale.

Code : Tout sélectionner

Enumeration FormGadget
	#WinMain
	#SpinGadget
EndEnumeration

Define Count = 140, Progression = 10

OpenWindow(#WinMain, x, y, 140, 50, "Spin Progress", #PB_Window_SystemMenu)
SpinGadget(#SpinGadget, 20, 10, 100, 25, 140, 1920, #PB_Spin_Numeric)
SetGadgetText(#SpinGadget, "140")
SetGadgetState(#SpinGadget, WindowWidth(#WinMain))

Repeat
	Select WaitWindowEvent()
		Case #PB_Event_CloseWindow
			End
			
		Case #PB_Event_Gadget
			Select EventGadget()
				Case #SpinGadget
					Select EventType()
						Case #PB_EventType_Up   : Count + 1
						Case #PB_EventType_Down : Count - 1
					EndSelect 
; 					SetGadgetText(#SpinGadget, Str(Count))
					SetGadgetText(#SpinGadget,str(GetGadgetState(#SpinGadget)) )
					ResizeWindow(#WinMain, #PB_Ignore, #PB_Ignore, GetGadgetState(#SpinGadget), #PB_Ignore)
			EndSelect
	EndSelect
ForEver

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
ChrisR
Messages : 235
Inscription : sam. 14/févr./2015 16:20

Re: Progression SpinGadget

Message par ChrisR »

Bonjour PAPIPP
Avec un pas de progression de 1 (Count+1(-1)), il n'y a pas besoin de passer par le compteur count.
Il est fait automatiquement par PB et ceci suffit:

Code : Tout sélectionner

Case #SpinGadget
ResizeWindow(#WinMain, #PB_Ignore, #PB_Ignore, GetGadgetState(#SpinGadget), #PB_Ignore) 
Pour un pas de progression <> 1, il faut en effet passer par un compteur externe au Gadget
et utiliser SetGadgetText(#SpinGadget, Str(Count))
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: Progression SpinGadget

Message par PAPIPP »

OK
mais alors il faut limiter les valeurs < 140

Code : Tout sélectionner

Enumeration FormGadget
	#WinMain
	#SpinGadget
EndEnumeration

Define Count = 140, Progression = 10

OpenWindow(#WinMain, x, y, 140, 50, "Spin Progress", #PB_Window_SystemMenu)
SpinGadget(#SpinGadget, 20, 10, 100, 25, 140, 1920, #PB_Spin_Numeric)
SetGadgetText(#SpinGadget, "140")
SetGadgetState(#SpinGadget, WindowWidth(#WinMain))

Repeat
	Select WaitWindowEvent()
		Case #PB_Event_CloseWindow
			End
			
		Case #PB_Event_Gadget
			Select EventGadget()
				Case #SpinGadget
					Select EventType()
						Case #PB_EventType_Up   : Count + 10
						Case #PB_EventType_Down : Count - 10
					EndSelect 
					if count<140
					  count=140
					endif  
					SetGadgetText(#SpinGadget, Str(Count))
					ResizeWindow(#WinMain, #PB_Ignore, #PB_Ignore, GetGadgetState(#SpinGadget), #PB_Ignore)
			EndSelect
	EndSelect
ForEver
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
ChrisR
Messages : 235
Inscription : sam. 14/févr./2015 16:20

Re: Progression SpinGadget

Message par ChrisR »

ChrisR a écrit :C'est résolu avec le code de Falsam, en gérant avec son propre compteur. Parfait, merci :)
:? , le code fonctionne bien pour les flèches haut et bas mais malheureusement il n'est plus possible de saisir dans le SpinGadget.
J'ai cherché un peu mais j'ai pas réussi avec le SpinGadget seul. Une idée ?

J'ai contourné avec un StringGadget + SpinGadget. Y a t'il mieux a faire?

Code : Tout sélectionner

Enumeration FormGadget
  #WinMain
  #StringSpinGadget
  #SpinGadget
EndEnumeration

Define Count = 140, Progress = 10, MinSpin, MaxSpin 

OpenWindow(#WinMain, 0, 0, 140, 50, "Spin Progress", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
StringGadget(#StringSpinGadget, 20, 10, 80, 25, "140", #PB_String_Numeric)
SpinGadget(#SpinGadget, 100, 10, 18, 25, 0, 1920, #PB_Spin_Numeric)
MinSpin = GetGadgetAttribute(#SpinGadget, #PB_Spin_Minimum)
MaxSpin = GetGadgetAttribute(#SpinGadget, #PB_Spin_Maximum)
    
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      End
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #SpinGadget
          Select EventType()
            Case #PB_EventType_Up
              Count + Progress
              If Count > MaxSpin : Count = MaxSpin : EndIf
            Case #PB_EventType_Down
              Count - Progress
              If Count < MinSpin : Count = MinSpin : EndIf
            Case #PB_EventType_Change
              SetGadgetText(#StringSpinGadget, Str(Count))
              ResizeWindow(#WinMain, #PB_Ignore, #PB_Ignore, Count, #PB_Ignore)              
          EndSelect      
          
        Case #StringSpinGadget
          If EventType() = #PB_EventType_Change 
            Count = Val(GetGadgetText(#StringSpinGadget))
            If Count < MinSpin : Count = MinSpin : SetGadgetText(#StringSpinGadget, Str(Count)) : EndIf 
            If Count > MaxSpin : Count = MaxSpin : SetGadgetText(#StringSpinGadget, Str(Count)) : EndIf              
            ResizeWindow(#WinMain, #PB_Ignore, #PB_Ignore, Count, #PB_Ignore)
          EndIf
              
      EndSelect
  EndSelect
ForEver  
Il me semblerait intéressant d'avoir la valeur de Deplacement (optionnel) en natif PB.
Avatar de l’utilisateur
ChrisR
Messages : 235
Inscription : sam. 14/févr./2015 16:20

Re: Progression SpinGadget

Message par ChrisR »

@PAPIPP
Je ne sais pas comment il pourrait être fait pour utiliser une valeur mini, pas d'idée!
Si par exemple, on fixe 140 en mini et que l'on veut saisir 220, au premier 2 saisi au clavier, il envoie un event. Si on ajoute un contrôle < 140 a réception de l’événement, alors il remplace le premier 2 saisi par 140.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Progression SpinGadget

Message par Ar-S »

Peut-être en utilisant If len( str(count)) > 2

Au début de code je remplacerai

Code : Tout sélectionner

MinSpin = GetGadgetAttribute(#SpinGadget, #PB_Spin_Minimum)
MaxSpin = GetGadgetAttribute(#SpinGadget, #PB_Spin_Maximum)

;par

MinSpin = 140
SetGadgetAttribute(#SpinGadget, #PB_Spin_Minimum, MinSpin )
Car ça ne sert à rien de descendre au dessous.
~~~~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
ChrisR
Messages : 235
Inscription : sam. 14/févr./2015 16:20

Re: Progression SpinGadget

Message par ChrisR »

Ar-S a écrit :Peut-être en utilisant If len( str(count)) > 2
Yep, merci :)

Code : Tout sélectionner

If Len(Str(count)) > 2 And Count < MinSpin : Count = MinSpin : SetGadgetText(#StringSpinGadget, Str(Count)) : EndIf
Avatar de l’utilisateur
ChrisR
Messages : 235
Inscription : sam. 14/févr./2015 16:20

Re: Progression SpinGadget

Message par ChrisR »

Le code final, merci :)

Code : Tout sélectionner

Enumeration FormGadget
  #WinMain
  #SpinStringGadget
  #SpinGadget
EndEnumeration

Define Progress = 10
Define SpinCount, SpinMax, SpinMin, SpinMinLen 

OpenWindow(#WinMain, 0, 0, 140, 50, "Spin Progress", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
StringGadget(#SpinStringGadget, 20, 10, 80, 25, "140", #PB_String_Numeric)
SpinGadget(#SpinGadget, 100, 10, 18, 25, 140, 1920, #PB_Spin_Numeric)
SpinCount = Val(GetGadgetText(#SpinStringGadget))
SpinMax = GetGadgetAttribute(#SpinGadget, #PB_Spin_Maximum)
SpinMin = GetGadgetAttribute(#SpinGadget, #PB_Spin_Minimum)
SpinMinLen = Len(Str(SpinMin))-1

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      End
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #SpinGadget
          Select EventType()
            Case #PB_EventType_Up
              SpinCount + Progress
              If SpinCount > SpinMax : SpinCount = SpinMax : EndIf
            Case #PB_EventType_Down
              SpinCount - Progress
              If SpinCount < SpinMin : SpinCount = SpinMin : EndIf
            EndSelect  
            SetGadgetText(#SpinStringGadget, Str(SpinCount))
            ResizeWindow(#WinMain, #PB_Ignore, #PB_Ignore, SpinCount, #PB_Ignore)              
          
        Case #SpinStringGadget
          If EventType() = #PB_EventType_Change 
            SpinCount = Val(GetGadgetText(#SpinStringGadget))
            If Len(Str(SpinCount)) > SpinMinLen And SpinCount < SpinMin : SpinCount = SpinMin : SetGadgetText(#SpinStringGadget, Str(SpinCount)) : EndIf 
            If SpinCount > SpinMax : SpinCount = SpinMax : SetGadgetText(#SpinStringGadget, Str(SpinCount)) : EndIf              
            ResizeWindow(#WinMain, #PB_Ignore, #PB_Ignore, SpinCount, #PB_Ignore)
          EndIf
              
      EndSelect
  EndSelect
ForEver
Répondre