Como: Acessar todos os formulários abertos de um aplicativo (Visual Basic)

Este exemplo usa a propriedade My.Application.OpenForms para exibir todos os títulos dos formulários abertos do aplicativo.

A propriedade My.Application.OpenForms retorna todos os formulários abertos no momento, independentemente de qual thread os abriu. Isso significa que você deve verificar a propriedade InvokeRequired de cada formulário antes que seja acessado; caso contrário, ela pode acionar uma exceção InvalidOperationException.

Este exemplo declara uma função que obtém cada título de formulário de uma maneira de segmento seguro. Primeiro, ele verifica a propriedade InvokeRequired do formulário e, se necessário, usa o método BeginInvoke para executar a função no segmento do formulário. A função retornará o título do formulário.

Exemplo

Este exemplo faz um loop através dos formulários abertos do aplicativo e exibe seus títulos em um controle ListBox. Para código mais simples que exibe somente os formulários diretamente acessíveis da thread atual, consulte OpenForms.

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

Consulte também

Tarefas

Como: Fazer chamadas de Thread-Safe para controles Windows Forms

Referência

OpenForms