Aprire form figlio

di il
9 risposte

Aprire form figlio

Sto imparando a usare Vs Express 2013 per Windows Desktop, ma ho incontrato un problema, perciò chiedo il Vostro aiuto.
Premetto che ho creato un form principale (frmMain) con la proprietà "IsMdiContainer = true" e un form secondario (frmPiano).
Su frmMain ho inserito un tasto (BtPiano) per aprire frmPiano, nonché il seguente codice in "Public Class frmMain":

Private Sub BtPiano_Click(sender As Object, e As EventArgs) Handles BtPiano.Click
frmPiano.MdiParent = Me
frmPiano.Show()
...
End Sub


Purtroppo, però, cliccando su BtPiano, frmPiano non appare e il programma continua con l'istruzione successiva a "frmPiano.Show()".
Come fare per:
1. aprire frmPiano come form modale
2. eseguire le istruzioni contenute nel form
3. chiudere il form.
Grazie

9 Risposte

  • Re: Aprire form figlio

    Non ho capito bene, puoi mostrare tutto il codice ?
  • Re: Aprire form figlio

    Un form mdichild non può essere modale per definizione
  • Re: Aprire form figlio

    La finestra può essere aperta come "modale" usando il metodo ShowDialog().

    E' ovvio che, per sua natura, come è stato già detto, se si tratta di una finestra modale, non può comportarsi come MDI Child e viceversa.

    In generale, io eviterei comunque l'approccio MDI per qualsiasi applicazione moderna: è deprecato e inutilizzato da tempo, ed esistono alternative ben migliori (ad esempio, un uso efficace degli User Control) per sviluppare interfacce con le stesse potenzialità e ben più accattivanti e funzionali.

    Ciao!
  • Re: Aprire form figlio

    oregon ha scritto:


    Un form mdichild non può essere modale per definizione
    Scusate il ritardo, ma sono stato fuori per qualche giorno.
    La mia esigenza è aprire un form secondario cliccando un tasto sul form principale. Il form principale dovrà rimanere disattivo, fino a quando non sarà chiuso il form secondario (questo intendevo per modale ma, evidentemente, mi sbagliavo).
    Quali sono le istruzioni e/o i settaggi?
  • Re: Aprire form figlio

    Non capisco quale difficoltà ci sia usando form normalissimi
    Public Class Form1
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            Form2.ShowDialog()
        End Sub
    End Class
    
    Public Class Form2
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Me.Hide()
            Form1.Show()
        End Sub
    End Class
  • Re: Aprire form figlio

    Il codice corretto è questo di seguito.

    Se si usa il modale non è necessario un Form1.Show(), ed inoltre per chiudere e distruggere il Form2 serve un Dispose()
    Public Class Form1
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            Form2.ShowDialog(Me)
        End Sub
    End Class
    
    Public Class Form2
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Me.Dispose()
        End Sub
    End Class
    Inoltre su frmMain non devi mettere la proprietà "IsMdiContainer = true"
    e devi togliere frmPiano.MdiParent = Me
  • Re: Aprire form figlio

    Grazie Sirjo, il problema dipendeva dall'aver settato la proprietà IsMdiContainer = true del form principale.
    Come hai suggerito tu, ho settato la proprietà IsMdiContainer = false ed eliminato l'istruzione frmPiano.MdiParent = Me, e tutto funziona.
  • Re: Aprire form figlio

    MiCo ... ovviamente non si parla più di mdichild... ecco perché 'adesso funziona'. Ma se cambi i requisiti della tua richiesta è ovvio. Come ti dicevo prima non deve essere mdichild...
  • Re: Aprire form figlio

    oregon ha scritto:


    MiCo ... ovviamente non si parla più di mdichild... ecco perché 'adesso funziona'. Ma se cambi i requisiti della tua richiesta è ovvio. Come ti dicevo prima non deve essere mdichild...
    Hai ragione, ma ritenevo, da inesperto che sono, che per aprire un form secondario bisognasse dichiarare il form padre e il form figlio, sui quali mi riservo un dovuto approfondimento, siccome ancora non ne ho inteso il funzionamento.
    Grazie per la precisazione.
Devi accedere o registrarti per scrivere nel forum
9 risposte