Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di alpynet
    Registrato dal
    Mar 2010
    Messaggi
    123

    [VB.NET] Classe per gestire apertura/chiusura forms

    Ciao a tutti, sto cercando di creare una classe per gestire l'apertura e la chiusura delle varie maschere (form). L'obiettivo è quello di aprire i vari forms e se il form richiamato risulta aperto, portarlo in primo piano. Per fare questo ho iniziato con un approccio di questo genere:
    codice:
    Public Class clsForm
        Private Shared WithEvents _f2 As Form2
        Private Shared WithEvents _f3 As Form3
    
        Public Enum eForm
            eForm2
            eForm3
        End Enum
    
        Public Sub ApriForm(ByVal tipo As eForm, ByVal frmCaller As Form)
            Select Case tipo
                Case eForm.eForm2
                    If _f2 Is Nothing Then
                        _f2 = New Form2(frmCaller)
                        _f2.Show()
                    Else
                        _f2.Select()
                    End If
                Case eForm.eForm3
                    If _f3 Is Nothing Then
                        _f3 = New Form3(frmCaller)
                        _f3.Show()
                    Else
                        _f3.Select()
                    End If
            End Select
        End Sub
    
        Public Function ChiudiForms() As Boolean
            Dim retVal As Boolean = True
            If Not _f2 Is Nothing Then
                If MessageBox.Show(String.Format("Il form {0} è aperto." & Environment.NewLine & "Vuoi chiuderlo?", _f2.Name), "Chiusura applicazione", MessageBoxButtons.YesNo) = DialogResult.Yes Then
                    _f2.Dispose()
                    _f2 = Nothing
                Else
                    _f2.Select()
                    retVal = False
                End If
            End If
            If retVal Then
                If Not _f3 Is Nothing Then
                    If MessageBox.Show(String.Format("Il form {0} è aperto." & Environment.NewLine & "Vuoi chiuderlo?", _f3.Name), "Chiusura applicazione", MessageBoxButtons.YesNo) = DialogResult.Yes Then
                        _f3.Dispose()
                        _f3 = Nothing
                    Else
                        _f3.Select()
                        retVal = False
                    End If
                End If
            End If
    
            Return retVal
        End Function
    
        Private Shared Sub _f2_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles _f2.FormClosed
            _f2.Dispose()
            _f2 = Nothing
        End Sub
    
        Private Shared Sub _f3_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles _f3.FormClosed
            _f3.Dispose()
            _f3 = Nothing
        End Sub
    End Class
    Anche se il tutto funziona bene, non sono sicuro sia la strada giusta...soprattutto per il fatto che devo dichiarare tante variabili quanti sono i forms.
    Consigli/opinioni in merito?
    Grazie

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Il codice non è nemmeno commentato, né esponi un problema o un dubbio particolare, quindi è ben difficile suggerire migliorie a qualcosa che deve essere interpretato senza conoscere nello specifico come funziona (o come deve funzionare) e che problemi può avere.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it L'avatar di alpynet
    Registrato dal
    Mar 2010
    Messaggi
    123
    Effettivamente mi rendo conto solo ora che messo giù cosi non possa essere di immediata comprensione.
    Nell'esempio di classe che ho postato, tralasciando i vari fronzoli, lo scenario del progetto di prova è un form principale (form1) e altri due form (form2 e form3).
    Dal form1, tramite la classe richiamo, all'occorrenza, form2 e/o form3.
    Per aprire il form viene chiamata la sub ApriForm passandogli l'enumerazione del form da aprire e il form chiamante.
    Alla chiusura dell'applicazione (form1), viene chiamata la funzione ChiudiForms la quale controlla se ci sono form aperti ed eventualmente chiede se chiuderli e uscire dall'applicazione oppure no.

    codice:
    dim f as new clsForm
    ......
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       'apre il form2     
       f.ApriForm(clsForm.eForm.eForm2, Me)
    End Sub
    
    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
       'prima di chiudere controlla che non ci siano form aperti..
       If Not f.ChiudiForms Then
          e.Cancel = True
       End If
    End Sub
    Il mio dubbio è in questo tipo di approccio.
    La classe ha tanti oggetti form per quante sono le form nel progetto, pertanto ogni volta che aggiungo un form, mi devo ricordare di fare le opportune aggiunte alla classe.
    Per questo motivo mi chiedevo, senza stare li a creare tante variabili quanti sono i form da richiamare, non c'è un metodo che mi permetta di risalire a tutti i form del progetto per aprirli, chiuderli e controllare il loro stato?
    Grazie.

  4. #4
    Utente di HTML.it L'avatar di Vinsent
    Registrato dal
    May 2011
    Messaggi
    314
    Ciao, non so se può servirti ma per ottenere le form aperte puoi provare così:
    codice:
     Private Sub Button2_Click() Handles Button2.Click
            Dim a As String = ""
            Dim b As String = ""
            For c = 0 To My.Application.OpenForms.Count - 1 Step 1
                a = My.Application.OpenForms(c).Name
                b = b & vbCrLf & a
            Next
            MsgBox(b)
        End Sub
    Dovresti inserire i nomi delle form in un array e richiamare il codice ogni volta che ne apri una o la chiudi in modo da aggiornare l' array. Poi, in base a degli eventi, cicli l' array per decidere cosa fare.
    Per ottenere tutte le form di un programma come chiedi non so...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.