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
Crossposting from
ElBruno.com
Archivado en: Visual Studio
Comparte este post: