Menu a tendina su maschera

di il
18 risposte

Menu a tendina su maschera

Salve ho creato un menu a tendina per cui  ad ogni  interruttore si apre un  sottomenu. Tutto funziona bene se nella proprietà dell'interruttore abilito l'opzione "click del mouse".

Ma io vorrei  che al passaggio del mouse  si abilitasse  il sottomenu. Ho provato con l'opzione  "Su mouse spostato" ma si incasina tutto.

Come potrei risolverlo ?

Grazie a voi.

18 Risposte

  • Re: Menu a tendina su maschera

    Sembra che non esiste l'evento "passaggio del mouse". Devi accontentarti di qualche altro evento...non so penserei a "Su attivato".

  • Re: Menu a tendina su maschera

    20/01/2025 - luigice ha scritto:

    Come potrei risolverlo ?

    Ciao, con quale controllo hai realizzato il menù a tendina ?

  • Re: Menu a tendina su maschera

    Cos'è il "menù a tendina"....?

  • Re: Menu a tendina su maschera

    21/01/2025 - @Alex ha scritto:

    Cos'è il "menù a tendina"....?

    Ma come mai siamo sempre in sintonia? ;-)))) 

    Ciaoooo carissimo Alex e buon anno, come va ? ti vedo sempre splendidamente sul pezzo!

  • Re: Menu a tendina su maschera

    21/01/2025 - By65Franco ha scritto:

    21/01/2025 - @Alex ha scritto:

    Cos'è il "menù a tendina"....?

    Ma come mai siamo sempre in sintonia? ;-)))) 

    Ciaoooo carissimo Alex e buon anno, come va ? ti vedo sempre splendidamente sul pezzo!

    Franco ciao, buon anno anche a te, è molto che non ti sento, ma vedo con piacere che siamo in forma... ;-)

    Un caro saluto 

  • Re: Menu a tendina su maschera

    20/01/2025 - By65Franco ha scritto:

    20/01/2025 - luigice ha scritto:

    Come potrei risolverlo ?

    Ciao, con quale controllo hai realizzato il menù a tendina ?

    Ho usato degli interruttori  e su proprietà ho scelto "Su mouse spostato". In realtà funziona ma è un pò ballerino perchè  quando passo il cursore del  mouse esce si  il sottomenu  in verticale, ma siccome gli ho detto che deve spegnere il sottomenu quando  è visibile e viceversa ,allora balla un pò. Penso che dovrei rassegnarmi  ad usare la proprietà "Click del mouse".

  • Re: Menu a tendina su maschera

    21/01/2025 - luigice ha scritto:

    Ho usato degli interruttori  e su proprietà ho scelto "Su mouse spostato". In realtà funziona ma è un pò ballerino perchè  quando passo il cursore del  mouse esce si  il sottomenu  in verticale, ma siccome gli ho detto che deve spegnere il sottomenu quando  è visibile e viceversa ,allora balla un pò. Penso che dovrei rassegnarmi  ad usare la proprietà "Click del mouse".

    Ciao... e il "sottomenù in verticale" con quale controllo lo realizzi ?

  • Re: Menu a tendina su maschera

    21/01/2025 - By65Franco ha scritto:

    21/01/2025 - luigice ha scritto:

    Ho usato degli interruttori  e su proprietà ho scelto "Su mouse spostato". In realtà funziona ma è un pò ballerino perchè  quando passo il cursore del  mouse esce si  il sottomenu  in verticale, ma siccome gli ho detto che deve spegnere il sottomenu quando  è visibile e viceversa ,allora balla un pò. Penso che dovrei rassegnarmi  ad usare la proprietà "Click del mouse".

    Ciao... e il "sottomenù in verticale" con quale controllo lo realizzi ?

    Il passaggio del mouse su un interruttore abilita una routine evento dove faccio apparire gli interruttori verticali che normalmente sono non visibili, e cosi via per gli altri.

  • Re: Menu a tendina su maschera

    20/01/2025 - By65Franco ha scritto:

    20/01/2025 - luigice ha scritto:

    Come potrei risolverlo ?

    Ciao, con quale controllo hai realizzato il menù a tendina ?

    Dall'attivazione di un interruttore si va ad una routine evento che abilita il menu in discesa  degli altri interruttori che non erano visibili. 

    Ossia con     =  Forms![maschera iniziale]!Interruttore29.Visible = True

  • Re: Menu a tendina su maschera

    21/01/2025 - luigice ha scritto:

    Dall'attivazione di un interruttore si va ad una routine evento che abilita il menu in discesa  degli altri interruttori che non erano visibili. 

    Ossia con     =  Forms![maschera iniziale]!Interruttore29.Visible = True

    Ciao, quindi usi dei gruppi dove porre i vari Interruttori, oppure con quale altra tecnica ?

  • Re: Menu a tendina su maschera

    21/01/2025 - luigice ha scritto:

    Ho usato degli interruttori  e su proprietà ho scelto "Su mouse spostato". In realtà funziona ma è un pò ballerino perchè  quando passo il cursore del  mouse esce si  il sottomenu  in verticale, ma siccome gli ho detto che deve spegnere il sottomenu quando  è visibile e viceversa ,allora balla un pò. Penso che dovrei rassegnarmi  ad usare la proprietà "Click del mouse".

    Quello che accade è ovvio, l'evento MouseMove ad ogni X/Y diverso dal precedente, quindi basta 1 pixel si scatena, e questo genera l'effetto Flickering... per evitarlo serve memorizzare che si è già applicata la variazione e skippare al secondo evento...

    Usa una variabile a livello di Form e memorizzi, poi devi ragionare quando resettare quella variabile...

  • Re: Menu a tendina su maschera

    21/01/2025 - luigice ha scritto:

    Dall'attivazione di un interruttore si va ad una routine evento che abilita il menu in discesa  degli altri interruttori che non erano visibili. 

    Ossia con     =  Forms![maschera iniziale]!Interruttore29.Visible = True

    Ciao, in effetti hai un effetto Flickering per quanto spiegato da @Alex.

    Una domanda se posso...  perchè hai usato tutti questi "Interruttori" ?  quale layout vuoi realizzare ?  (solo per curiosità)

    Cmq per darti un esempio io farei una cosa di questo tipo...per esempio utilizzando tre Interruttori inseriti in un gruppo e associando ad ogni interruttore una ListBox (casella di riepilogo) che si aprono al passaggio del mouse sotto ad ogni Interruttore.... sarebbe un poco più semplice e riflette un pò anche gli standard...
    Solo per darti un idea, ma esistono tanti altri metodi:

    e le quattro righe di codice saranno per esempio:

    Option Compare Database
    Option Explicit
    
    ' set variables global
    Private CurrentListBox As ListBox
    
    ' FORM LOAD
    Private Sub Form_Load()
        ' initialize menu
        MyResetMenu
    End Sub
    
    ' LISTBOX MENU 1
    Private Sub Inter01_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
        SetListBox 1, Me.List01
    End Sub
    
    ' LISTBOX MENU 2
    Private Sub Inter02_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
        SetListBox 2, Me.List02
    End Sub
    
    ' LISTBOX MENU 3
    Private Sub Inter03_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
        SetListBox 3, Me.List03
    End Sub
    
    ' SET LISTBOX MENU
    Private Sub SetListBox(IntInter As Integer, SelectListBox As ListBox)
        ' check current listbox to avoid flicker
        If Not CurrentListBox Is Nothing Then If CurrentListBox.Name = SelectListBox.Name Then Exit Sub
        ' set focus
        Me.GruppoMain.SetFocus
        ' set switch
        Me.GruppoMain.Value = IntInter
        ' chek current listbox
        If Not CurrentListBox Is Nothing Then
            ' hide current listbox
            If CurrentListBox.Name <> SelectListBox.Name Then CurrentListBox.Visible = False
        End If
        ' open listbox selected
        SelectListBox.Visible = True
        ' save current listbox
        Set CurrentListBox = SelectListBox
    End Sub
    
    ' RESET MENU
    Private Sub MyResetMenu()
        ' initialize listbox
        Me.List01.Value = Null
        Me.List02.Value = Null
        Me.List03.Value = Null
        ' set focus
        Me.GruppoMain.SetFocus
        ' hide listbox
        Me.List01.Visible = False
        Me.List02.Visible = False
        Me.List03.Visible = False
        Set CurrentListBox = Nothing
    End Sub
    
    ' RESET MENU
    Private Sub Corpo_Click()
        ' initialize menu
        MyResetMenu
    End Sub

    La stessa logica potresti realizzarla anche solo con gli "Interruttori" ... (personalmente non piace molto, però vedi te...puoi prendere qualche spunto, è da moltissimo che non lavoro con il vba)  ;-)

    P.S. (edit)
    Dimenticavo di segnalarti come evitare lo sfarfallio... in questo esempio viene eseguita la routine  solo se effettivamente viene passato il mouse su di un nuovo Interruttore. Vedere le righe di codice e la spiegazione che ti ha dato @Alex: 

    ' SET LISTBOX MENU
    Private Sub SetListBox(IntInter As Integer, SelectListBox As ListBox)
        ' check current listbox to avoid flicker
        If Not CurrentListBox Is Nothing Then If CurrentListBox.Name = SelectListBox.Name Then Exit Sub
        ...
        ....
        ......

    Quindi se ti trovi ancora sullo stesso Interruttore si esce subito dalla Sub ( Then Exit Sub) e in questo modo si evita di ridisegnare ed impostare nuovamente i vari controlli.

  • Re: Menu a tendina su maschera

    22/01/2025 - By65Franco ha scritto:

    21/01/2025 - luigice ha scritto:

    Dall'attivazione di un interruttore si va ad una routine evento che abilita il menu in discesa  degli altri interruttori che non erano visibili. 

    Ossia con     =  Forms![maschera iniziale]!Interruttore29.Visible = True

    Ciao, in effetti hai un effetto Flickering per quanto spiegato da @Alex.

    Una domanda se posso...  perchè hai usato tutti questi "Interruttori" ?  quale layout vuoi realizzare ?  (solo per curiosità)

    Cmq per darti un esempio io farei una cosa di questo tipo...per esempio utilizzando tre Interruttori inseriti in un gruppo e associando ad ogni interruttore una ListBox (casella di riepilogo) che si aprono al passaggio del mouse sotto ad ogni Interruttore.... sarebbe un poco più semplice e riflette un pò anche gli standard...
    Solo per darti un idea, ma esistono tanti altri metodi:

    e le quattro righe di codice saranno per esempio:

    Option Compare Database
    Option Explicit
    
    ' set variables global
    Private CurrentListBox As ListBox
    
    ' FORM LOAD
    Private Sub Form_Load()
        ' initialize menu
        MyResetMenu
    End Sub
    
    ' LISTBOX MENU 1
    Private Sub Inter01_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
        SetListBox 1, Me.List01
    End Sub
    
    ' LISTBOX MENU 2
    Private Sub Inter02_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
        SetListBox 2, Me.List02
    End Sub
    
    ' LISTBOX MENU 3
    Private Sub Inter03_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
        SetListBox 3, Me.List03
    End Sub
    
    ' SET LISTBOX MENU
    Private Sub SetListBox(IntInter As Integer, SelectListBox As ListBox)
        ' check current listbox to avoid flicker
        If Not CurrentListBox Is Nothing Then If CurrentListBox.Name = SelectListBox.Name Then Exit Sub
        ' set focus
        Me.GruppoMain.SetFocus
        ' set switch
        Me.GruppoMain.Value = IntInter
        ' chek current listbox
        If Not CurrentListBox Is Nothing Then
            ' hide current listbox
            If CurrentListBox.Name <> SelectListBox.Name Then CurrentListBox.Visible = False
        End If
        ' open listbox selected
        SelectListBox.Visible = True
        ' save current listbox
        Set CurrentListBox = SelectListBox
    End Sub
    
    ' RESET MENU
    Private Sub MyResetMenu()
        ' initialize listbox
        Me.List01.Value = Null
        Me.List02.Value = Null
        Me.List03.Value = Null
        ' set focus
        Me.GruppoMain.SetFocus
        ' hide listbox
        Me.List01.Visible = False
        Me.List02.Visible = False
        Me.List03.Visible = False
        Set CurrentListBox = Nothing
    End Sub
    
    ' RESET MENU
    Private Sub Corpo_Click()
        ' initialize menu
        MyResetMenu
    End Sub

    La stessa logica potresti realizzarla anche solo con gli "Interruttori" ... (personalmente non piace molto, però vedi te...puoi prendere qualche spunto, è da moltissimo che non lavoro con il vba)  ;-)

    P.S. (edit)
    Dimenticavo di segnalarti come evitare lo sfarfallio... in questo esempio viene eseguita la routine  solo se effettivamente viene passato il mouse su di un nuovo Interruttore. Vedere le righe di codice e la spiegazione che ti ha dato @Alex: 

    ' SET LISTBOX MENU
    Private Sub SetListBox(IntInter As Integer, SelectListBox As ListBox)
        ' check current listbox to avoid flicker
        If Not CurrentListBox Is Nothing Then If CurrentListBox.Name = SelectListBox.Name Then Exit Sub
        ...
        ....
        ......

    Quindi se ti trovi ancora sullo stesso Interruttore si esce subito dalla Sub ( Then Exit Sub) e in questo modo si evita di ridisegnare ed impostare nuovamente i vari controlli.

    Grazie è proprio quello che volevo fare. Proverò nel modo che mi hai suggerito. Grazie ancora

  • Re: Menu a tendina su maschera

    23/01/2025 - luigice ha scritto:

    Grazie è proprio quello che volevo fare. Proverò nel modo che mi hai suggerito. Grazie ancora

    Ciao, 
    di nulla, è solo un esempio ... una traccia. 
    Personalmente non piace ;-)) ... 

    tu cerca di fare meglio, volevo solo farti capire che ci sono tanti modi.  Approfondisci , studiati i vari sistemi che esistono , prova e riprova e cerca di seguire sempre un metodo il più possibile standard, semplice ed efficacie. 

Devi accedere o registrarti per scrivere nel forum
18 risposte