Progressbar fait maison

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Ekim
Messages : 215
Inscription : dim. 24/juin/2018 1:20

Progressbar fait maison

Message 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

poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Re: Progressbar fait maison

Message 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?
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: Progressbar fait maison

Message 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)
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Re: Progressbar fait maison

Message 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
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: Progressbar fait maison

Message par boby »

WAHHHHHHHHHHHHHHHHHHHHHHHHHHHHH mais quel aveugle.....
Ne tiens effectivement pas compte de mon tips qui n'en est pas un en vrai... XD
zaphod_b
Messages : 76
Inscription : mar. 09/déc./2014 20:02

Re: Progressbar fait maison

Message 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....
Ekim
Messages : 215
Inscription : dim. 24/juin/2018 1:20

Re: Progressbar fait maison

Message 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)
Ekim
Messages : 215
Inscription : dim. 24/juin/2018 1:20

Re: Progressbar fait maison

Message 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
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: Progressbar fait maison

Message 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 :)
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.
Avatar de l’utilisateur
Ar-S
Messages : 9478
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Progressbar fait maison

Message 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)
~~~~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
Ekim
Messages : 215
Inscription : dim. 24/juin/2018 1:20

Re: Progressbar fait maison

Message 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?
Répondre