Determinare se una form è aperta

A volte capita che torni comodo sapere se una determinata form (figlia della principale) è già stata aperta così da portarla semplicemente in primo piano anzichè crearne un’altra istanza.
Esistono un paio di tecniche: la prima più elegante, almeno secondo me, che fa ricorso a LINQ, mentre la seconda si basa su un semplice loop. Premetto subito che NON ho fatto dei test comparativi, anche perché normalmente un’applicazione è costituita da un numero abbastanza limitato di form che non consente di apprezzare differenze di prestazioni.
In entrambi p casi il codice che propongo è un pochino più prolisso del necessario: ho preferito infatti privilegiare la chiarezza alla compattezza.

Ricerca della form tramite LINQ

    ''' <summary>
    ''' Determina se una form è già aperta
    ''' </summary>
    ''' <remarks></remarks>
    ''' <param name="formType">Il tipo della form da ricercare</param>
    ''' <remarks>Determina se la form passata come argomento è già aperta.
    ''' Esempio di uso: IsOpen(GetType(frmInfo))</remarks>
Private Function IsOpen(formType As Type) As Boolean
    Dim result = From form In Application.OpenForms
                 Where form.GetType() = formType
                 Select Name

    If result.Count > 0 Then
        Return True
    Else
        Return False
    End If
End Function

L’uso è molto semplice ed è descritto brevemente nel commento di documentazione; aggiungo solo che in questo esempio frmInfo è il nome di una normalissima form che mostra le info dell’applicazione.

Ricerca della form tramite loop

    ''' <summary>
    ''' Determina se una form è già aperta
    ''' </summary>
    ''' <remarks></remarks>
    ''' <param name="formType">Il tipo della form da ricercare</param>
    ''' <remarks>Determina se la form passata come argomento è già aperta.
    ''' Esempio di uso: IsOpen(GetType(frmInfo))</remarks>
Private Function IsOpen(formType As Type) As Boolean
    Dim result As Boolean = False

    For Each frm As Form In Application.OpenForms
        If frm.GetType().Name = formType.Name Then
            result = True
            Exit For
        End If
    Next

    Return result
End Function

Come si può vedere, è molto simile alla precedente.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

*