Page 1 sur 1

Progressbar fait maison

Publié : ven. 03/août/2018 13:10
par Ekim
Bonjours à tous,

Voici mon souci du jour, je m'entête à "réinventer la roue" si je puis dire :wink:
j'éssais de recréer une barre de progression via canvasgadget
hors mon principale problème réside au niveau du rafraichissement, du je pense)))
voici mon code, et si quelqu'un peut m'expliquer comment faire, j'en serais vraiment ravis)

Code : Tout sélectionner


If OpenWindow(0, 0, 0, 420, 100, "Exemple Minuteur", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	ProgressBar_0 = CanvasGadget(#PB_Any, 10, 50, 400, 20, #PB_Canvas_Border)
	
	AddWindowTimer(0, 1, 100)
	
	Repeat
		Event = WaitWindowEvent()
		
		If Event = #PB_Event_Timer And EventTimer() = 1
			If StartDrawing(CanvasOutput(ProgressBar_0))
				For i=1 To 400 Step 15
					Box(i,1,13,14, RGB(0,128,255))
					Delay(500)
				Next i

				StopDrawing()
			EndIf    
		EndIf
	Until Event = #PB_Event_CloseWindow
EndIf


Re: Progressbar fait maison

Publié : ven. 03/août/2018 13:17
par poshu
Bon, question bête : tu veux que je corrige ton code, ou tu veux que je pointe le soucis et que je te laisse chercher?

Re: Progressbar fait maison

Publié : ven. 03/août/2018 13:34
par boby
Si je peux me permettre https://www.purebasic.fr/french/viewtop ... =6&t=17243
Mais prend quand même le temps de corriger ton erreur... C'est vraiment pas grand chose (tips : 400/15)

Re: Progressbar fait maison

Publié : ven. 03/août/2018 13:37
par poshu
boby a écrit :Mais prend quand même le temps de corriger ton erreur... C'est vraiment pas grand chose (tips : 400/15)
Toi, t'as pas lu le code :p

Re: Progressbar fait maison

Publié : ven. 03/août/2018 13:43
par boby
WAHHHHHHHHHHHHHHHHHHHHHHHHHHHHH mais quel aveugle.....
Ne tiens effectivement pas compte de mon tips qui n'en est pas un en vrai... XD

Re: Progressbar fait maison

Publié : ven. 03/août/2018 14:36
par zaphod_b
salut,

la boucle for est inutile et le delay aussi.
le timer revient tous les 100 ms.
et il faut gérer la fin : removewindowtimer

Code : Tout sélectionner

If OpenWindow(0, 0, 0, 420, 100, "Exemple Minuteur", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
   ProgressBar_0 = CanvasGadget(#PB_Any, 10, 50, 400, 20, #PB_Canvas_Border)
   
   AddWindowTimer(0, 1, 100)
   
   Repeat
      Event = WaitWindowEvent()
      
      If Event = #PB_Event_Timer And EventTimer() = 1
         If StartDrawing(CanvasOutput(ProgressBar_0))
           ; For i=1 To 400 Step 15
           Box(i,1,13,14, RGB(0,128,255))
           i+15
           ;    Delay(100)
           ; Next i
            If i>400
              i=0
              Box(i,1,400,14, RGB(255,255,255))
              ; ou RemoveWindowTimer(0,1)
           EndIf
           StopDrawing()
           
           
         EndIf   
      EndIf
   Until Event = #PB_Event_CloseWindow
EndIf

j'espère que ca va aider....

Re: Progressbar fait maison

Publié : sam. 04/août/2018 1:17
par Ekim
Merci @Zaphod_b pour ton code) et les autres bien sûr)

effectivement sa tenait à peu,
mon "i for step x next i" était là pour les interventions avenir sur la valeur min et max

@poshu) pointer le problème c'est bien mais le code n'est pas mauvais non plus et équivaux à une explication concrète si il est bien commenté)

vos interventions m'ont permis de comprendre et d'avancer dans mon délire)))

encore merci)

Re: Progressbar fait maison

Publié : mar. 06/oct./2020 23:52
par Ekim
Bonsoirs à tous

Je me permet de revenir sur la question avec cette fois-ci un delta problème))
j'aimerais que la barre ne dépende plus d'un timer mais plutôt en fonction de la quantité de fichier à charger

mon bout de code n'est pas si mal mais présente quelque bug visuel dès l'instant où je monte la valeur Total > 27, les distance entre les buchettes ne sont plus
respectés et n'en parlons même pas si l'on monte à 100

