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