Newsgroup: it.comp.appl.access
Titolo: Menu: risalire alla voce utilizzata

Salve a tutti
in un DB ha creato un menu personalizzato, l'unico che viene visualizzato
dal programma.
Da più voci di menu richiamo la stessa maschera MasSceltaMese (selezione del
mese interessato), che mi filtra i dati di varie query in base al mese
scelto dall'utente.
Il problema mi sorge quando devo impostare l'azione da effettuare premendo
il pulsante OK della maschera MasSceltaMese.
Io ho bisogno che si apra una maschera diversa a seconda della voce di menu
di partenza.
Es.:
Voce menu: Elenco assenze sindacali -> si apre la maschera MasSceltaMese ->
si apre la maschera delle assenze sindacali.
Voce menu: Elenco assenze RSU -> si apre la maschera MasSceltaMese -> si
apre la maschera delle assenze conto RSU.
Voce menu: Elenco assenze RLS -> si apre la maschera MasSceltaMese -> si
apre la maschera delle assenze conto RLS.
Ho pensato di duplicare la maschera MasSceltaMese, ma non mi pare una buona
soluzione.
E' possibile intercettare la voce di menu utilizzata in partenza? Esiste un
valore per ogni voce di menu, da poter memorizzare in una variabile, in modo
da influenzare il flusso delle operazioni in base a tale variabile?
Sono andato a vedere le proprietà del menu personalizzato, ma non esiste un
elenco delle voci presenti, o almeno io non l'ho trovato.
Per chiarezza aggiungo che il menu è composto da vari gruppi principali,
ognuno dei quali ha dei sottogruppi e/o delle voci di menu.
Uso Access XP.
Un grazie anticipato a tutti
Franco
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/


Visto che usi AXP puoi definire una variabile come CommandBar ed
ereditarne gli Eventi...
Dim WithEvents mB as CommandBar
Quindi la setti:
Set mB=CommandBars("NomeBarra")
Ora hai a disposizione nella Form gli Eventi...
@Alex


Grazie per la risposta, ma purtroppo non riesco ad applicare il tuo
suggerimento.
Ho provato a generare la variabile come pubblica a livello di modulo
generale, ma non mi permette di usare WithEvents; si deve definire la
variabile a livello di modulo di form.
Ma su quale form devo definirla? Ho pensato su quella di scelta
(MasSceltaMese), e l'ho inizializzata sull'evento Load della maschera.
Ma poi non so quale evento utilizzare per testare la voce di menu usata per
aprirla.
La maschera MasSceltaMese viene aperta da più voci di menu: come posso
risalire alla voce chiamante?
Le barre dei menu hanno una proprietà che "segnala" in qualche maniera
l'ultima voce usata?
Ho visto che ogni voce di menu ha una proprietà "Tag" che è possibile
impostare, ma non so come fare poi a risalire a tale proprietà ( ma non so
neanche se ciò può servire al mio caso).
Ti sarei grato se fossi un po' più descrittivo nella risposta.
Saluti



La devi usare in una Form, o in ogni form in cui devi intercettare il
Menù... i moduli non accettano la dichiarazione con Eventi.
L'alternativa per evitare la Multidichiarazione è di crearsi una
Classe ed all'interno gestire gli eventi dell'Oggetto CommandBar.
Altrimenti puoi definire le funzioni da richiamare (dal menù) come
Public Function in un Modulo, quindi dal Menù fai richiamare le
funzioni personalizzate con =NomeFunction()
A quel punto nel modulo puoi gestire quello che ti pare, ricorda che
la Form attiva sulla quale stai agendo è Screen.AcriveForm
@Alex


Grazie ancora Alex, ma non mi è ancora chiaro quale evento, proprietà o
altro devo richiamare per intercettare la voce chiamante.
Nella maschera MasSceltaMese ho inserito il seguente codice:
Private Sub Form_Load()
    Dim VoceMenu As CommandBar
    Set VoceMenu = CommandBars("mnuSindacato")
     'e adesso?
