Partager via


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

Référence

My.Application.OpenForms, propriété