Gestire interruttori (con If oppure ciclando fra essi)

di il
7 risposte

Gestire interruttori (con If oppure ciclando fra essi)

Ciao a tutti.

Oggi mi sono accorto dopo buoni 2 minuti che, nell'eseguire una query, non ottenevo il risultato voluto per un banalissimo motivo: nella fretta non avevo premuto 1 (o più) interruttori in base ai quali costruisco una query mirata.

E quindi mi sono ingegnato per fare in modo che, nel caso, venissi in qualche modo avvisato.

Volevo ricorrere ad una finezza, ciclando fra di essi per verificare se fossero True o False (questi interruttori hanno lo stesso Tag), qualcosa tipo:

Dim Ctrl as Control
For Each Ctrl in Me.Controls
	If Ctrl.Tag= "Pippo" Then

Però mi sono fermato lì, in quanto non avrei idea di come dirgli “se TUTTI gli interruttori con il Tag Pippo sono False allora etc etc”, perchè, se non erro, in questo modo lui verifica controllo per controllo e non la loro totalità.

Ad esempio, uso una struttura tipo quella sopra per cambiare il colore del testo negli interruttori attivi, ma in quel caso mi va bene che controlli uno per uno, senza alcun nesso fra di loro.

Nell'immediato (cioè prima di scrivere qui) ho pensato di risolverlo con un If multiplo (anche se forse poco elegante) del tipo:

If me.swt1=false And me.swt2=false And me.swt.....etc etc Then

però così facendo, pur eseendo tutti gli interruttoi False, ignora la condizione, o meglio, per lui la condizione non è verificata (eppure sono tutti False…), e non capisco il perchè.

Anche perchè non è un comportamento standard, nel senso che di solito una condizione IF di questo tipo mi funziona….

A parte il problema specifica attuale (in questo caso gli interruttori sono 5), mi domando: nel caso dovessi fare una verifica (o una qualunque altra operazione) su un numero più cospicuo di interruttori (diciamo una 20ina, giusto per esagerare), come impostare un codice “decente”?

Andrea

7 Risposte

  • Re: Gestire interruttori (con If oppure ciclando fra essi)

    13/12/2022 - Jocman ha scritto:


    …Volevo ricorrere ad una finezza, ciclando fra di essi per verificare se fossero True o False (questi interruttori hanno lo stesso Tag), qualcosa tipo:

    Dim Ctrl as Control
    For Each Ctrl in Me.Controls
    	If Ctrl.Tag= "Pippo" Then

    Però mi sono fermato lì, in quanto non avrei idea di come dirgli “se TUTTI gli interruttori con il Tag Pippo sono False allora etc etc”, perchè, se non erro, in questo modo lui verifica controllo per controllo e non la loro totalità.

    Ovviamente scorrendo la collection di controlli tu verifichi il singolo controllo. Spetta a te mettere insieme il valore di ogni singolo controllo in un' unica variabile con qualcosa di simile :

    Dim bResult as boolean
    Dim Ctrl as Control
    bResult = false
    For Each Ctrl in Me.Controls
    	If Ctrl.Tag= "Pippo" Then
    		If not Ctrl.value then
    			bResult = true 
    			'Volendo esci dal loop
    			'exit for
    		end if
    	end if
    Next
    If bResult then
    	'msg avvertimento
    End if
    
  • Re: Gestire interruttori (con If oppure ciclando fra essi)

    13/12/2022 - Jocman ha scritto:


    però così facendo, pur eseendo tutti gli interruttoi False, ignora la condizione, o meglio, per lui la condizione non è verificata (eppure sono tutti False…), e non capisco il perchè.

    Ricorda che gli iterruttori hanno un comportamento strano: all'apertura della maschera, prima che siano stati toccati, il loro valore non è False ma Null, solo dopo il valore cambia da Vero a Falso a seconda che siano premuti o meno. Per non dover gestire il Null imposta il valore di default a False.

  • Re: Gestire interruttori (con If oppure ciclando fra essi)

    Se parliamo di Gruppo Opzioni, non serve ciclare la Collection afferente alla Form, ma basta circoscrivere la cosa ciclando la Collection afferente al Controllo “Cornice”, ovviamente contiene anche le Label, ma a noi in questo caso servono solo gli OptionButton.

    Dim C   As Access.Control
    For Each C In Me.boxList.Controls
        Select Case C.ControlType
            Case Access.AcControlType.acOptionButton
                        Debug.Print C.Name, C.ControlType
        End Select
    Next

     Altrimenti, se non sono parte di Option Group, puoi allargare la cosa, e gestirla al meglio a seconda di quanti controlli ha la maschera.

    Se la Maschera ha un numero non superiore a qualche decina, allora si può usare la Collection controls di Form, in questo modo:

    Dim C   As Access.Control
    For Each C In Me.Controls
        Select Case C.ControlType
            Case Access.AcControlType.acOptionButton
                If C.Tag = "Pippo" Then Debug.Print C.Name, C.ControlType
                
        End Select
    Next

    Se la Maschera avesse un sacco di controlli, personalmente non andrei a ciclarli tutti per trovare quei 5 che costruiscono il Filtro… ad esempio Maschere complesse che hanno qualche centianio di controlli rendono questi cicli molto lunghi se ripetuti.

    In questo caso si ricorre ad Oggetti AGGREGANTI o CONTENITORI, come appunto l'OptionGroup, ma nel nostro caso useremo un Controllo a Schede, con solo 1 Pagina, trasparente e senza Selettori, effetto ottenuto INVISIBILE ma funzionalmente raggruppa nella sua Collection Controls tutti i controlli che potenzialmente costituiscono il Filtro…

    Con questo sistema si possono raggruppare controlli afferenti a funzioni Specifiche e gestire poi cicli ottimizzati per ognuna.

    La logica è sempre quella del Primo esempio.

  • Re: Gestire interruttori (con If oppure ciclando fra essi)

    Direi che che se si usano controlli Opzione o Pulsante all'interno di una Cornice basta controllare il valore restituito da quest'ultima usando le istruzioni Select Case nel modo corretto.

  • Re: Gestire interruttori (con If oppure ciclando fra essi)

    Fissa mia, ma non uso mai i Gruppi Opzioni, vuoi perchè non mi sono mai impegnato più di tanto nello studiarli, vuoi per pigrizia.

    In ogni caso gli darò qualche chance in più, dopo tutto esistono, fanno il loro lavoro e quindi….

    Per fortuna, almeno attualmente, non mi è mai capitato di dover avere una situazione simile in un maschera con molti controlli (per fortuna, perchè una volta ne ho dovuto fare una con una 50ina di switch….)

    Grazie a tutti per i consigli, 

    Andrea

  • Re: Gestire interruttori (con If oppure ciclando fra essi)

    Il Gruppo Opzioni è utile SOLO se da 50(n) Opzioni ne devi estrarre 1 sola univoca…, gli interruttori non generano una Combinazione di selezioni una esclude le altre, quindi hanno un Limite, e se devi invece COMBINARE varie scelte non possono essere usati ma dovrai avere PIU' gruppi opzioni oppure interruttori e gestire le scelte.

  • Re: Gestire interruttori (con If oppure ciclando fra essi)

    Infatti quasi sempre li uso combinati, un motivo per cui non ho mai approfondito i gruppi di opzioni, che in quanto tali si autoescludevano.

    Anche se un paio di volte, onestamente, avrei potuto utilizzarli in una situazione come quella da te esemplificata dove combinavo delle opzioni distinte fa di loro.

Devi accedere o registrarti per scrivere nel forum
7 risposte