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