End Sub
il menu mnuSindacato è composto di varie voci (File, Modifica, Record,
Assenze, Finestra, ?); il menu File a sua volta comprende voci singole e dei
gruppi, tra cui c'è "Amministrazione"; questo a sua volta comprende il
gruppo "Assenze", che è composto di tre voci, le tre che aprono la finestra
MasSceltaMese. Come faccio a sapere quale delle tre voci ha aperto la
maschera?
Ho provato a scorrere le proprietà che mi presenta VB dopo il comando
CommandBars("mnuSindacato"). ma non ho capito quale potrebbe essere quella
giusta (Index forse?).
Scarto a priori la creazione della classe perchè non so farlo.
Grazie ancora per la pazienza.



Ciao Franco, devi scusarmi ma dalle tue perplessità ho capito di non
essere stato assolutamente chiaro, vedo di rimediare.
La Collection Commandbars è l'insieme di tutte le CommandBar, ogni
Commandbar ha dei CommandBarButton, e sono quelli gli oggetti che
restituiscono l'EVENTO, pertanto dovrai fare una cosa simile:
Option Compare Database
Option Explicit
Private WithEvents mB_F As CommandBarButton
Private WithEvents mB_M As CommandBarButton
Private Sub Form_Open(Cancel As Integer)
    Set mB_F= CommandBars("mnuSindacato").Controls("File")
    Set mB_M= CommandBars("mnuSindacato").Controls("Modifica")
End Sub
Private Sub mB_F_Click(ByVal Ctrl As Office.CommandBarButton,
CancelDefault As Boolean)
    Msgbox "MENU' FILE PREMUTO"
End Sub
Private Sub mB_M_Click(ByVal Ctrl As Office.CommandBarButton,
CancelDefault As Boolean)
    Msgbox "MENU' MODIFICA PREMUTO"
End Sub
ecc...
Spero di essere stato più chiaro..., ti ricordo che questo funziona
solo da AXP in avanti
@Alex


Niente da fare, Alex.
Ho fatto il copia-incolla del codice suggerito da te, dapprima mi dava un
errore "Tipo oggetto non corrispondente". L'ho superato aggiungendo la
dichiarazione della CommandBar principale, dopodichè continua a restituirmi
il messaggio di errore seguente:
"L'espressione Su apertura immessa come impostazione della proprietà di
evento ha provocato il seguente errore: L'oggetto non può essere l'origine
di eventi di automazione".
Ho provato a leggere l'help relativo all'insieme Commandbars (non capendo
granchè), ed ho integrato il codice suggeritomi da te con la dichiarazione
dei vari oggetti CommandBar, così come sono presentati in cascata nell'help,
ma senza miglioramenti.
Per chiarezza aggiungo tutto il codice che ho scritto, il tutto nella
maschera di scelta MasSceltaMese.
Option Compare Database
Option Explicit
Private WithEvents MenuSindacato As CommandBar
Private WithEvents MenuFile As CommandBarControls
Private WithEvents MenuAmministrazione As CommandBarPopup
Private WithEvents MenuAssenze As CommandBarPopup
Private WithEvents MenuAssenzeAGS As CommandBarButton
Private Sub Form_Open(Cancel As Integer)
    Set MenuSindacato = CommandBars("mnuSindacato")
    Set MenuAmministrazione = MenuSindacato.Controls("Amministrazione")
    Set MenuAssenze = MenuAmministrazione.Controls("Assenze")
    Set MenuAssenzeAGS = MenuAssenze.Controls("Elenco assenze AGS")
End Sub
Private Sub MenuAssenzeAGS_Click(ByVal Ctrl As Office.CommandBarButton,
CancelDefault As Boolean)
    MsgBox "Menu ELENCO ASSENZE AGS premuto"
End Sub
Come puoI notare ho ricreato tutta la struttura del mio menu, fino ad
arrivare alla singola voce chi richiama la maschera di scelta, interpretando
come segue:
CommandBar il menu intero (MnuSindacato)
CommandBarControls il gruppo principale del menu (File)
CommandBarPopup il sottomenu del gruppo File (Amministrazione)
CommandBarPopup il sottomenu (Assenze) compreso nel sottomenu
Amministrazione
CommandBarButton la singola voce (Elenco assenze AGS) compresa nel sottomenu
Assenze
L'esecuzione si ferma sempre sull'evento Open della maschera con il
messaggio di errore descritto sopra, non arrivando mai a valutare il Click
sulla voce di menu.
Ho provato anche a sostituire l'evento Open con l'evento Load, ma il
risultato è lo stesso.
Scusami ma non so dov'è l'errore.
Uso Access XP e il DB è salvato in formato 2002.
Grazie per la pazienza



