Finora abbiamo visto come vengono valute le espressioni per verificare se sono true o false, e negli esempi abbiamo sempre uso dei confronti: in realtà questo spesso non è necessario, anzi è ridondante; consideriamo ad esempio questa condizione:
If frmAbout.Visible = True Then
La condizione risulta true se frmAbout.Visible è True, risulta False se frmAbout.Visible è False: in parole povere il valore della condizione è identico al valore di frmAbout.Visible; pertanto non c'è alcun bisogno di effettuare il confronto, ma sarà sufficiente scrivere:
If frmAbout.Visible Then
Infti la condizione valuta dalla if deve essere interpretabile come un valore Boolean, e frmAbout.Visible è proprio un valore Boolean che può quindi essere uso direttamente come una condizione. E se avessimo bisogno di confrontare questa proprietà con False? E' semplicissimo, basta fare:
If Not frmAbout.Visible = True Then
Se il form non è visible, la condizione sarà verifica e le istruzioni saranno eseguite. Una cosa simile si può fare anche con i valori numerici: bisogna infti sapere che i valori True e False in realtà non sono altro che numeri, e precisamente la parola chiave true corrisponde al valore -1 e la parola chiave false corrisponde al valore 0. Prove infti a creare un nuovo progetto, a inserire un CommandButton e a scrivere queste righe nella routine dell'evento click:
Dim blnProva As Boolean
blnProva = -1
Debug.Print blnProva
blnProva = 0
Debug.Print blnProvaa
Una volta avvio il progetto, quando premerete il pulsante vedrete nella finestra immedia:
True
False
Ora prove a scrivere, al posto di "blnProva = -1", "blnProva = 34" e riavvie il progetto: ripremendo il pulsante, vedrete ancora nella finestra immedia:
True
False
Questo accade perché, quando un valore numerico viene convertito in Boolean, esso è interpreto da VB come true se è diverso da 0, anche se il valore predefinito di true è -1, ed è interpreto come false quando è uguale a 0.
Analogamente, è possibile convertire un valore Boolean in un valore numerico:
Dim intProva As Integer
intProva = True
Debug.Print intProva
intProva = False
Debug.Print intProva
Questa volta premendo sul pulsante vedrete nella finestra immedia:
-1
0
Insomma, le parole chiave True e False funzionano quasi come delle variabili numeriche il cui valore è rispettivamente -1 e 0: infti la guida in linea di Visual Basic afferma che le variabili Boolean sono memorizze come variabili numeriche a 16 bit (2 byte), ossia come gli Integer. Ma se un numero può essere direttamente interpreto come un valore Boolean, non c'è bisogno di scrivere, ad esempio:
If intProva <> 0 Then '<> significa "diverso da"
ma si può scrivere direttamente:
If intProva Then
La conversione tra valori numerici e Booleani non è invece immedia quando si usano gli operori logici; proviamo ad esempio a scrivere:
If 4 And 2 Then
Si potrebbe pensare che, essendo 4 <> 0 e 2 <> 0, e quindi entrambi True, la condizione risulti verifica perché True And True = True; invece no.
Il fto è che gli operori logici, se applici a valori o variabili numeriche, eseguono un confronto "bit a bit" dei due operandi. Qui occorre fare una breve digressione sui bit e sui byte. Un bit è l'unità fondamentale su cui si basa il funzionamento di un computer, e può assumere solo due valori: 0 e 1; questa carteristica deriva dal fto che i supporti fisici di memorizzazione dei di possono assumere solo due sti stabili: possono cioè essere magnetizzi in senso positivo oppure negivo. Pertanto i processori eseguono i calcoli in base al sistema numerico binario, cioè in base alle potenze di 2 (perché 2 sono i valori possibili: 0 e 1), mentre noi utilizziamo il sistema decimale, cioè in base alle potenze di 10 (perché 10 sono le cifre da 0 a 9). Solitamente come unità di misura della capacità di memoria dei computer viene preso il byte, che è semplicemente un gruppo di 8 bit contigui: se avessimo un numero di 8 cifre decimali questo sarebbe compreso tra 0 e
10 ^ 8 - 1 = 100.000.000 - 1 = 99.999.999
Invece un numero di 8 cifre binarie (cioè un byte) è compreso tra 0 e
2 ^ 8 - 1 = 256 - 1 = 255
infti il tipo di di byte memorizza proprio un numero compreso tra 0 e 255 (v.lez. 1). Un numero di 16 bit (cioè 2 byte, come un integer), ad es., è compreso tra 0 e
2 ^ 16 - 1 = 65535
e così via (il motivo per cui il tipo integer può assumere valori tra -32768 e +32767 lo vedremo un'altra volta). Viceversa, il numero 206 può essere scomposto, in base al sistema decimale, in
200 + 0 + 6 = 2 * 10 ^ 2 + 0 * 10 ^ 1 + 6 * 10 ^ 0
numerando ogni cifra a partire da destra (cioè considerando 6 la prima cifra, 0 la seconda cifra, 2 la terza cifra) potremo scrivere
206 = 2 * 10 ^ (3 - 1) + 0 * 10 ^ (2 - 1) + 6 * 10 ^ (1 - 1)
In altri termini, ogni numero può essere espresso come la somma dei prodotti di ogni cifra per 10 elevo alla posizione occupa da quella cifra meno uno. Questa spiegazione può sembrare molto complica, ma è importante per capire come convertire un numero decimale in base binaria e un numero binario in base decimale; supponiamo ad es. di avere il numero binario 101: per sapere a quale numero decimale corrisponde, dovremo moltiplicare 1 (la prima cifra da destra) per 2^ (1 - 1); poi dovremo moltiplicare 0 (la seconda cifra) per 2 ^ (2 - 1) e infine 1 (la terza cifra da destra) per 2 ^ (3 - 1). In parole povere:
101 = 1 * 2 ^ (3 - 1) + 0 * 2 ^ (2 - 1) + 1 * 2 ^ (1 - 1) =
= 1 * 2 ^ 2 + 0 + 1 * 2 ^ 0 =
= 4 + 0 + 1 =
= 5
Se invece dovessimo convertire un numero decimale in binario, dovremmo dividere il numero per 2: se il risulto è intero, scriviamo 0, altrimenti 1; poi prendiamo la parte intera della divisione e la dividiamo ancora per 2, e procediamo in questo modo finchè non resta 0; infine si ribalta la serie di 0 e 1 che abbiamo scritto. Ad eempio, per convertire il numero 9 si procede così:
9 / 2 = 4,5
4 / 2 = 2
2 / 2 = 1
1 / 2 = 0,5
0 / 2 = 0 1
0
0
1
0
La successione che abbiamo ottenuto è quindi 10010, che ribalta diventa: 01001, cioè 1001: infti
1001 = 1 * 2 ^ (4 - 1) + 0 + 0 + 1 * 2(1 - 1) = 8 + 1 = 9
Ora torniamo al confronto bit a bit. Questo confronto, come dice il termine, prende in considerazione ogni singolo bit di un operando e lo confronta con il bit che occupa la stessa posizione nell'altro operando: il risulto del confronto sarà determino dall'operore logico utilizzo, tenendo conto che il bit 0 corrisponde a False e il bit 1 corrisponde a True. Supponiamo ad eempio. di fare 23 And 200:
00010111 (rappresentazione binaria di 23)
11001000 (rappresentazione binaria di 200)
--------
00000000 risulto dell'And bit a bit
Il risulto è 0 perché, per ogni posizione, i bit corrispondenti dei due operandi non sono mai contemporaneamente 1 e 1 (cioè True e True). Facciamo altri esempi:
13 Or 17:
00001101 (13)
00010001 (17)
--------
00011101 (29)
Not 55::
00110111 (55)
----------
11001000 (200)
Nel caso del Not x, vi faccio notare che il risulto è sempre 255 - x, ovvero il valore massimo che può assumere un byte meno il valore dell'operando (nel caso in cui x sia un do di tipo byte).
Note sul corso:
I diritti di ognuna delle lezioni presente in queste pagine appartengono all'autore Giorgio Abraini. La riproduzione e la divulgazione delle stesse sono consentite solamente dietro citazione di fonte ed autore.
Per suggerimenti, consigli o richieste conttare giorgio102@libero.it.
Fonte : VBItalia.it