Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Aprire Form 1 sola volta

    Ho un form contenitore con toolbar che funge da Menu, poi delle form figlie che devono essere aperte solo una volta (cioè non devono essere duplicate).
    Come posso gestire il menu del Form contenitore in modo tale che quando una form
    viene aperta si disabilita il relativo comando di menu, e quando la form viene chiusa si riabilita il rispettivo comando di menu.
    La difficoltà sta nell'interagire con la toolbar del Form padre.

  2. #2
    Utente di HTML.it L'avatar di tony83
    Registrato dal
    Feb 2005
    Messaggi
    3,179

    Re: Aprire Form 1 sola volta

    Originariamente inviato da gfantuzzi
    Ho un form contenitore con toolbar che funge da Menu, poi delle form figlie che devono essere aperte solo una volta (cioè non devono essere duplicate).
    Come posso gestire il menu del Form contenitore in modo tale che quando una form
    viene aperta si disabilita il relativo comando di menu, e quando la form viene chiusa si riabilita il rispettivo comando di menu.
    La difficoltà sta nell'interagire con la toolbar del Form padre.
    Se tu vuoi disabilitare il menu ovviamente credo si possa fare in diversi modi io per esempio
    ho fatto cosi (form di nome pippo per esempio):

    ho messo in un modulo una classe per gestire il form, dove sarà presente la toolbar:
    codice:
    Public Class formPippo
        Private Shared m_CustomerForm As frmPippo
        Public Shared Property CustomerForm() As formPippo
            Get
                Return m_CustomerForm
            End Get
            Set(ByVal Value As formPippo)
                m_CustomerForm = Value
            End Set
        End Property
    e nel form dove ti interessa disabilitare fai:
    codice:
            If Not formPippo.CustomerForm Is Nothing Then
                formPippo.CustomerForm.nomeToolbar.enabled = false ' nomeToolbar intendo il tuo controllo che vuoi disabilitare per esempio 
            End If
    Puoi accedere ovviamente ai membri public, questo è un'esempio poi aspetta a te sistemarlo e implementarlo..

    Almeno io ho fatto cosi, crei la classe e la usi
    Tony

  3. #3
    le soluzioni semplici sono sempre le migliori.
    Grazie, ho capito.

  4. #4
    Utente di HTML.it L'avatar di tony83
    Registrato dal
    Feb 2005
    Messaggi
    3,179
    Originariamente inviato da gfantuzzi
    le soluzioni semplici sono sempre le migliori.
    Grazie, ho capito.
    Ok, cmq gestire il form anche è molto semplice, ci stanno tanti metodi....

    Ma puoi usare la stessa tecnica cioè

    codice:
            If FormPippo.CustomerForm Is Nothing Then
                Dim frmPippoChild As New frmPippo()
                frmPippo.MdiParent = Me
    
    ' inserisco in un mio contenitore
                Contenitore.Controls.Add(frmPippoChild)
                
                frmPippoChild.Show()
                FormPippo.CustomerForm = frmAllegatiChild
    
    '  anche qui setto
                FormPippo.CustomerForm.lstContratti.Enabled = True
    
                 Else
    
    ' inserisco in un mio contenitore
                Contenitore.Controls.Add(FormPippo.CustomerForm)
    
                FormPippo.CustomerForm.Show()
    
      '  anche qui setto
                FormPippo.CustomerForm.lstContratti.Enabled = True
                FormPippo.CustomerForm.TabAllegato.SelectedIndex = 1
            End If
    Niente figurati, ciao
    Tony

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,480
    In questo caso, l'uso di membri Shared non è necessario.

    Basta aggiungere un campo/variabile nella classe del form contenitore (chiamiamolo MainForm) e fare in modo che tale variabile venga inizializzata con il riferimento all'oggetto relativo al form secondario che vai ad aprire facendo clic sul menu; quando il form viene aperto, la voce di menu viene disabilitata; dal form secondario, poi, in fase di chiusura, si provvede a rimuovere il riferimento sul form principale e a riabilitare all'occorrenza la voce di menu.

    Un esempio di implementazione delle classi MainForm (per il form principale) e ChildForm (per il form figlio).

    MainForm

    codice:
    Public Class MainForm
    
        ' Contiene un riferimento al form figlio 
        Public ChildFormRef As ChildForm
    
        Private Sub ChildFormMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ChildFormMenuItem.Click
    
            ' Verifica se il riferimento al form figlio è impostato
            If (ChildFormRef Is Nothing) Then
    
                ' Crea un'istanza della classe corrispondente al form figlio
                ChildFormRef = New ChildForm()
    
                ' Il form principale copia il proprio riferimento al form figlio
                ChildFormRef.MainFormRef = Me
    
            End If
    
            ' Visualizza il form figlio
            ChildFormRef.Show()
    
            ' Disabilita la voce di menu
            ChildFormMenuItem.Enabled = False
    
        End Sub
    
    End Class

    ChildForm

    codice:
    Public Class ChildForm
    
        ' Contiene un riferimento al form principale
        Public MainFormRef As MainForm
    
        Private Sub ChildForm_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
    
            ' Verifica se il riferimento al form principale è assegnato
            If Not (Me.MainFormRef Is Nothing) Then
    
                ' Rimuove il riferimento al presente form
                MainFormRef.ChildFormRef = Nothing
    
                ' Abilita nuovamente la voce di menu
                MainFormRef.ChildFormMenuItem.Enabled = True
    
            End If
    
        End Sub
    
    End Class

    Eviterei l'uso di membri statici (metodi e variabili) qualora non siano strettamente necessari, come avviene nel caso in esame, per non pregiudicare la manutenibilità del codice e la sua espandibilità verso la gestione di casi più complessi (es. più istanze dello stesso form e altro ancora).

    L'esempio sopra è ovviamente semplificato ed è fortemente migliorabile: si potrebbero aggiungere proprietà in modo da regolare automaticamente l'abilitazione/disabilitazione del menu in base al riferimento impostato per il form figlio e così via.

    La gestione dello stato delle voci di menu "a-la-VB" non mi è mai piaciuta: preferisco nettamente l'implementazione Delphi e l'uso di azioni, cioè la separazione concettuale di ciò che rappresenta il comando vero e proprio, cioè l'operazione da eseguire, da quello che invece è il controllo che può invocarlo (un pulsante, una voce di menu, ecc.).

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

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.