Поделиться через


Практическое руководство. Доступ ко всем открытым формам приложения

Обновлен: Ноябрь 2007

В этом примере используется свойство My.Application.OpenForms для отображения названий всех открытых форм приложения.

Свойство My.Application.OpenForms возвращает все открытые формы, независимо от открывшего их потока. Это означает, что следует проверить свойство InvokeRequired каждой формы перед обращением к ней; в противном случае может возникнуть исключение InvalidOperationException.

В этом примере объявляется функция, которая получает заголовок каждой формы потокобезопасным способом. Сначала она проверяет свойство формы InvokeRequired и при необходимости использует метод BeginInvoke для вызова функции потока формы. Затем функция возвращает заголовок формы.

Пример

В этом примере циклически перебираются всем открытые формы приложения, и их заголовки отображаются в элементе управления ListBox. Простой код, отображающий только формы, непосредственно доступные из текущего потока, см. в разделе Свойство My.Application.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

См. также

Задачи

Практическое руководство. Осуществление потокобезопасных вызовов элементов управления Windows Forms.

Ссылки

Свойство My.Application.OpenForms