Sdílet prostřednictvím


Postupy: Přístup všech otevřených formulářů aplikace (Visual Basic)

V tomto příkladu je použita vlastnost My.Application.OpenForms k zobrazení názvů všech otevřených formulářů aplikace.

Vlastnost My.Application.OpenForms vrátí všechny aktuálně otevřené formuláře, bez ohledu na to, které vlákno je otevřelo. To znamená, že byste měli zkontrolovat vlastnost InvokeRequired pro každý formulář před přístupem na něj, jinak může být vyvolána vyjímka InvalidOperationException.

V tomto příkladu dojde k deklarování funkce, která získá hlavičku každého formuláře vláknově bezpečným způsobem. Nejprve zkontroluje vlastnost InvokeRequired formuláře a v případě potřeby se použije metodu BeginInvoke k provedení funkce v vláknu formuláře. Funkce vrátí název formuláře.

Příklad

V tomto příkladu dojde k cyklickému průchodu všemi otevřenými formuláři aplikace a jejich názvy se zobrazí v ovládacím prvku ListBox. Pro jednoduššího kódu, který zobrazuje pouze formuláře přístupné z aktuálního vlákna, viz. 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

Viz také

Úkoly

How to: Make Thread-Safe Calls to Windows Forms Controls

Odkaz

OpenForms