Mon objectif étant bien sûr de conserver mes belles petites buchettes régulières quelque soit le Total attribué

Essayez sinon ce n'est pas si grave :wink:
en même temps c'est un défi comme un autre, moi, je bute dessus en tout cas :oops:

Code : Tout sélectionner

accre.l = 1 
Total.l = 27
Ping.l = 64

#Buchette=15
#Barmax=405
#Buchmax=27

If OpenWindow(1, x, y, 500, 120, "Download", #PB_Window_MinimizeGadget|#PB_Window_BorderLess|#PB_Window_ScreenCentered)
	String_0 = StringGadget(#PB_Any, 20, 50, 390, 20, "")
	Button_Add = ButtonGadget(#PB_Any, 420, 50, 40, 20, "Go")
	Button_Clear = ButtonGadget(#PB_Any, 460, 10, 40, 20, "End")
	
	Text_0 = TextGadget(#PB_Any, 20, 10, 390, 30, "Windows 3.1")
	Text_Ref = TextGadget(#PB_Any, 420, 80, 20, 20, "000")
	Text_Slash = TextGadget(#PB_Any, 440, 80, 10, 20, "/")
	Text_Total = TextGadget(#PB_Any, 450, 80, 20, 20, "000")
	
	ProgressBar_0 = CanvasGadget(#PB_Any, 10, 80, 405, 20)
	
; 	AddWindowTimer(1,1,200)
	
	
	SetGadgetText(Text_Total, RSet(Str(Total),3,"0"))
	
	Repeat
		Event = WaitWindowEvent()
		WindowID = EventWindow()
		GadgetID = EventGadget()
		EventType = EventType()
		
		Select Event
				
			Case #PB_Event_Timer
; 				If EventTimer() = 1
; 					
; 					
; 					
; 				EndIf
				
			Case #PB_Event_Gadget
				
				Select GadgetID
						
					Case Button_Add
						
						vref.f = #Barmax/Total
						
						vref2 = Int(Round(vref,#PB_Round_Up))
						
						nbBuchette.f = vref/#Buchette
						
						For Fichier = 1 To Total+1
							For h=suite To vref2 * Fichier Step #Buchette
								If h=203
									h=210
								EndIf
							
								If StartDrawing(CanvasOutput(ProgressBar_0))
									
									Box(h,0,13,20,$FF0000)
									
									Delay(Ping/2)
									
									StopDrawing()
								EndIf
								
								Debug h
							Next h
							
							If h > 405
								h=405
							EndIf
							
							suite = (vref2 * Fichier);+15
							
							accre = accre+1
							
							If accre > Total
								accre = Total
								
								Break
							EndIf
							
							SetGadgetText(Text_Ref, "000")
							SetGadgetText(Text_Ref, RSet(Str(accre),3,"0"))
							
							Delay(Ping)
						Next Fichier
						
						Debug "Fin de chargement"
						
						
						
					Case Button_Clear
						
						Break
						
				EndSelect
		EndSelect
	ForEver
	
	End
Else
	Debug "Erreur de chargement"
EndIf

Re: Progressbar fait maison

Publié : mar. 13/oct./2020 9:37
par Shadow
Salut,

Tu bloque ton exécution de ton programme avec un DeLay, pas bon ça ;)
Utilise un WindowTimer à la place !

Tous les X temps tu ajoute un bloque, comme ça tu ne bloque pas ton programme :)

Re: Progressbar fait maison

Publié : mer. 14/oct./2020 20:48
par Ar-S
Salut Ekim.
Je pense qu'il faut que tu te fixes un nbr de bûchettes et que tu t'y tiennes. C'est la progression de l'apparition de ces bûchettes qui sera déterminée par le nombre de fichiers.
ça sous entend qu'il faut compter le nbr de fichier en amont. (il y a pas mal d'exemples sur le forum => lister fichier, compter fichier)

Re: Progressbar fait maison

Publié : ven. 16/oct./2020 22:30
par Ekim
Bonsoir @Shadow, le Delay() me servait juste de simulateur ping réseau)

sinon pour te répondre, tu as absolument raison, et j'ai moi même finit par comprendre que l'aide d'un Timer est in fine inévitable pour ce type de projet
sauf qu'à mon grand désespoir, je viens de me rendre compte que EventTimer() et initNetwork ne font pas bon ménage :cry: :cry: :cry:

et je ne sais d’ailleurs pas pourquoi, donc si quelqu'un à une réponse à ce problème You welcome :D

@A-rs, oui se que tu expliques c'est qu'en définitive le calcul doit être fonction du nb total de buchettes c'est bien ça?