Nella scorsa lezione abbiamo visto cosa sono le variabili booleane e quali operazioni si possono fare con esse: ora vediamo come si usano. L'istruzione principale che fa uso di espressioni booleane è il costrutto
"if condizione then istruzione"
che, come dice il nome, esegue una o più istruzioni se si verifica una certa condizione. Ad esempio, l'istruzione:
If lblName.Visible = True Then
lblName.Caption = "Pippo"
End if
aggiorna la proprietà Caption dell'etichetta lblName se questa etichetta è visibile: il tipo della proprietà Visible, infti, è proprio Boolean. Quando Visual Basic deve eseguire un'istruzione come quella riporta, prima di tutto verifica se l'espressione compresa tra le parole chiave If e Then è vera o falsa: se l'etichetta è visibile (cioè se la proprietà visible è uguale a True), la condizione è verifica e quindi sarà eseguita l'istruzione seguente la parola chiave Then; altrimenti la condizione non sarà verifica e l'istruzione sarà del tutto ignora. Solitamente i programmori VB ("VB" è ovviamente l'abbreviazione di Visual Basic…) utilizzano una sintassi leggermente diversa, organizza su più di una riga (cosiddetta a blocco):
If lblName.Visible = True Then
lblName.Caption = "Pippo"
End If
In Visual Basic di solito si inserisce una istruzione per ogni riga, poiché è sufficiente il ritorno a capo per far capire a Visual Basic che l'istruzione è termina; nel caso della If…Then, quindi, è possibile far stare tutta l'istruzione sulla stessa riga, ma se le istruzioni che seguono Then vengono riporte nelle righe successive, è necessario indicare dove finiscono le istruzioni appartenenti al blocco If, e questo si fa appunto con la parola chiave End If, estamente come si fa con End Sub o End Function per indicare la fine di una subroutine o di una funzione.
Personalmente ritengo che la seconda sintassi sia più chiara e comoda, soprtutto quando le istruzioni da eseguire nel blocco sono più di una: infti, se volessimo utilizzare la sintassi su una singola riga, bisognerebbe separare le varie istruzioni con i ":", ad esempio:
If lblName.Visible = True Then
lblName.Caption = "Pippo":Form1.Caption = "Pippo"
....
(Nota: il cartere " : " può essere utilizzo per riunire più istruzioni sulla stessa riga anche al di fuori di un'istruzione If…Then) L'istruzione If…Then permette di eseguire certe istruzioni anche nel caso in cui la condizione non sia verifica: ciò è possibile grazie alla parola chiave Else, ad esempio:
If strName = "Pippo" Then
frmProva.Show
Else
frmProva.Hide
End If
Se la variabile stringa strName è uguale a "Pippo", il form frmProva viene mostro, altrimenti viene nascosto.
In questo modo è possibile ottenere una certa flessibilità nell'esecuzione condizionale di un gruppo di istruzioni; questa flessibilità è ulteriormente aumenta dalla possibilità di utilizzare la parola chiave ElseIf:
If strName = "Pippo" Then
frmProva.Show
frmProva.lblName.Caption = "Pippo"
ElseIf strName = "Topolino" Then
frmProva.Show
frmProva.lblName.Caption = "Minnie"
ElseIf strName = "Pluto" Then
frmProva.Show
frmProva.lblName.Caption="Orazio"
Else
frmProva.Hide
End If
In un blocco di questo tipo, Visual Basic comincia a verificare le condizioni una per una: quando una delle condizioni è verifica, vengono eseguite le istruzioni relive a quella condizione, ignorando le altre; se nessuna delle condizioni è verifica, vengono eseguite le istruzioni comprese nella clausola else, se è presente: altrimenti non viene eseguita alcuna istruzione. Infti le clausole Else e ElseIf sono facoltive.
All'interno di ogni blocco If…Then è possibile inserire qualunque istruzione, anche un'altra If…Then (si parla dei cosiddetti blocchi annidi); ad esempio si potrebbe fare:
If intX > 10 Then
If intX > 100 Then
intY = intX / 2
Else
intY = intX + 10
End If
ElseIf intX > 5 Then
intY = 0
Else
bValue = True
End If
In questo blocco viene valuto il valore della variabile Integer intX: se è maggiore di 10, viene effettuo un ulteriore controllo: se intX è maggiore di 100, viene posto intY = intX/2, altrimenti intY = intX+10; se invece intX non è maggiore di 10 (cioè intX <= 10), Visual Basic controlla se intX > 5: in questo caso si pone intY = 0. Se infine intX <= 5, la variabile booleana bValue viene imposta a True. E' chiaro quindi che l'istruzione If…Then permette di effettuare confronti flessibili e ramifici per determinare quali istruzioni è opportuno eseguire.
Ma non basta: le condizioni da valutare possono essere espressioni anche molto complesse, utilizzando gli operori logici che abbiamo visto nella lezione precedente; ad esempio:
If ((intX> 10 And intX < 100) Or _
(intX > 200 And intX<= intY / 3)) Imp _
bValue = False Then
...
End If
La valutazione della condizione segue le regole generali per l'uso delle parentesi: dapprima viene confronto il valore di intX con 10 e con 100: se è compreso tra questi due valori (esclusi gli estremi), l'espressione nella prima sotto-parentesi sarà True;
poi intX viene confronto con 200 e con intY / 3: se è compreso tra questi due valori, la seconda sotto-parentesi sarà True; se almeno una delle due sotto-parentesi è True, anche la super-parentesi sarà True. Infine viene confronta la variabile bValue con il valore False: se bValue è False, l'espressione "bValue = False" sarà True, e quindi lo sarà anche l'intera condizione valuta dalla If (infti l'operore Imp restituisce sempre True se la seconda espressione è True: v.lezione precedente); se invece bValue = True, la seconda espressione sarà False: in tal caso l'intera condizione sarà True solo se anche la super-parentesi sarà False. Un esempio dovrebbe chiarire tutto: supponiamo che intX = 90, intY = 600, bValue = True; allora avremo:
If ((True And True) Or (False And True)) Imp False Then
che corrisponde a:
If (True Or False) Imp False Then
che corrisponde a:
If True Imp False Then
Siccome True Imp False restituisce False, le istruzioni successive a Then non saranno eseguite. Vi faccio notare che Visual Basic valuta sempre tutte le espressioni, anche se in qualche caso è inutile; supponiamo ad esempio di avere:
If intX > 10 And intX < 20 Then
con intX = 5; sapendo che intX > 10 è False e che il valore della condizione dipende dall'operore And, si potrebbe anche fare a meno di confrontare intX con 20, perché qualunque sia il risulto di questo confronto la condizione sarà comunque False, do che la prima espressione è False e l'And restituisce True solo se entrambe le espressioni sono True.
In effetti alcuni linguaggi più "intelligenti" (ad esempio il C++) evitano i confronti inutili; Visual Basic invece li fa sempre tutti, e nel caso di controlli pesanti bisognerebbe tenerne conto, facendo in modo che vengano valute solo le espressioni strettamente necessarie. Ad es., l'istruzione:
If intX > 10 And intX < 20 Then
intX = intX * 2
End If
potrebbe essere modifica in questo modo:
If intX > 10 Then
if intX < 20 Then
IntX = IntX * 2
End If
End If
In questo modo, se intX=5, Visual Basic non perde tempo a confrontare intX con 20, perché già la prima condizione è falsa, e quindi il secondo blocco If sarà ignoro.