Comment : accéder à tous les formulaires ouverts d'une application
Mise à jour : novembre 2007
Cet exemple utilise la propriété My.Application.OpenForms pour afficher les titres de tous les formulaires ouverts de l'application.
La propriété My.Application.OpenForms retourne tous les formulaires actuellement ouverts quel que soit le thread qui les a ouverts. Cela signifie que vous devez vérifier la propriété InvokeRequired de chaque formulaire avant d'y accéder ; sinon, elle peut lever une exception InvalidOperationException.
Cet exemple déclare une fonction qui obtient le titre de chaque formulaire en mode thread-safe. En premier lieu, il vérifie la propriété InvokeRequired du formulaire et, si nécessaire, utilise la méthode BeginInvoke pour exécuter la fonction sur le thread du formulaire. Ensuite, la fonction retourne le titre du formulaire.
Exemple
Cet exemple effectue une boucle sur les formulaires ouverts de l'application et affiche leurs titres dans un contrôle ListBox. Pour un code plus simple qui n'affiche que les formulaires directement accessibles à partir du thread actuel, consultez My.Application.OpenForms, propriété.
Private Sub GetOpenFormTitles()
Dim formTitles As New Collection
Try
For Each f As Form In My.Application.OpenForms
' Use a thread-safe method to get all form titles.
formTitles.Add(GetFormTitle(f))
Next
Catch ex As Exception
formTitles.Add("Error: " & ex.Message)
End Try
Form1.ListBox1.DataSource = formTitles
End Sub
Private Delegate Function GetFormTitleDelegate(ByVal f As Form) As String
Private Function GetFormTitle(ByVal f As Form) As String
' Check if the form can be accessed from the current thread.
If Not f.InvokeRequired Then
' Access the form directly.
Return f.Text
Else
' Marshal to the thread that owns the form.
Dim del As GetFormTitleDelegate = AddressOf GetFormTitle
Dim param As Object() = {f}
Dim result As System.IAsyncResult = f.BeginInvoke(del, param)
' Give the form's thread a chance process function.
System.Threading.Thread.Sleep(10)
' Check the result.
If result.IsCompleted Then
' Get the function's return value.
Return "Different thread: " & f.EndInvoke(result).ToString
Else
Return "Unresponsive thread"
End If
End If
End Function
Voir aussi
Tâches
Comment : faire des appels thread-safe aux contrôles Windows Forms