Page 1 sur 1

Progression SpinGadget

Publié : mar. 21/mars/2017 22:16
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

Re: Progression SpinGadget

Publié : mar. 21/mars/2017 22:30
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

Re: Progression SpinGadget

Publié : mar. 21/mars/2017 23:07
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.

Re: Progression SpinGadget

Publié : mar. 21/mars/2017 23:22
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

Re: Progression SpinGadget

Publié : mar. 21/mars/2017 23:28
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

Re: Progression SpinGadget

Publié : mar. 21/mars/2017 23:54
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 :)

Re: Progression SpinGadget

Publié : mer. 22/mars/2017 10:55
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+

Re: Progression SpinGadget

Publié : mer. 22/mars/2017 12:22
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))

Re: Progression SpinGadget

Publié : mer. 22/mars/2017 12:36
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+

Re: Progression SpinGadget

Publié : mer. 22/mars/2017 12:48
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.

Re: Progression SpinGadget

Publié : mer. 22/mars/2017 12:56
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.

Re: Progression SpinGadget

Publié : mer. 22/mars/2017 14:19
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.

Re: Progression SpinGadget

Publié : mer. 22/mars/2017 14:34
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

Re: Progression SpinGadget

Publié : mer. 22/mars/2017 16:43
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