Il Demo che ti ho suggerito funziona, hai provato anche tu...? Perchè
assegni l'evento all'oggetto CommandBarControls che è una collection e
non a CommandBarButton come ti ho suggerito io...?
Perchè hai definito CommandBarPopup se non è un Menù di tipo
Popup...??
Non sò cosa dire non ho modo di provarlo... non mi è chiara la
strutturazione della tua ToolBar.... e non mi sono chiari gli errori
che hai commesso nell'assegnazione...
Prova a rivedere bene il mio esempio e leggiti l'Help relativamente
alla tipologia degli Oggetti da assegnare....
@Alex


Come sempre hai ragione tu Alex.
Non so che cosa avevo riportato la prima volta che non mi faceva funzionare
la tua procedura.
Che devo dire: non sono neanche buono a copiare!!!
L'ho riproposta ed è tutto OK.
Grazie ancora
Saluti


Hai inserito le Refernenze alle librerie di Office...?
@Alex


Sě, grazie, ora ho sistemato al meglio e qualche risultato l'ha dato. Ti
posto l'intero codice usato, per chiarezza:
Option Compare Database
Option Explicit
Private WithEvents MenuAssenzeAGS As CommandBarButton
Private WithEvents MenuAssenzeRLS As CommandBarButton
Private WithEvents MenuAssenzeRSU As CommandBarButton
Private Sub Form_Open(Cancel As Integer)
    Set MenuAssenzeAGS =
