Compartir a través de


Cómo: Obtener acceso a todos los formularios abiertos de una aplicación

Actualización: noviembre 2007

En este ejemplo se utiliza la propiedad My.Application.OpenForms para mostrar los títulos de todos los formularios abiertos de la aplicación.

La propiedad My.Application.OpenForms devuelve todos los formularios abiertos actualmente, sin tener en cuenta qué subproceso los abrió. Esto significa que debería comprobar la propiedad InvokeRequired de cada formulario antes de tener acceso a él; de lo contrario, se podría producir una excepción InvalidOperationException.

En este ejemplo se declara una función que obtiene el título de cada formulario de una manera segura para subprocesos. Primero, comprueba la propiedad InvokeRequired del formulario y, si necesario, utiliza el método BeginInvoke para ejecutar la función en el subproceso del formulario. A continuación, la función devuelve el título del formulario.

Ejemplo

Este ejemplo recorre los formularios abiertos de la aplicación y muestra sus títulos en un control ListBox. Para obtener código más fácil que muestra sólo los formularios directamente accesibles desde el subproceso actual, vea My.Application.OpenForms (Propiedad).

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

Vea también

Tareas

Cómo: Realizar llamadas seguras para subprocesos en controles de formularios Windows Forms

Referencia

My.Application.OpenForms (Propiedad)