Newsgroup: it.comp.lang.visual-basic
Titolo: Lentezza For each

    Ho necessità, a seconda del profilo utente che ha fatto il login di
abilitare o
    disabilitare alcune voci di menu di una MDI.
    le voci di menu da abilitare sono contenute in un recordset Ado 2.1
risultato di una       vista su una tabella SQL SERVER 7 .
Il Ciclo è il seguente:
  For Each MYOB In frmMain
        If UCase(Left(MYOB.Name, 3)) = "MNU" Then
           MYOB.Enabled = False
           For i = 0 To RS.RecordCount - 1
           RS.Move i, 1
            If Left(UCase(MYOB.Name), 10) = Left(UCase(RS("SIGLA")), 10)
Then
               MYOB.Enabled = True
               Exit For
               End If
           Next i
           End If
    Next MYOB
Per funzionare funziona, il problema è che alle volte si 'Inchiomma' cioè è
troppo lento.
Il bello è che la lentezza è variabile cambia da pochi istanti ad alcuni
minuti !!!!.
Qualcuno ha qualche idea ?
Per risposte private 
vp...@infomedica.it

Ciao AmigaForEver,
credo che la lentezza sia dovuta al fatto che ogni voce di menu che crei,
fai una ricerca sequenziale di tutte le voci del recordset.
Io normalmente per la gestione dei menu in base al profilo utente agisco in
questo modo:
1) Creo una tabella Utenti, dove tra gli altri campo inserisco un campo
ItemMenu di testo, nel quale
inserisco una stringa di n. caratteri (di default imposto 255 caratteri 0 ).
2) Creo una tabella VociMenu, organizzata in modo che ogni menu ha un ID
 es. MenuTabelle ID=1 , MenuAnagrafiche ID=2 ecc...)
Per ogni voce posso stabilire se è un menù che richiama direttamente un
comando oppure se la voce richiama un altro menù, indicando iin un campo
Chiave o il nome della funzione da effettuare, o il nome del subMenu da
richiamare.
3) Ogni voce di menù infine, avrà in IdProgr univoco che sarà il carattere
numero "IdProgr" della stringa ItemMenu ricavata dal profilo utente:
es : se il mio menù ha IdProgr uguale a 5, l'attivazione sarà stabilita dal
valore del quinto carattere della stringa ItemMenu del profilo utente.
In questo modo, ogni volta che devi generare un menu a rinTime, ti crei il
recordset che contiene tutte le voi del menu che ti interessano es:
devi fare il menu Anagrafiche che avrà un ID 2, tio crei un recordset che ti
restituisca tutto ciò che ha come ID 2, (sia come menù principale che per i
menù secondari)
Fail lavisualizzazione come detto prima e sei a posto.
Credo che in questo modo tu ottenza una maggior velocità dovuta al fatto che
fai una sola operazione sul disco di richiesta dati.
Spero di esserti stato di aiuto, anche se forse ho incasinato un pò la
spiegazione.
Ciao
Paolo Ardissone

Prima di tutto grazie della tua attenzione.
c'è una cosa che non ho capito:
Tu Crei Run-time i menù o li visualizzi solo ?
Perchè se li crei run-time vorrei sapere come ci riesci visto che io sono
riuscito
solo a creare runtime delle matrici di oggetti partendo da uno già impostato
come
iniziale. E' Possibile creare run-time degli oggetti non appartenenti a
matrici ?

Ciao,
Io normalmente non uso i menu di VB ma per il form MDI uso delle Toolbar, ed
in particolar modo la Toolbar della vbAccelerator che mi permette di creare
a run-time dei menu, e ad ottenere dei menu stile Outlook, con la
possibilità di inserire dei menu popup di fianco al buttone ecc... inoltre
mi permette di inserire dei controlli quali comboBox, textBox ecc, a livello
di menù.
Prova a vedere sul sito 
http://www.vbaccelerator.com
 , io dopo qualche
momento iniziale di problematiche varie, ho imparato ad usarli e mi sto
trovando molto bene.
Ciao
Paolo Ardissone