CommandBars("mnuSindacato").Controls("File").Controls("Amministrazione").Controls("Assenze").Controls("Elenco
assenze AGS")
    Set MenuAssenzeRLS =
CommandBars("mnuSindacato").Controls("File").Controls("Amministrazione").Controls("Assenze").Controls("Elenco
assenze RLS")
    Set MenuAssenzeRSU =
CommandBars("mnuSindacato").Controls("File").Controls("Amministrazione").Controls("Assenze").Controls("Elenco
assenze RSU")
End Sub
Private Sub MenuAssenzeAGS_Click(ByVal Ctrl As Office.CommandBarButton,
CancelDefault As Boolean)
    MsgBox "Premuto AGS"
End Sub
Private Sub MenuAssenzeRLS_Click(ByVal Ctrl As Office.CommandBarButton,
CancelDefault As Boolean)
    MsgBox "Premuto RLS"
End Sub
Private Sub MenuAssenzeRSU_Click(ByVal Ctrl As Office.CommandBarButton,
CancelDefault As Boolean)
    MsgBox "Premuto RSU"
End Sub
Ho ancora un inconveniente: qualunque voe di menu io usi vengono eseguite
tutte e tre le routine, in pratica ricevo come risposta tre msgbox. Ci sarŕ
ancora qualche errore che non sono riuscito a trovare. Tieni presente che
per me l'uso delle variabili legate all'oggetto CommandBarButton č
totalmente nuovo.
Io devo testare la voce di menu che si trova al 4° livello del mio menu
mnuSindacato:
File -> Amministrazione -> Assenze -> VoceInteressata.
Ti ringrazio per la collaborazione e l'aiuto.
Saluti
Franco
P.S. Sarň via per alcuni giorni, tornerň mercoledě 23/5.


Franco cerco di spiegarti meglio.... partiamo da questa struttura:
Menů[AAA]
        SubMenů[BBB]
                        SubSubMenů[CCC]
                                            VoceMenů[DDD]
Come vedi siamo al 4 livello, e mi pare possa essere assimilato al tuo...
Allora la Collection Commandbars contiene tutti i Menů, incluso "AAA"
Quindi per riferirmi al Menů AAA farň:
Commandbars("AAA")
A questo punto l'oggetto individuato č di tipo CommandBar, in quanto ITEM di
CommandBars.
L'oggetto CommandBar espone la Collection Controls che individua gli ITEMS
di livello [+1] o SubItems
Nel nostro caso abbiamo solo [BBB] che perň non č un Button, ma a sua volta
č un'oggetto CommandBar che al suo interno esporrŕ la Collection Controls
dei SubSubItems... all'interno trovi come SubSubItem solo [CCC] che guarda
caso č ancora una commandbar....
La cosa č un pň complessa, ma si tratta di concetti di ereditarietŕ delle
Classi...
Riassumendo per far funzionare il tutto diventa cosě:
Private WithEvents mB1 As CommandBarButton
Private Sub Form_Open(Cancel As Integer)
    Set mB1 =
CommandBars("AAA").Controls("BBB").CommandBar.Controls("CCC").CommandBar.Con
trols("DDD")
End Sub
Private Sub mB1_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault
As Boolean)
    Me.txtCB.Value = "HAI PREMUTO DDD"
End Sub
Ciao
-- 
@Alex (Alessandro Baraldi)
---------------------------------------------------------------------------
http://www.sitocomune.com/
http://www.alessandrobaraldi.it
---------------------------------------------------------------------------

 Classi...
Gasp! Gulp?
Se mi lanci qualche improperio ti rispondo domani che adesso stacco.
Sono stato ad incazzarmi finora con la creazione di una Tabella che non 
voleva definire il tipo "Contatore". Ho sempre detto che sono un malanno 
dell'umanita' (non io-me, i contatori!!!!!)
-- 
ac
y-1=x

 y-1=x
@Alex


Ciao Alex, e grazie per la risposta. Sono rientrato oggi e l'ho subito
letta.
Ho modificato il codice, aggiungendo il riferimento all'oggetto CommandBar
come suggerito, ma il risultato č sempre lo stesso: vengono eseguite tutte e
tre le routine, indifferentemente da quale voce di menu io abbia scelto. Ti
riposto il codice completo.
Option Compare Database
Option Explicit
Private WithEvents MenuAssenzeAGS As CommandBarButton
Private WithEvents MenuAssenzeRLS As CommandBarButton
Private WithEvents MenuAssenzeRSU As CommandBarButton
Private Sub Form_Open(Cancel As Integer)
    Set MenuAssenzeAGS =
CommandBars("mnuSindacato").Controls("File").CommandBar.Controls("Amministrazione").CommandBar.Controls("Assenze").CommandBar.Controls("Elenco
assenze AGS")
    Set MenuAssenzeRLS =
CommandBars("mnuSindacato").Controls("File").CommandBar.Controls("Amministrazione").CommandBar.Controls("Assenze").CommandBar.Controls("Elenco
assenze RLS")
    Set MenuAssenzeRSU =
CommandBars("mnuSindacato").Controls("File").CommandBar.Controls("Amministrazione").CommandBar.Controls("Assenze").CommandBar.Controls("Elenco
assenze RSU")
End Sub
Private Sub MenuAssenzeAGS_Click(ByVal Ctrl As Office.CommandBarButton,
CancelDefault As Boolean)
    MsgBox "Premuto AGS"
End Sub
Private Sub MenuAssenzeRLS_Click(ByVal Ctrl As Office.CommandBarButton,
CancelDefault As Boolean)
    MsgBox "Premuto RLS"
End Sub
Private Sub MenuAssenzeRSU_Click(ByVal Ctrl As Office.CommandBarButton,
CancelDefault As Boolean)
    MsgBox "Premuto RSU"
End Sub
La struttura del mio menu č la seguente:
Menu[mnuSindacato]
      SubMenu[File]
            SubSubMenu[Amministrazione]
                  SubSubSubMenu[Assenze]
                        VoceMenu[Elenco assenze AGS]
                        VoceMenu[Elenco assenze RLS]
                        VoceMenu[Elenco assenze RSU]
Naturalmente questa č la struttura che mi interessa, in effetti ogni SubMenu
ha piů voci, piů SubSub ecc...
Qualunque delle tre voci del menu io scelga mi fa partire sempre tutte e tre
le routine, quindi io vedo tre msgbox; se io provo a memorizzare in una
variabile o in una casella di testo un valore per ogni routine, mi memorizza
sempre quello dell'ultima routine (MenuAssenzeRSU_Click), perchč eseguendole
tutte e tre il valore ultimo č quello.
Grazie per la collaborazione
Franco
