4/6/2008 0:06 El Bruno

[Net] ProgressBar; hacen falta 80 lineas para que sea un control completo

Buenas,

se que hablar de controles WinForms, es ser un poco prehistórico; pero lamentablemente todavía existen entornos que deben ser tratados con WinForms. Es en estos casos cuando hecho de menos el poder trabajar con alguna suite de controles que RESUELVA los problemas comunes que tienen los controles .Net. En este caso le ha tocado al control ProgressBar de Toolstrip (que implementa internamente una ProgressBar).

Si trabajas con aplicaciones windows complejas (no estoy hablando del clásico problema de la cruz roja, sino simplemente aplicaciones multihilo); es necesario implementar SIEMPRE las siguientes líneas de código para que la ProgressBar funcione correctamente. Es cierto que el código es bastante simple (80 líneas), pero por eso mismo me hubiese gustado ahorrarmelas (ojo que tal vez se me escapa algo y no lo se ...)

Datos interesantes a remarcar:

  • Línea 11: utilizo un Timer para hacer un bucle continuo de progreso al estilo cylon
  • Líneas 28 y 41: creo 2 métodos públicos Start() y Stop() para controlar el estado de la PB
  • Línea 65: dentro del tick del timer, verifico si es necesario un Invoke()

1 using System.Timers; 2 3 namespace ElBruno.Controls 4 { 5 /// <summary> 6 /// Implements a special progress bar with start and stop messages inside, 7 /// to perform a continuous loop for the progressbar 8 /// </summary> 9 public class ToolStripProgressBar : System.Windows.Forms.ToolStripProgressBar 10 { 11 internal Timer timProgres = new Timer(500); 12 delegate void delegateIncrementProgressBar(); 13 14 /// <summary> 15 /// Initializes a new instance of the <see cref="ToolStripProgressBar"/> class. 16 /// </summary> 17 public ToolStripProgressBar() 18 : base() 19 { 20 Visible = false; 21 timProgres.Elapsed += timProgres_Elapsed; 22 } 23 24 25 /// <summary> 26 /// Starts the progress bar. 27 /// </summary> 28 internal void StartProgressBar() 29 { 30 // change status of refresh button and enable progress bar 31 Visible = true; 32 33 // start refresh timer 34 timProgres.Enabled = true; 35 timProgres.Start(); 36 } 37 38 /// <summary> 39 /// Stops the progress bar. 40 /// </summary> 41 internal void StopProgressBar() 42 { 43 // stop and clear timer 44 timProgres.Enabled = false; 45 timProgres.Stop(); 46 47 // hides the progress bar 48 Visible = false; 49 } 50 51 /// <summary> 52 /// Handles the Elapsed event of the timProgres control. 53 /// </summary> 54 /// <param name="sender">The source of the event.</param> 55 /// <param name="e">The <see cref="System.Timers.ElapsedEventArgs"/> instance containing the event data.</param> 56 void timProgres_Elapsed(object sender, ElapsedEventArgs e) 57 { 58 // validate 59 if (ProgressBar == null) 60 { 61 timProgres.Enabled = false; 62 return; 63 } 64 65 if (ProgressBar.InvokeRequired) 66 { 67 ProgressBar.Invoke(new delegateIncrementProgressBar(IncrementProgressBar)); 68 } 69 else 70 IncrementProgressBar(); 71 } 72 73 /// <summary> 74 /// Increments the progress bar. 75 /// </summary> 76 private void IncrementProgressBar() 77 { 78 if (ProgressBar.Value >= ProgressBar.Maximum) 79 ProgressBar.Value = ProgressBar.Minimum; 80 ProgressBar.PerformStep(); 81 } 82 } 83 }

Saludos @ Barcelona

El Bruno

 

Share this post :
Crossposting from ElBruno.com
Archivado en:
Comparte este post:

# re: [Net] ProgressBar; hacen falta 80 lineas para que sea un control completo

Wednesday, June 04, 2008 9:19 AM by Toni Recio

"se que hablar de controles WinForms, es ser un poco prehistórico; pero lamentablemente todavía existen entornos que deben ser tratados con WinForms. "

esto... PAÑOLADA!!!!! O_o

Mira que meterse con mi querido WinForms.... ;)

# re: [Net] ProgressBar; hacen falta 80 lineas para que sea un control completo

Wednesday, June 04, 2008 9:36 AM by Luis Fraile

jajajaj la que vas a liar Bruno, yo estoy en parte contigo, perooooo, si a todos nos tienta WPF, Silverlight, las lucecitas y los colorines que nos ciegan como a los ludópatas las luces de las vegas, perooooo, ¿tenemos los desarrolladores los conocimientos suficientes para exprimir esas nuevas capacidades con interfaces de usuario realmente impactantes y usables? ...

Yo, por mi parte, no.

# re: [Net] ProgressBar; hacen falta 80 lineas para que sea un control completo

Wednesday, June 04, 2008 9:38 AM by espinete

Viva WinForms !!!

# re: [Net] ProgressBar; hacen falta 80 lineas para que sea un control completo

Wednesday, June 04, 2008 11:55 AM by El Bruno

jejeje ... que la idea era comentar la m#€rd@ que es el ProgressBar; no decir nada de WPF; pero es cierto todavia nos queda mucho WinForms por delante ... !!!

yo por ahora no me siento capacitado para hacer una app superexigente online en WPF ... me falta :S

Saludos

# re: [Net] ProgressBar; hacen falta 80 lineas para que sea un control completo

Wednesday, June 04, 2008 3:32 PM by Romny

Lo peor de todo, no es eso, es lo que se viene en cuando a novedades. geeks.ms/.../si_2D00_tienes_2D00_vrtigo_2D00_agarratela_2D00_rueda_2D00_sigue_2D00_girandoy_2D00_cada_2D00_vez_2D00_ms_2D00_rpido.aspx

tiempo no hay para aprender tanta vaina.

# re: [Net] ProgressBar; hacen falta 80 lineas para que sea un control completo

Wednesday, June 04, 2008 5:08 PM by HardBit

¿WindowsForms prehistorico? uff entonces deberiamos estar en el 2050, por que creo que WindowsForms sigue y seguira siendo usando no por algunos sino aun por la mayoria de entornos. ¿Lamentablemente? El hecho de que existan WPF no es la gran cosa, y creo que si somos estrictos seria tambien prehistorico pues al final son objetos creados en Direct3D.

ok ok me exalte pero poquito pero pss WindowsForms es la leche, WPF? un binding de Direct3D que tiene bonitos efectos.