Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Attivazione menu

Sto impazzendo !!!
Sto configurando le attivazioni dei menu del mio prog.
Calcolando ci metto di + a fare i menu che a fare il prog.
Ho dei menu che si dovrebbero in cascata.
Impianti
    Nuovo       (Attivo se ci sono Clienti)
    Modifica    (Attivo se ci sono impianti)
    Elimina       (Attivo se ci sono impianti)
Dettagli impianto
    Aggiungi    (Attivo se ci sono Impianti)
    Modifica    (Attivo se ci sono dettagli, Disattivo se non ci sono
Impianti)
    Elimina       (Attivo se ci sono dettagli, Disattivo se non ci sono
Impianti)
Fogli di lavoro
    Nuovo       (Attivo se ci sono Impianti e Dettagli)
    Modifca     (Attivo se ci sono Fogli, Disattivo se non ci sono fogli)
    Elimina       (Attivo se ci sono Fogli, Disattivo se non ci sono fogli))
Interventi su foglio di lavoro
    Nuovo       (Attivo se ci sono Impianti, Dettagli e Fogli)
    Modifica    (Attivo se ci sono Interventi, Disattivo se non ci sono
Interventi)
    Elimina       (Attivo se ci sono Interventi, Disattivo se non ci sono
Interventi)
Chiudi foglio di lavoro
    Chiudi        (Attivo se ci sono Impianti, Dettagli, Foglio di lavoro,
Foglio Aperto)
    Riapri         (Attivo se ci sono Impianti, Dettagli, Foglio di lavoro,
Foglio Chiuso)
Voi avete qualche consiglio ?
Grazie, Alberto

 Voi avete qualche consiglio ?
Qual è la domanda?
Se per "in cascata" intendi "indentati" (a rientro progressivo), beh, creali
indentati.


http://members.xoom.it/CesareRizzi/Menu.zip
Ciao
--
Timothy Redaelli
timothy(dot)redaelli(at)email(dot)it
-----------------------------------
Links:
Sito Comune: 
www.it-lang-vb.net
MSDN: 
msdn.microsoft.com


Se ho capito bene, vorresti attivare o disattivare i menu in funzione di
quelle condizioni che hai elencato?
Se si, ho contato in tutto 6 condizioni (Clienti, Impianti, Dettagli, Fogli,
Interventi, Foglio Chiuso)
io farei cosě, sulla base della mappa Bit
111111
 | | | | | |_ 1 Bit = Clienti
 | | | | |_   2 Bit = Impianti
 | | | |__   3 Bit = dettagli
 | | |___   4 Bit = Fogli
 | |____  5 bit =  Interventi
 |_____  6 Bit = Foglio Chiuso
Tradotta in enum :
Public enum MyFlags
    mfClienti =1
    mfImpianti = 2
    mfDettagli = 4
    mfFogli = 8
    mfInterventi =16
    mfFoglioChiuso =32
end enum
'Ti crei una variabile di tipo MyFlags utilizzi per memorizzare gli stati
nei punti di codice opportuno
Public gFlags as MyFlags
'Poi in una sub ti vai ad attivare/disattivare i menu
Private sub AttivaMenu
    mnuImpiantiNuovo.Enabled = (gFlags And  mfClienti) > 0
    mnuImpiantiModifica.Enabled = (gFlags And mfImpianti) > 0
    .
    .
    mnuFogliDilavoroNuovo.enabled = (gFlags And (mfImpianti Or
mfDettagli))>0
    .
    .
    ecc
end sub
Spero di essere stato chiaro e soprattutto di aiuto ;-)
Ciao
G.C.

 Public gFlags as MyFlags
Ma che valore devo inserire in gFlags?
La somma dei bit ?

> 
http://members.xoom.it/CesareRizzi/Menu.zip
non esiste !!


Esempio: nel punto in cui apri il tuo archivio deli clienti, tu fai un
controllo sull' esistenza di record dei clienti e , se ce ne sono, ti
imposti il valore in  gFlags.
Vado a intuito perchč non conosco il tuo codice:
If  rsClienti.RecordCount > 0  then            ' Se ci sono records nel
recordset Clienti
       gflags = gflags or mfClienti                    'Imposta la flag dei
clienti su  1
else
       gflags = gflags And (not  mfClienti)       'Altrimenti la imposta a 0
endif
questo, lo devi ripetere in tutti i punti in cui il tuo codice esegue le
operazioni di apertura/chiusura dei database, fogli etc, in pratica nei
punti in cui devi controllare gli stati per poi riutilizzarli in seguito.
Il vantaggio di usare l' Enum č che quando scrivi  "gFlags = " VB ti fa
comparire la lista dei parametri subito dopo l'uguale facilitando il compito
dell' immissione dei valori e limitando le possibilitą di errore.
Ciao
G.C.

 0
