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