1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233
| ''' <summary>
''' Fenêtre de chargement permettant de faire patienter l'utilisateur.
''' La fenêtre se met toujours au dessus de toutes les autres.
''' Un thread gère le rafraichissement de cette fenêtre.
''' </summary>
''' <remarks>
''' Cette fenêtre ne doit pas être utilisée directement, mais via la classe LoadingA.
''' Il existe deux modes suivant le constructeur appelé :
''' - autonome : on ne connait pas à l'avance le nombre de pas de la barre de progression et celle-ci se remplit d'elle-même
''' - non autonome : on connait le nombre de pas de la barre de progression et il faut appeler la fonction StepIt pour la faire avancer
''' </remarks>
<System.Runtime.InteropServices.ComVisible(True)> Friend Class FrmLoadingA
Private m_close As Boolean = False
Private m_autonomous As Boolean = False
''' <summary>
''' Constructeur.
''' </summary>
''' <param name="details">Texte de détails à afficher sur la fenêtre.</param>
''' <remarks>
''' Ce constructeur indique que la fenêtre est autonome : la barre de progression se remplit d'elle-même en boucle.
''' </remarks>
Public Sub New(ByVal details As String)
' Cet appel est requis par le Concepteur Windows Form.
InitializeComponent()
' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
With Me.PrgBarProgression
.Style = ProgressBarStyle.Continuous
.Minimum = 5
.Maximum = 100
.Step = 5
End With
If String.IsNullOrEmpty(details) Then
Me.LabDetails.Text = "Traitement en cours..."
Else
Me.LabDetails.Text = details
End If
m_autonomous = True
End Sub
''' <summary>
''' Constructeur.
''' </summary>
''' <param name="steps">Nombre d'étapes prévues.</param>
''' <param name="details">Texte de détails à afficher sur la fenêtre.</param>
''' <remarks>
''' Ce constructeur indique que la fenêtre est non autonome : la barre de progression est remplie via la fonction StepIt appelée par l'utilisateur.
''' </remarks>
Public Sub New(ByVal steps As Integer, ByVal details As String)
' Cet appel est requis par le Concepteur Windows Form.
InitializeComponent()
' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
' intialiser la barre de progression
With Me.PrgBarProgression
.Style = ProgressBarStyle.Continuous
.Minimum = 0
.Maximum = steps
.Step = 1
End With
' initialiser les labels
Me.LabDetails.Text = details
' forcer la création du handle de fenêtre
' pour que les Invoke du thead puisse fonctionner...
'Dim handle As IntPtr = Me.Handle
' refuser les contrôles inter-thread pour éviter l'exception "Opération inter-threads non valide"
' (DANGEREUX)
'Control.CheckForIllegalCrossThreadCalls = False
m_autonomous = False
End Sub
''' <summary>
''' Afficher la fenêtre.
''' </summary>
''' <remarks></remarks>
Public Sub Afficher()
m_close = False
Me.ShowDialog()
End Sub
''' <summary>
''' Fermer la fenêtre.
''' </summary>
''' <remarks></remarks>
Public Sub Fermer()
m_close = True
End Sub
''' <summary>
''' Avance la progression d'un pas.
''' </summary>
''' <param name="details">Le texte de détails associé.</param>
''' <remarks></remarks>
Public Sub StepIt(ByVal details As String)
If Not m_autonomous Then
Me.LabDetails.Text = details
Me.PrgBarProgression.PerformStep()
Me.Refresh()
End If
End Sub
''' <summary>
''' Fermeture de la fenêtre -> arrêt du timer de rafraichissement.
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub FrmLoadingA_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
TimerRefresh.Stop()
End Sub
''' <summary>
''' Ouverture de la fenêtre -> la mettre au dessus de tout et démarrer le timer.
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub FrmLoadingA_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
' forcer la fenêtre en premier plan
Me.TopLevel = True
Me.TopMost = True
' démarrer le thread
TimerRefresh.Start()
End Sub
''' <summary>
''' A chaque impulsion du timer, vérifier s'il faut fermer la fenêtre
''' et comment rafraichir la barre de progression.
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks>
''' La barre de progression est remplie automatiquement en cas de fermeture.
''' </remarks>
Private Sub TimerRefresh_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles TimerRefresh.Tick
' fermeture ?
If m_close Then
Me.PrgBarProgression.Value = Me.PrgBarProgression.Maximum
Threading.Thread.Sleep(200)
Me.Close()
End If
' boucle de progression
If m_autonomous Then
If Me.PrgBarProgression.Value = (Me.PrgBarProgression.Maximum - Me.PrgBarProgression.Step) Then
Me.PrgBarProgression.Value = Me.PrgBarProgression.Minimum
End If
Me.PrgBarProgression.PerformStep()
End If
End Sub
End Class
''' <summary>
''' Classe gérant la fenêtre FrmLoadingA.
''' </summary>
''' <remarks></remarks>
<System.Runtime.InteropServices.ComVisible(False)> Public Class LoadingA
Private m_thread As System.Threading.Thread
Private m_waitForm As FrmLoadingA
''' <summary>
''' Démarrage de l'affichage de la fenêtre.
''' </summary>
''' <param name="details">Texte de détails à passer à la fenêtre.</param>
''' <remarks>
''' Mode autonome.
''' </remarks>
Public Sub Show(ByVal details As String)
m_waitForm = New FrmLoadingA(details)
If Not m_thread Is Nothing Then
m_thread.Abort()
m_thread = Nothing
End If
m_thread = New System.Threading.Thread(AddressOf m_waitForm.Afficher)
m_thread.Start()
End Sub
''' <summary>
''' Démarrage de l'affichage de la fenêtre.
''' </summary>
''' <param name="steps">Nombre de pas de la barre de progression.</param>
''' <param name="details">Texte de détails à passer à la fenêtre.</param>
''' <remarks>
''' Mode non autonome.
''' </remarks>
Public Sub Show(ByVal steps As Integer, ByVal details As String)
m_waitForm = New FrmLoadingA(steps, details)
If Not m_thread Is Nothing Then
m_thread.Abort()
m_thread = Nothing
End If
m_thread = New System.Threading.Thread(AddressOf m_waitForm.Afficher)
m_thread.Start()
End Sub
''' <summary>
''' Faire avancer la barre de progression d'un pas.
''' </summary>
''' <param name="details">Le message de détails à mettre à jour.</param>
''' <remarks>
''' Uniquement pour le mode non autonome.
''' </remarks>
Public Sub StepIt(ByVal details As String)
m_waitForm.StepIt(details)
End Sub
''' <summary>
''' Fermeture de la fenêtre.
''' </summary>
''' <remarks></remarks>
Public Sub Close()
m_waitForm.Fermer()
m_thread.Join(10000)
m_thread = Nothing
End Sub
End Class |
Partager