End Sub
Devo usare + Flag o ne basta uno
Grazie, e scusa per la mia durezza (di testa)

 non esiste !!
Ah già è vero, non avevo controllato (con l'incendio di XOOM...)



No, devi usare tutti i valori che rappresentano la condizione che devi
soddisfare ossia, ogni valore rappresenta una condizione, quindi se tu devi
verificare la concomitanza di tre valori devi utilizzare tutti e tre i
valori :
quindi se un menu deve attivarsi quando le flag   Clienti, impianti e
Interventi sono attivi la tua espressione sara'
      = gFlags And (mfClienti or mfImpianti or mfInterventi) >0
Ti ho consigliato questo sistema proprio perchè risulta intuitivo per l'
impostazione delle condizioni poichè ogni flag equivale ad una condizione.
Forse quello che non ti è chiaro sono le operazioni sui Bit :
Sommariamente:
OR esegue la somma     esempio   Print  mfClienti or mfImpianti or
mfInterventi  restituisce 11
And effettua una comparazione:
esempio  se gFlags = 1    l' espressione  Print gflags And mfClienti
restituisce 1
                                       l' espressione  Print gflags And
(mfClienti or mfImpianti) restituisce 0
restituirebbe 3 se gflags fosse 3
Numero And (Not  valore)  esegue la sottrazione
Numero Xor valore esegue l' inversione
Ti consiglio di fare qualche prova nella finestra immediate di VB per capire
meglio
Ciao
G.C.

 0
    frmMain.TbCall.Buttons(13).ButtonMenus(2).Enabled = (gFlags And (mfFogli
Or mfInterventi)) > 0
    frmMain.TbCall.Buttons(13).ButtonMenus(3).Enabled = (gFlags And (mfFogli
Or mfInterventi)) > 0
    frmMain.TbCall.Buttons(13).ButtonMenus(4).Enabled = (gFlags And (mfFogli
Or mfInterventi)) > 0

     'INTERVENTI
        Sembra OK
Cerca comunque di essere un po' più chiaro:  da cosa non riesci a
districarti?
Cosa in particolare non ti funziona bene?
Da quello che mi hai postato, l' unico che non funziona è il menu Macchine,
il resto , se non funziona, dipende da un altro punto del programma.
Ciao
G.C.

Nelle macchine c'è quanlcosa che non va.
Quando entro con un'impianto  nel menu macchine è attivo tutto

Naturalmente non ci sono macchine, e dovrei avere attivo solo Nuovo

 Quando entro con un'impianto  nel menu macchine è attivo tutto
Anche dopo aver inserito le parentesi che ti ho detto?

si :(
Per fare in modo che si attivi solo nuovo faccio cosi:
    'MACCHINE
    frmMain.TbCall.Buttons(9).ButtonMenus(1).Enabled = (gFlags And
mfImpianti) > 0
    frmMain.TbCall.Buttons(9).ButtonMenus(2).Enabled = (gFlags And
mfDettagli) > 0
    frmMain.TbCall.Buttons(9).ButtonMenus(3).Enabled = (gFlags And
mfDettagli) > 0
    frmMain.TbCall.Buttons(9).ButtonMenus(4).Enabled = (gFlags And
mfDettagli) > 0
ma poi non cambia quando ci sono amcchine :(

Penso che il problema nasca proprio da qui
    'MACCHINE
    frmMain.TbCall.Buttons(9).ButtonMenus(1).Enabled = (gFlags And
mfImpianti) > 0
    frmMain.TbCall.Buttons(9).ButtonMenus(2).Enabled = (gFlags And
(mfImpianti Or mfDettagli)) > 0
    frmMain.TbCall.Buttons(9).ButtonMenus(3).Enabled = (gFlags And
(mfImpianti Or mfDettagli)) > 0
    frmMain.TbCall.Buttons(9).ButtonMenus(4).Enabled = (gFlags And
(mfImpianti Or mfDettagli)) > 0
Se entro con 3 (clienti>1 e impianti>1) la 2,3,4 voce di menù sono sempre >
di 0

 0
    frmMain.TbCall.Buttons(13).ButtonMenus(2).Enabled = (gFlags And (mfFogli
Or mfInterventi)) = 8
    frmMain.TbCall.Buttons(13).ButtonMenus(3).Enabled = (gFlags And (mfFogli
Or mfInterventi)) = 8
    frmMain.TbCall.Buttons(13).ButtonMenus(4).Enabled = (gFlags And (mfFogli
Or mfInterventi)) = 8