Definizione
di VBScript
In Microsoft
Visual Basic Scripting Edition, il linguaggio di programmazione più recente
della famiglia Visual Basic, sono disponibili funzioni per includere script in
un'ampia gamma di ambienti diversi, tra cui script client Web in Microsoft
Internet Explorer e script server Web in Microsoft Internet Information Server.
Se si
conosce già Visual Basic o Visual Basic, Applications Edition, VBScript
risulterà estremamente semplice. In caso contrario, la fase di apprendimento di
VBScript consentirà di acquisire le conoscenze sufficienti per imparare in modo
semplice a programmare con tutti i linguaggi di programmazione della famiglia
Visual Basic. Queste pagine Web includono informazioni complete su VBScript, ma
non istruzioni sulle tecniche di programmazione. Per l'apprendimento delle
tecniche di programmazione, vedere i volumi della serie Passo per passo di
Microsoft Press.
VBScript
comunica con applicazioni host tramite la tecnologia ActiveX™ Scripting, grazie
alla quale nei browser e in altre applicazioni host non è necessario scrivere
codice integrativo speciale per ciascun componente script. Questa tecnologia
consente a un host di compilare script, di ottenere e richiamare punti di
ingresso e di gestire lo spazio dei nomi disponibile per lo sviluppatore.
Grazie alla tecnologia ActiveX Scripting i fornitori di linguaggi possono
creare componenti run-time standard per le tecniche di script. Microsoft sta
inoltre lavorando assieme a vari gruppi Internet per definire uno standard
ActiveX Scripting che consenta di rendere intercambiabili i vari moduli di
gestione per script. La tecnologia ActiveX Scripting viene utilizzata in
Microsoft® Internet Explorer e in Microsoft® Internet Information Server.
Gli
sviluppatori possono concedere gratuitamente licenze per l'implementazione di
codice di VBScript da utilizzare nei prodotti creati. Microsoft sta creando
implementazioni binarie di VBScript per l'API di Windows® a 32 e a 16 bit e per
Macintosh®. VBScript è integrato con i browser Web. È inoltre possibile
utilizzare VBScript e ActiveX Scripting come linguaggi di script di tipo
generale in altre applicazioni.
È possibile
utilizzare l'elemento SCRIPT per aggiungere codice VBScript a una pagina HTML.
Tag
<SCRIPT>
Il codice
VBScript viene inserito all'interno dei tag <SCRIPT>. Una routine per la
verifica di una data di consegna, ad esempio, appare nel modo seguente:
<SCRIPT
LANGUAGE="VBScript">
<!--
Function
CanDeliver(Dt)
CanDeliver =
(CDate(Dt) - Now()) > 2
End Function
-->
</SCRIPT>
Il codice è
racchiuso tra tag <SCRIPT> iniziali e finali. L'attributo LANGUAGE indica
il linguaggio di script utilizzato. Dato che i browser supportano anche altri
linguaggi di script, è necessario indicare quello utilizzato. Si noti inoltre
che la funzione CanDeliver è racchiusa tra i tag di commento, ovvero <!-- e
-->, in modo che il codice non venga visualizzato nei browser che non
supportano il tag <SCRIPT>.
Dato che
l'esempio corrisponde a una funzione generale non collegata a nessun controllo
di form specifico, è possibile includervi la sezione HEAD della pagina:
<HTML>
<HEAD>
<TITLE>Immissione
ordine</TITLE>
<SCRIPT
LANGUAGE="VBScript">
<!--
Function
CanDeliver(Dt)
CanDeliver =
(CDate(Dt) - Now()) > 2
End Function
-->
</SCRIPT>
</HEAD>
<BODY>
...
È possibile
utilizzare i blocchi SCRIPT in qualsiasi punto della pagina HTML, sia nella
sezione BODY che nella sezione HEAD. È tuttavia consigliabile inserire tutto il
codice script di utilizzo generale nella sezione HEAD, in modo che l'intero
codice sia incluso in un'unica posizione. Questa operazione consente di leggere
e decifrare tutto il codice prima di essere utilizzato da una chiamata
dall'interno della sezione BODY.
Nel caso di
form, si consiglia tuttavia di fornire codice script su una stessa riga per
rispondere agli eventi di oggetti contenuti nel form. È, ad esempio, possibile
incorporare codice script per rispondere alla pressione di un pulsante in un
form:
<HTML>
<HEAD>
<TITLE>Verifica
eventi dei pulsanti</TITLE>
</HEAD>
<BODY>
<FORM
NAME="Form1">
<INPUT
TYPE="Button" NAME="Button1" VALUE="Click">
<SCRIPT
FOR="Button1" EVENT="onClick" LANGUAGE="VBScript">
MsgBox
"Pulsante premuto"
</SCRIPT>
</FORM>
</BODY>
</HTML>
Quasi tutto
il codice verrà visualizzato nelle routine Sub o Function e verrà richiamato
solo quando il codice scritto ne determinerà l'esecuzione. È tuttavia possibile
scrivere codice VBScript esternamente alle routine, ma sempre all'interno di un
blocco SCRIPT. Questo codice viene eseguito una sola volta, quando la pagina
HTML viene caricata. In questo modo, è possibile inizializzare i dati o
modificare dinamicamente l'aspetto della pagina Web quando viene caricata.
Descrizione dei tipi di dati di VBScript
In VBScript
è disponibile solo il tipo di dati Variant, un tipo di dati speciale che, a
seconda della modalità in cui viene utilizzato, può includere vari tipi di informazioni.
Il tipo di dati Variant, essendo l'unico disponibile, è il tipo di dati
restituito da tutte le funzioni di VBScript.
Nella forma
più semplice una variabile Variant può includere informazioni numeriche o
stringhe. È equivalente a un numero se utilizzata in un contesto numerico e a
una stringa se utilizzata in un contesto stringa. Ciò significa che, se si
lavora con dati simili a valori numerici, VBScript interpreterà tali dati come
numeri e verranno eseguite le operazioni più appropriate. In modo analogo, se
si lavora con dati che possono essere solo stringhe, essi verranno gestiti come
dati stringa. È tuttavia possibile fare in modo che i numeri vengano gestiti
come stringhe racchiudendoli tra virgolette doppie (" ").
Sottotipi di variabili Variant
Oltre alla
semplice classificazione di valore numerico o stringa, con le variabili Variant
è possibile definire ulteriori distinzioni in base alla natura specifica delle
informazioni numeriche. Se, ad esempio, si utilizzano informazioni numeriche
che rappresentano una data o un orario insieme ad altri dati relativi alla data
o all'orario, il risultato verrà sempre espresso come data o come orario. È
tuttavia possibile utilizzare informazioni numeriche di vario tipo con
dimensioni che vanno dai valori booleani ai numeri in virgola mobile di grandi
dimensioni. Le varie categorie di informazioni che possono essere incluse in
variabili Variant sono definite sottotipi. Nella maggior parte dei casi, i dati
inseriti in variabili Variant vengono automaticamente gestiti nel modo più
adatto.
Nella
tabella seguente sono elencati i possibili sottotipi di variabili Variant.
Sottotipo |
Descrizione |
Empty |
Variabile Variant non inizializzata. Il valore
è 0 nel caso di variabili numeriche e una stringa di lunghezza zero
("") nel caso di variabili stringa. |
Null |
Variabile Variant che include dati non validi
inseriti volutamente. |
Boolean |
|
Byte |
Contiene
un intero compreso tra 0 e 255. |
Integer |
Contiene
un intero compreso tra -32.768 e 32.767. |
Currency |
Contiene
un valore compreso tra -922.337.203.685.477,5808 e 922.337.203.685.477,5807. |
Long |
Contiene
un intero compreso tra -2.147.483.648 e 2.147.483.647. |
Single |
Contiene
un numero in virgola mobile e precisione singola compreso tra -3,402823E38 e
-1,401298E-45 per valori negativi e tra 1,401298E-45 e 3,402823E38 per valori
positivi. |
Double |
Contiene
un numero in virgola mobile e precisione doppia compreso tra
-1,79769313486232E308 e -4,94065645841247E-324 per valori negativi e tra
4,94065645841247E-324 e 1,79769313486232E308 per valori positivi. |
Date (Time) |
Contiene
un numero che rappresenta una data compresa tra l'1 gennaio dell'anno 100 e
il 31 dicembre del 9999. |
String |
Contiene una
stringa di lunghezza variabile composta da un massimo di circa 2 miliardi di
caratteri. |
Object |
Contiene
un oggetto. |
Error |
Contiene
un numero di errore. |
Per le
conversioni tra sottotipi è disponibile un'ampia gamma di funzioni di
conversione. È inoltre possibile utilizzare la funzione VarType che restituisce informazioni sulla modalità di
memorizzazione dei dati in una variabile Variant.
Una costante
è un nome significativo non soggetto a modifiche utilizzato in sostituzione di
un numero o di una stringa. In VBScript è possibile definire numerose costanti
intrinseche. Per ulteriori informazioni sulle costanti intrinseche, consultare
Riferimento al linguaggio VBScript.
Per creare costanti
in VBScript, è necessario utilizzare l'istruzione Const con cui vengono create
costanti stringa o numeriche con nomi significativi, che è quindi possibile
associare a valori letterali e utilizzare negli script. Ad esempio:
Const
MyString = "Questa è la mia stringa."
Const MyAge
= 49
Nell'esempio
il valore letterale stringa è racchiuso tra virgolette doppie ("), il modo
più chiaro per contraddistinguere i valori stringa dai valori numerici. È
possibile rappresentare i valori letterali di data e ora racchiudendoli tra
simboli di cancelletto (#), ad esempio:
Const
CutoffDate = #6-1-97#
È
consigliabile adottare una convenzione di denominazione in modo da
contraddistinguere le costanti dalle variabili ed evitare quindi di riassegnare
valori alle costanti durante l'esecuzione dello script. È possibile, ad
esempio, utilizzare il prefisso "vb" o "con" per i nomi di
costanti o assegnare nomi in maiuscolo. In entrambi i casi, è buona norma
contraddistinguere le costanti dalle variabili per evitare possibili confusioni
in script più complessi.
In VBScript
sono disponibili tutti gli operatori aritmetici, di confronto, di
concatenemanto e logici.
Precedenza tra operatori
Quando in
un'espressione si eseguono varie operazioni, ciascuna parte viene valutata e
risolta secondo un ordine specifico definito precedenza tra operatori. Per
ignorare l'ordine di precedenza in modo che determinate parti di un'espressione
vengano valutate prima di altre, è necessario utilizzare le parentesi. Le
operazioni racchiuse tra parentesi vengono sempre valutate per prime.
All'interno delle parentesi tuttavia viene mantenuta la normale precedenza tra
operatori.
Nelle espressioni che includono operatori di categorie diverse, vengono
innanzitutto valutati gli operatori aritmetici, quindi gli operatori di
confronto e infine gli operatori logici. Gli operatori di confronto hanno la
stessa precedenza, ovvero vengono valutati da sinistra a destra nello stesso
ordine in cui sono stati specificati. Gli operatori aritmetici e logici vengono
valutati in base all'ordine di precedenza indicato nella tabella seguente.
Aritmetici |
Di confronto |
Logici
|
|||
Descrizione |
Simbolo
|
Descrizione |
Simbolo
|
Descrizione |
Simbolo
|
^ |
= |
Not |
|||
- |
<> |
And |
|||
* |
< |
Or |
|||
/ |
> |
Xor |
|||
\ |
<= |
Eqv |
|||
Mod |
>= |
Imp |
|||
+ |
Is |
|
|
||
- |
|
|
|
|
|
& |
|
|
|
|
Se in
un'espressione vengono eseguite la moltiplicazione e la divisione oppure
l'addizione e la sottrazione, ciascuna operazione verrà valutata nello stesso
ordine in cui è indicata da sinistra verso destra.
L'operatore di concatenamento di stringhe (&) non è un operatore
aritmetico, ma per quanto riguarda la precedenza segue tutti gli operatori
aritmetici e precede tutti gli operatori di confronto. L'operatore Is è un
operatore di confronto per riferimenti a oggetti, ovvero non esegue il
confronto degli oggetti o dei corrispondenti valori, ma verifica semplicemente
se due riferimenti sono relativi allo stesso oggetto.
È possibile
controllare il flusso di script tramite istruzioni condizionali e istruzioni di ciclo. Con le istruzioni
condizionali è possibile scrivere codice VBScript che consente di prendere
decisioni e ripetere azioni. In VBScript sono disponibili le seguenti
istruzioni
condizionali:
If...Then...Else
Select Case
Istruzione
If...Then...Else
L'istruzione
If...Then...Else consente di valutare se una condizione è True o False e, a
seconda del risultato, di specificare una o più
istruzioni
da eseguire. In genere la condizione corrisponde a un'espressione in cui due
valori o due variabili vengono confrontati
tramite un
operatore di confronto. Per informazioni sugli operatori di confronto, vedere
Operatori di confronto. Le istruzioni
If...Then...Else
possono essere nidificate in un numero qualsiasi di livelli di
nidificazione.Esecuzione di istruzioni quando una condizione è True Per eseguire una sola istruzione quando una
condizione è True, è necessario utilizzare la sintassi a riga singola
dell'istruzione
If...Then...Else,
come illustrato nell'esempio riportato di seguito.
Nell'esempio
la parola chiave Else viene omessa.
Sub
FixDate()
Dim myDate
myDate =
#2/13/95#
If myDate
< Now Then myDate = Now
End Sub
Per eseguire
più righe di codice, è necessario utilizzare la sintassi a righe multiple o a
blocco, in cui è inclusa l'istruzione End If, come
illustrato
nell'esempio riportato di seguito.
Sub
AlertUser(value)
If value = 0
Then
AlertLabel.ForeColor
= vbRed
AlertLabel.Font.Bold
= True
AlertLabel.Font.Italic
= True
End If
End Sub
Esecuzione
di istruzioni specifiche quando una determinata condizione è True e di altre
istruzioni quando la condizione è False
È possibile
utilizzare un'istruzione If...Then...Else per definire due blocchi di
istruzioni da eseguire l'uno quando la condizione è True e
l'altro
quando la condizione è False.
Sub
AlertUser(value)
If value = 0
Then
AlertLabel.ForeColor
= vbRed
AlertLabel.Font.Bold
= True
AlertLabel.Font.Italic
= True
Else
AlertLabel.Forecolor
= vbBlack
AlertLabel.Font.Bold
= False
AlertLabel.Font.Italic
= False
End If
End Sub
Aggiungendo
nell'istruzione If...Then...Else proposizioni ElseIf, è possibile scegliere tra
situazioni diverse. La funzionalità dell'istruzione If...Then...Else viene in
tal modo estesa consentendo di controllare il flusso del programma in base a
possibilità diverse.
Esempio:
Sub
ReportValue(value)
If value = 0
Then
MsgBox value
ElseIf value
= 1 Then
MsgBox value
ElseIf value
= 2 then
Msgbox value
Else
Msgbox
"Valore non compreso nell'intervallo valido."
End If
Per fornire
più situazioni diverse, è possibile aggiungere il numero necessario di
proposizioni ElseIf. Un utilizzo eccessivo di queste proposizioni può tuttavia
creare un codice poco chiaro e contorto. Un metodo alternativo migliore
consiste nell'utilizzare l'istruzione
Select Case.
Istruzione
Select Case
La struttura
Select Case rappresenta un'alternativa all'istruzione
If...Then...ElseIf
per la selezione di un blocco di istruzioni specifico tra più blocchi diversi.
La funzione dell'istruzione Select
Case è
simile a quella dell'istruzione If...Then...Else, con la differenza tuttavia
che il codice risulta più efficiente e di più facile lettura.
Una
struttura Select Case include una singola espressione di testo valutata una
sola volta all'inizio della struttura stessa. Il risultato dell'espressione
viene quindi confrontato con i valori di ciascun blocco Case della struttura.
Se viene individuata una corrispondenza,
il blocco di
istruzioni associato al blocco Case specifico verrà eseguito.
Select Case
Document.Form1.CardType.Options(SelectedIndex).Text
Case
"MasterCard"
DisplayMCLogo
ValidateMCAccount
Case
"Visa"
DisplayVisaLogo
ValidateVisaAccount
Case
"American Express"
DisplayAMEXCOLogo
ValidateAMEXCOAccount
Case Else
DisplayUnknownImage
PromptAgain
End Select
A differenza
della struttura Select Case con cui un'espressione viene valutata una sola
volta all'inizio della struttura stessa, la struttura If...Then...ElseIf consente
di valutare un'espressione diversa per ciascuna istruzione ElseIf. È possibile
sostituire una struttura
If...Then...ElseIf
con una struttura Select Case solo se con ciascuna istruzione ElseIf viene
valutata la stessa espressione. esecuzione di cicli nel codice
L'esecuzione
di cicli consente di eseguire ripetutamente un gruppo di istruzioni. In alcuni
cicli le istruzioni vengono ripetute fino a quando una condizione risulta
False, mentre in altri vengono ripetute fino a quando una condizione risulta
True. Esistono inoltre cicli in cui le istruzioni vengono ripetute un numero
specifico di volte.In VBScript sono disponibili le seguenti istruzioni per
l'esecuzione di cicli:
Do...Loop: le istruzioni vengono ripetute fino
a quando una condizione risulta True.
While...Wend: le istruzioni vengono ripetute fino
a quando una condizione risulta True.
For...Next: le istruzioni vengono ripetute il
numero di volte specificato da un contatore.
For Each...Next: un gruppo di istruzioni viene
ripetuto per ciascun elemento incluso nell'insieme di una matrice.
È possibile
utilizzare le istruzioni Do...Loop per eseguire un blocco di istruzioni un
numero indefinito di volte. Le istruzioni vengono ripetute mentre una
condizione è True oppure fino a quando risulta True. Ripetizione di istruzioni
mentre una condizione è TruePer verificare una condizione in un'istruzione
Do...Loop, è necessario utilizzare la parola chiave While. La verifica può
essere eseguita prima dell'inizio del ciclo, come illustrato nell'esempio
ChkFirstWhile riportato di seguito, oppure dopo almeno una esecuzione del
ciclo, come illustrato nell'esempio ChkLastWhile. Nella routine ChkFirstWhile,
se myNum è impostato su 9 anziché su 20, le istruzioni incluse nel ciclo non
verranno mai eseguite. Nella routine ChkLastWhile, le istruzioni incluse nel
ciclo vengono eseguite una sola volta, in quanto la condizione è già False.
Sub
ChkFirstWhile()
Dim counter,
myNum
counter = 0
myNum = 20
Do While
myNum > 10
myNum =
myNum - 1
counter =
counter + 1
Loop
MsgBox
"Il ciclo ha eseguito " & counter & " ripetizioni."
End Sub
Sub
ChkLastWhile()
Dim counter,
myNum
counter = 0
myNum = 9
Do
myNum =
myNum - 1
counter =
counter + 1
Loop While
myNum > 10
MsgBox
"Il ciclo ha eseguito " & counter & " ripetizioni."
End Sub
Ripetizione
di un'istruzione fino a quando una condizione risulta True
Per
verificare una condizione in un'istruzione Do...Loop, è possibile utilizzare la
parola chiave Until in due modi diversi, ovvero la verifica può essere eseguita
prima dell'inizio del ciclo, come illustrato nell'esempio ChkFirstWhile
riportato di seguito, oppure dopo almeno una esecuzione del ciclo, come
illustrato nell'esempio ChkLastWhile. Il ciclo viene ripetuto finché la condizione
risulta False.
Sub
ChkFirstUntil()
Dim counter,
myNum
counter = 0
myNum = 20
Do Until
myNum = 10
myNum =
myNum - 1
counter =
counter + 1
Loop
MsgBox
"Il ciclo ha eseguito " & counter & " ripetizioni."
End Sub
Sub
ChkLastUntil()
Dim counter,
myNum
counter = 0
myNum = 1
Do
myNum =
myNum + 1
counter =
counter + 1
Loop Until
myNum = 10
MsgBox
"Il ciclo ha eseguito " & counter & " ripetizioni."
End Sub
Per uscire
da una struttura Do...Loop, è possibile utilizzare l'istruzione Exit Do. Dato
che l'uscita da tale struttura viene in genere eseguita solo in determinate
situazioni, ad esempio per evitare la ripetizione infinita di un ciclo,
l'istruzione Exit Do deve essere inclusa nel blocco di istruzioni True di
un'istruzione If...Then...Else. Se la condizione è False, il ciclo viene
eseguito normalmente.
Nell'esempio
riportato di seguito, a myNum viene assegnato un valore in base al quale viene
creato un ciclo infinito. L'istruzione If...Then...Else consente di verificare
questa condizione, impedendo pertanto un'esecuzione all'infinito.
Sub
ExitExample()
Dim counter,
myNum
counter = 0
myNum = 9
Do Until
myNum = 10
myNum =
myNum - 1
counter =
counter + 1
If myNum
< 10 Then Exit Do
Loop
MsgBox
"Il ciclo ha eseguito " & counter & " ripetizioni."
End Sub
L'istruzione
While...Wend deve essere utilizzata da utenti che ne conoscono la corretta
applicazione. Dato che si tratta di un'istruzione poco flessibile, è
consigliabile utilizzare invece l'istruzione Do...Loop.
L'istruzione
For...Next consente di eseguire un blocco di istruzioni un numero specifico di
volte. Nel caso di cicli, è necessario utilizzare una variabile contatore il
cui valore viene aumentato o diminuito a ogni ripetizione del ciclo.
Nella
routine riportata di seguito, ad esempio, la routine MyProc viene eseguita 50
volte. L'istruzione For specifica la variabile contatore x e il corrispondente
valore iniziale e finale. L'istruzione Next consente di aumentare la variabile
contatore con incrementi di una unità.
Sub
DoMyProc50Times()
Dim x
For x = 1 To
50
MyProc
Next
End Sub
La parola
chiave Step consente di aumentare o diminuire la variabile contatore del valore
specificato. Nell'esempio riportato di seguito la variabile contatore viene
incrementata di due unità a ogni ripetizione del ciclo. Al completamento del
ciclo, il totale corrisponde alla somma di 2, 4, 6, 8 e 10.
Sub
TwosTotal()
Dim j, total
For j = 2 To
10 Step 2
total =
total + j
Next
MsgBox
"Il totale è " & total
End Sub
Per
diminuire la variabile contatore, è necessario utilizzare un valore Step
negativo specificando un valore finale minore del valore iniziale. Nell'esempio
riportato di seguito, la variabile contatore myNum viene diminuita di due unità
a ogni ripetizione del ciclo. Al completamento del ciclo, il totale corrisponde
alla somma di 16, 14, 12, 10, 8, 6, 4 e 2.
Sub
NewTotal()
Dim myNum,
total
For myNum =
16 To 2 Step -2
total =
total + myNum
Next
MsgBox
"Il totale è " & total
End Sub
Per uscire
da un'istruzione For...Next prima che il valore del contatore abbia raggiunto
il valore finale, è necessario utilizzare l'istruzione Exit For. Dato che
l'uscita da un'istruzione For...Next viene in genere eseguita solo in
determinate situazioni, ad esempio quando si verifica un errore, l'istruzione
Exit For deve essere inclusa nel blocco di istruzioni True di un'istruzione
If...Then...Else. Se la condizione è False, il ciclo viene eseguito
normalmente.
L'istruzione
For Each...Next è simile a For...Next, con la sola differenza che le istruzioni
non vengono ripetute il numero di volte specificato, ma per ciascun elemento di
un insieme di oggetti o per ciascun elemento di una matrice. Ciò risulta
particolarmente utile quando non si conosce il numero di elementi di un
insieme.
Nell'esempio
di codice HTML riportato di seguito, il contenuto di un oggetto Dictionary
viene utilizzato per inserire testo in varie caselle di testo.
<HTML>
<HEAD><TITLE>Forms
and Elements</TITLE></HEAD>
<SCRIPT
LANGUAGE="VBScript">
<!--
Sub
cmdChange_OnClick
Dim d 'Crea
una variabile
Set d =
CreateObject("Scripting.Dictionary")
d.Add
"0", "Atene" 'Aggiunge alcune chiavi ed elementi
d.Add
"1", "Belgrado"
d.Add
"2", "Cairo"
For Each I
in d
Document.frmForm.Elements(I).Value
= D.Item(I)
Next
End Sub
-->
</SCRIPT>
<BODY>
<CENTER>
<FORM
NAME="frmForm"
<Input
Type = "Text"><p>
<Input
Type = "Text"><p>
<Input
Type = "Text"><p>
<Input
Type = "Text"><p>
<Input
Type = "Button" NAME="cmdChange" VALUE="Fare clic
qui"><p>
</FORM>
</CENTER>
</BODY>
</HTML>
In VBScript
sono disponibili due tipi di routine, ovvero le routine Sub e le routine
Function.
Una routine
Sub è una serie di istruzioni VBScript incluse tra le istruzioni Sub ed End Sub
che eseguono azioni senza restituire alcun valore. In una routine Sub è
possibile specificare argomenti, ovvero costanti, variabili o espressioni
passate dalla routine che sta eseguendo una chiamata. Se non si specifica alcun
argomento, nella corrispondente istruzione Sub è necessario includere parentesi
vuote ().
Nella
routine Sub riportata di seguito vengono utilizzate le due funzioni VBScript
intrinseche, ovvero incorporate, MsgBox e InputBox, che consentono di
richiedere informazioni all'utente. Viene quindi visualizzato il risultato di
un calcolo basato sulle informazioni fornite ed eseguito in una routine
Function creata in VBScript, come descritto nella sezione successiva.
Sub
ConvertTemp()
temp =
InputBox("Immettere la temperatura in gradi Fahrenheit.", 1)
MsgBox
"La temperatura è pari a " & Celsius(temp) & " gradi
C."
End Sub
Una routine
Function è una serie di istruzioni VBScript incluse tra le istruzioni Function
ed End Function. È simile a una routine Sub, ma a differenza di questa può
restituire un valore. In una routine Function è possibile specificare
argomenti, ovvero costanti, variabili o espressioni passate alla routine dalla
routine chiamante. Se non si specifica alcun argomento, nella corrispondente
istruzione Function è necessario includere parentesi vuote. Una routine
Function restituisce un valore quando si assegna un valore al nome della
routine in una o più istruzioni. Il tipo restituito di una routine Function è
sempre Variant.
Nell'esempio
riportato di seguito, la funzione Celsius consente di eseguire la conversione
da Fahrenheit a Celsius. Quando la funzione viene richiamata nella routine Sub
ConvertTemp, viene passata alla funzione una variabile contenente il valore
dell'argomento. Il risultato del calcolo viene quindi restituito alla routine
che ha eseguito la chiamata e visualizzato in una finestra di messaggio.
Sub
ConvertTemp()
temp =
InputBox("Immettere la temperatura in gradi Fahrenheit.", 1)
MsgBox
"La temperatura è pari a " & Celsius(temp) & " gradi
C."
End Sub
Function
Celsius(fDegrees)
Celsius =
(fDegrees - 32) * 5 / 9
End Function
I dati
vengono passati alla routine tramite argomenti che fungono da segnaposto per i
dati stessi. Agli argomenti è possibile assegnare un nome valido per le
variabili. Quando si crea una routine utilizzando l'istruzione Sub o Function,
è necessario far seguire il nome della routine da parentesi, all'interno delle
quali vengono inseriti gli argomenti separati da una virgola. Nell'esempio
seguente fDegrees è il segnaposto del valore da convertire passato alla
funzione Celsius:
Function
Celsius(fDegrees)
Celsius =
(fDegrees - 32) * 5 / 9
End Function
Per ottenere
dati da una routine, è necessario utilizzare routine Function che, a differenza
delle routine Sub, possono restituire un valore.
Routine Sub
e Function nel codice
Per
utilizzare routine Function nel codice, è necessario includerle a destra delle
assegnazioni di variabili oppure in un'espressione. Ad esempio:
Temp =
Celsius(fDegrees)
or
MsgBox
"La temperatura in gradi Celsius è pari a " & Celsius(fDegrees)
& " gradi."
Per
richiamare una routine Sub da un'altra routine, è sufficiente specificarne il
nome insieme ai valori degli argomenti obbligatori, separati da una virgola.
L'istruzione Call non è obbligatoria. Se viene utilizzata, è necessario
racchiudere gli eventuali argomenti tra parentesi.
Nell'esempio
seguente vengono eseguite due chiamate alla routine MyProc. Sebbene
l'istruzione Call sia utilizzata nel codice di una sola chiamata, entrambe le
chiamate eseguono la stessa operazione.
Call
MyProc(primoarg, secondoarg)
MyProc
primoarg, secondoarg
Nella
chiamata in cui l'istruzione Call non è utilizzata, le parentesi sono state
omesse.
Convenzioni di scrittura del codice
Le
convenzioni di scrittura del codice consentono di facilitare la scrittura del
codice in Microsoft Visual Basic Scripting Edition. Tali convenzioni sono le
seguenti:
·
Convezioni
di denominazione per oggetti, variabili e routine
·
Convenzioni
per l'aggiunta di commenti
·
Indicazioni
generali per la formattazione e il rientro del testo
Lo scopo
principale delle convenzioni di scrittura del codice è uniformare la struttura
e lo stile di uno script o gruppo di script in modo che il codice risulti
semplice da leggere e comprensibile a tutti. Grazie alla definizione di buone
convenzioni è possibile ottenere codice sorgente preciso, leggibile e chiaro,
in conformità con il codice di altri linguaggi e quanto più possibile
intuitivo.
Convenzioni di denominazione delle costanti
Nelle
versioni precedenti di VBScript non era disponibile alcun metodo di creazione
di costanti definite dall'utente. Se utilizzate, le costanti venivano
implementate come variabili e distinte dalle altre variabili con l'utilizzo dei
caratteri maiuscoli. Le parole che componevano il nome venivano separate con un
carattere di sottolineatura (_). Ad esempio:
USER_LIST_MAX
NEW_LINE
È ancora possibile utilizzare questo metodo per identificare le costanti, ma si
consiglia di utilizzare uno schema di denominazione alternativo e l'istruzione
Const per creare vere costanti. Questa convenzione consente di utilizzare un
formato con caratteri maiuscoli e minuscoli in cui i nomi delle costanti sono
preceduti dal prefisso "con", ad esempio:
conCostantePersonale
Convenzioni di denominazione delle variabili
Per motivi
di leggibilità e uniformità, in VBScript i nomi delle variabili devono essere
descrittivi e preceduti dai prefissi elencati nella tabella seguente.
Sottotipo |
Prefisso |
Esempio |
Boolean |
bln |
blnFound |
Byte |
byt |
bytRasterData |
Date
(Time) |
dtm |
dtmStart |
Double |
dbl |
dblTolerance |
Error |
err |
errOrderNum |
Integer |
int |
intQuantity |
Long |
lng |
lngDistance |
Object |
obj |
objCurrent |
Single |
sng |
sngAverage |
String |
str |
strFirstName |
Area di validità delle
variabili
Nella
tabella seguente sono elencate le aree di validità che è possibile associare
alle variabili VBScript. È consigliabile scegliere sempre l'area di validità
minima.
Area di validità |
Posizione della dichiarazione della
variabile |
Visibilità |
A livello
di routine |
Evento
oppure routine Function o Sub |
Nella
routine in cui è dichiarata |
A livello
di script |
Sezione
HEAD di una pagina HTML, all'esterno di routine |
In tutte
le routine dello script |
Prefissi per l'area di validità delle variabili
Con script
di grandi dimensioni diventa particolarmente importante poter
contraddistinguere l'area di validità delle variabili. A tale scopo è
sufficiente aggiungere un prefisso di una lettera al prefisso del tipo di
variabile in modo da evitare nomi eccessivamente lunghi.
Area di validità |
Prefisso |
Esempio |
A livello
di routine |
Nessuno |
dblVelocity |
A livello
di script |
s |
sblnCalcInProgress |
Nomi di routine e variabili descrittivi
Il corpo del
nome di variabili e routine deve descrivere nel modo più completo possibile la
funzione della variabile o routine, nonché includere una combinazione di
lettere maiuscole e minuscole. I nomi di routine devono inoltre iniziare con un
verbo, ad esempio InitNameArray o CloseDialog.
Per termini utilizzati di frequente o particolarmente lunghi, è consigliabile
utilizzare abbreviazioni standard, in modo da mantenere ridotta la lunghezza
del nome. In generale, i nomi di variabili composti da più di 32 caratteri
risultano di difficile lettura. Le abbreviazioni devono essere utilizzate in
modo uniforme. Se in uno script o gruppo di script vengono, ad esempio,
alternate le abbreviazioni Cnt e Count senza alcun criterio, è possibile creare
confusione.
Convenzioni di
denominazione degli oggetti
Nella
tabella seguente sono elencate le convezioni di denominazione di vari oggetti
utilizzati nella programmazione in VBScript.
Tipo di oggetto |
Prefisso |
Esempio |
Pannello
3D |
pnl |
pnlGroup |
Pulsante
animato |
ani |
aniMailBox |
Casella di
controllo |
chk |
chkReadOnly |
Casella
combinata o di riepilogo a discesa |
cbo |
cboEnglish |
Pulsante
di comando |
cmd |
cmdExit |
Finestra
di dialogo comune |
dlg |
dlgFileOpen |
Cornice |
fra |
fraLanguage |
Barra di
scorrimento orizzontale |
hsb |
hsbVolume |
Immagine |
img |
imgIcon |
Etichetta |
lbl |
lblHelpMessage |
Linea |
lin |
linVertical |
Casella di
riepilogo |
lst |
lstPolicyCodes |
Pulsante
di selezione |
spn |
spnPages |
Casella di
testo |
txt |
txtLastName |
Barra di
scorrimento verticale |
vsb |
vsbRate |
Dispositivo
di scorrimento |
sld |
sldScale |
Convenzioni per i commenti del codice
All'inizio
delle routine è necessario includere un breve commento per descrivere il
funzionamento della routine stessa. Tale commento non deve tuttavia includere
informazioni dettagliate sulla modalità di implementazione. Tali informazioni,
essendo soggette a modifiche, comporterebbero infatti un inutile lavoro di
manutenzione o addirittura la presenza di commenti non corretti. La modalità di
implementazione viene comunque descritta nel codice stesso e nei commenti
inseriti sulla stessa riga delle istruzioni.
È necessario descrivere gli argomenti passati a routine la cui funzione non
risulta evidente o inclusi in un determinato intervallo. All'inizio delle
routine è inoltre necessario includere una descrizione dei valori restituiti da
funzioni e altre variabili che vengono modificate dalla routine, soprattutto se
le modifiche vengono apportate tramite argomenti di riferimento.
Nei commenti di intestazione delle routine è necessario includere le
intestazioni di sezione indicate di seguito. Per alcuni esempi, vedere la
sezione successiva "Formattazione del codice".
Intestazione di sezione |
Contenuto del commento |
Scopo |
Operazioni
eseguite dalla routine, non la modalità di esecuzione. |
Presupposti |
Elenco di
variabili esterne, controlli e altri elementi il cui stato ha effetto sulla
routine. |
Effetti |
Elenco
dell'effetto della routine su variabili esterne, controlli e altri elementi. |
Input |
Descrizione
degli argomenti con significato non evidente. Ciascun argomento deve essere
incluso in una riga distinta insieme a un commento specifico sulla stessa
riga. |
Valori
restituiti |
Descrizione
del valore restituito. |
È importante
tenere presente i seguenti punti:
Le dichiarazioni di variabili importanti devono includere un commento sulla
stessa riga in cui viene descritto l'utilizzo della variabile dichiarata.
I nomi di variabili, controlli e routine devono essere sufficientemente
descrittivi in modo che sia necessario aggiungere commenti sulla stessa riga
solo per la descrizione di implementazioni complesse.
All'inizio degli script è consigliabile includere cenni preliminari che
descrivino brevemente lo script e in cui siano elencati gli oggetti, le
routine, gli algoritmi, le finestre di dialogo e altre dipendenze di sistema. A
volte può risultare utile aggiungere pseudocodice che descrivi l'algoritmo.
Formattazione del codice
Lo scopo è
quello di risparmiare spazio sullo schermo, ma allo stesso tempo applicare al
codice una formattazione che ne rifletta in modo chiaro la struttura logica e i
livelli di nidificazione. Di seguito sono indicati alcuni suggerimenti:
I blocchi nidificati standard devono rientrare di quattro spazi.
I commenti introduttivi di una procedura devono essere rientrati di uno spazio.
Le istruzioni di livello principale che seguono i commenti iniziali devono
rientrare di quattro spazi, con ciascun blocco nidificato rientrato di altri
quattro spazi. Ad esempio:
'*********************************************************
' Scopo: individua la prima occorrenza del nome utente
' specificato nella matrice UserList.
' Input: strUserList(): elenco dei nomi utente in cui eseguire la ricerca.
' strTargetUser: nome utente da cercare.
' Valori restituiti: indice della prima occorrenza
' di strTargetUser nella matrice strUserList.
' Se il nome utente specificato non viene individuato,
' verrà restituito -1.
'*********************************************************
Function intFindUser (strUserList(), strTargetUser)
Dim i ' Contatore di ciclo.
Dim blnFound ' Flag elemento trovato
intFindUser = -1
i = 0 ' Inizializza il contatore di cicli
Do While i <= Ubound(strUserList) and Not blnFound
If strUserList(i) = strTargetUser Then
blnFound = True ' Imposta il flag su True
intFindUser = i ' Imposta il valore restituito sul conteggio dei cicli
End If
i = i + 1 ' Incrementa il contatore di cicli
Loop
End Function
Semplice Pagina VBScript
Una semplice pagina
Microsoft®
Internet Explorer consente di visualizzare la pagina generata dal codice HTML
riportato di seguito. Quando si fa clic sul pulsante disponibile sulla pagina,
viene eseguito VBScript.
<HTML>
<HEAD><TITLE>Una semplice pagina di esempio</TITLE>
<SCRIPT LANGUAGE="VBScript">
<!--
Sub Button1_OnClick
MsgBox "Mirabile visu."
End Sub
-->
</SCRIPT>
</HEAD>
<BODY>
<H3>Una semplice pagina di esempio</H3><HR>
<FORM><INPUT NAME="Button1" TYPE="BUTTON"
VALUE="Fare clic qui"></FORM>
</BODY>
</HTML>
Verrà visualizzata una finestra di dialogo contenente una frase in latino che
significa "Stupendo da guardare".
Al momento della lettura della pagina, Internet Explorer rileva i tag
<SCRIPT>, individua la presenza di codice VBScript e salva il codice.
Quando si fa clic sul pulsante, viene stabilita la connessione tra il pulsante
e il codice e la routine viene eseguita.
La routine Sub racchiusa tra i tag <SCRIPT> è definita routine di eventi.
Il nome della routine è composto da due parti separate da un carattere di
sottolineatura, ovvero dal nome del pulsante Button1, che deriva dall'attributo
NAME del tag <INPUT>, e dal nome dell'evento OnClick. Ad ogni clic sul
pulsante, viene cercata ed eseguita la corrispondente routine di eventi
Button1_OnClick.
Gli eventi disponibili per i controlli di form sono definiti in Modello di
oggetti per la creazione di script nella documentazione di Internet Explorer.
Nelle pagine è inoltre possibile utilizzare combinazioni di controlli e
routine. Nella pagina successiva VBScript e i form vengono illustrate alcune
semplici interazioni tra i controlli.
Modalità alternative per l'associazione di codice a
eventi
Per
associare codice VBScript a eventi, è possibile procedere in due modi diversi.
Tuttavia il metodo descritto sopra è probabilmente quello più semplice e il più
utilizzato. Internet Explorer consente di aggiungere brevi sezioni di codice
sulla stessa riga nel tag che definisce il controllo. Quando si fa clic sul
pulsante, l'azione eseguita dal seguente tag <INPUT>, ad esempio, è
equivalente all'azione eseguita dal codice dell'esempio precedente:
<INPUT NAME="Button1" TYPE="BUTTON"
VALUE="Fare clic qui" OnClick='MsgBox "Mirabile visu."'>
La stessa chiamata alla funzione è racchiusa tra virgolette semplici mentre la
stringa della funzione MsgBox è racchiusa tra virgolette doppie. È possibile
utilizzare più istruzioni a condizione che siano separate dai due punti (:).
È inoltre possibile scrivere un tag <SCRIPT> in modo che sia valido solo
per un determinato evento di un controllo specifico:
<SCRIPT LANGUAGE="VBScript" EVENT="OnClick"
FOR="Button1">
<!--
MsgBox "Mirabile visu."
-->
</SCRIPT>
In questo caso, dato che il tag <SCRIPT> specifica l'evento e il
controllo, le istruzioni Sub e End Sub non vengono utilizzate.
Convalida semplice
È possibile
utilizzare Visual Basic Scripting Edition per le operazioni di elaborazione di
form che in genere è necessario eseguire in un server, nonché per le operazioni
che non possono essere svolte nel server.
Di seguito è riportato un esempio di convalida semplice nel client. Il codice
HTML genererà una casella di testo e un pulsante. Se per visualizzare le pagine
generate dal codice si utilizza Microsoft® Internet Explorer, verrà
visualizzata una piccola casella di testo con un pulsante.
<HTML>
<HEAD><TITLE>Convalida semplice</TITLE>
<SCRIPT LANGUAGE="VBScript">
<!--
Sub Submit_OnClick
Dim TheForm
Set TheForm = Document.ValidForm
If IsNumeric(TheForm.Text1.Value) Then
If TheForm.Text1.Value < 1 Or TheForm.Text1.Value > 10 Then
MsgBox "Immettere un numero compreso tra 1 e 10."
Else
MsgBox "Valore corretto."
End If
Else
MsgBox "Immettere un valore numerico."
End If
End Sub
-->
</SCRIPT>
</HEAD>
<BODY>
<H3>Convalida semplice</H3><HR>
<FORM NAME="ValidForm">
Immettere un valore compreso tra 1 e 10:
<INPUT NAME="Text1" TYPE="TEXT" SIZE="2">
<INPUT NAME="Submit" TYPE="BUTTON" VALUE="Invia">
</FORM>
</BODY>
</HTML>
L'unica differenza tra questo esempio e gli esempi riportati nella sezione Una
semplice pagina VBScript è che la proprietà Value della casella di testo viene
utilizzata per verificare il valore immesso. Per leggere la proprietà Value, è
tuttavia necessario che nel codice venga specificato il riferimento al nome
della casella di testo.
È comunque possibile scrivere il riferimento completo Document.ValidForm.Text1.
Nel caso di più riferimenti a controlli di form, è tuttavia consigliabile
procedere come indicato nell'esempio, ovvero dichiarare innanzitutto una
variabile e assegnare quindi il form alla variabile TheForm tramite
l'istruzione Set. In questo caso non è possibile utilizzare una normale
istruzione di assegnazione quale Dim. L'istruzione Set consente infatti di
mantenere il riferimento a un oggetto.
Utilizzo di valori numerici
Nell'esempio
il valore viene verificato direttamente in base a un numero, ovvero viene
verificato che la stringa inclusa nella casella di testo sia un numero tramite
la funzione IsNumeric. Anche se in VBScript stringhe e numeri vengono
convertiti automaticamente in modo adeguato, è consigliabile controllare sempre
il sottotipo dei valori immessi dall'utente e utilizzare, se necessario, le funzioni
di conversione. Quando si eseguono somme con i valori di caselle di testo, è
inoltre necessario convertire i valori in numeri in modo esplicito. Il segno
più (operatore +) rappresenta infatti sia l'addizione che il concatenamento di
stringhe. Se, ad esempio, Text1 include "1" e Text2 include
"2", il risultato ottenuto sarà il seguente:
A = Text1.Value + Text2.Value ' A è "12"
A = CDbl(Text1.Value) + Text2.Value ' A è 3
Convalida e restituzione di dati al server
Nell'esempio
di convalida semplice viene utilizzato un normale controllo pulsante. Se
venisse utilizzato un controllo Submit, i dati da controllare non sarebbero mai
visualizzati, in quanto verrebbero inoltrati immediatamente al server. Se non
si utilizza il controllo Submit, è possibile verificare i dati, che tuttavia
non verranno inoltrati al server. Per poter eseguire questo ulteriore
trasferimento, è necessario aggiungere la seguente riga di codice:
<SCRIPT LANGUAGE="VBScript">
<!--
Sub Submit_OnClick
Dim TheForm
Set TheForm = Document.ValidForm
If IsNumeric(TheForm.Text1.Value) Then
If TheForm.Text1.Value < 1 Or TheForm.Text1.Value > 10 Then
MsgBox "Immettere un numero compreso tra 1 e 10."
Else
MsgBox "Valore corretto."
TheForm.Submit ' Dati inoltrati al server.
End If
Else
MsgBox "Immettere un valore numerico."
End If
End Sub
-->
</SCRIPT>
Per inoltrare i dati al server, nel codice viene richiamato il metodo Submit
dell'oggetto form quando i dati sono corretti. Il server gestisce quindi i dati
secondo la normale modalità, ma i dati vengono corretti prima di essere
inoltrati al server. Per ulteriori informazioni sul metodo Submit e altri
metodi, consultare la pagina Modello di oggetti per la creazione di script
nella documentazione di Internet Explorer.
Oltre agli oggetti HTML <FORM> standard, Internet Explorer consente di
sfruttare le caratteristiche dei controlli ActiveX™, precedentemente definiti
controlli OLE, e degli oggetti Java™.
Utilizzo di oggetti
Microsoft
Visual Basic Scripting Edition e Microsoft® Internet Explorer gestiscono sia i
controlli ActiveX™, precedentemente definiti controlli OLE, che gli oggetti
Java™. Se si utilizza Microsoft Internet Explorer e sono stati installati i
controlli disponibili nella Raccolta ActiveX™, è possibile visualizzare la
pagina generata dal codice associato.
Per includere un oggetto, è necessario utilizzare il tag <OBJECT>, mentre
per impostare i valori iniziali delle proprietà dell'oggetto, è necessario
utilizzare il tag <PARAM>. L'utilizzo del tag <PARAM> è equivalente
all'impostazione dei valori iniziali delle proprietà per un controllo di un
form in Visual Basic. Nell'esempio seguente i tag <OBJECT> e
<PARAM> consentono di aggiungere il controllo Label (etichetta) ActiveX a
una pagina:
<OBJECT
classid="clsid:99B42120-6EC7-11CF-A6C7-00AA00A47DD2"
id=lblActiveLbl
width=250
height=250
align=left
hspace=20
vspace=0
>
<PARAM NAME="Angle" VALUE="90">
<PARAM NAME="Alignment" VALUE="4">
<PARAM NAME="BackStyle" VALUE="0">
<PARAM NAME="Caption" VALUE="Etichetta desiderata">
<PARAM NAME="FontName" VALUE="Verdana, Arial,
Helvetica">
<PARAM NAME="FontSize" VALUE="20">
<PARAM NAME="FontBold" VALUE="1">
<PARAM NAME="FrColor" VALUE="0">
</OBJECT>
È possibile impostare proprietà e richiamare metodi esattamente come per i
controlli nei form. Il codice seguente, ad esempio, include i controlli
<FORM> che consentono di richiamare due proprietà del controllo Label:
<FORM NAME="LabelControls">
<INPUT TYPE="TEXT" NAME="txtNewText" SIZE=25>
<INPUT TYPE="BUTTON" NAME="cmdChangeIt"
VALUE="Modifica testo">
<INPUT TYPE="BUTTON" NAME="cmdRotate" VALUE="Ruota
etichetta">
</FORM>
Quando il form è stato definito, una routine di eventi del pulsante cmdChangeIt
consente di modificare il testo dell'etichetta:
<SCRIPT LANGUAGE="VBScript">
<!--
Sub cmdChangeIt_onClick
Dim TheForm
Set TheForm = Document.LabelControls
lblActiveLbl.Caption = TheForm.txtNewText.Value
End Sub
-->
</SCRIPT>
Nel codice i riferimenti ai controlli e ai valori inclusi nei form vengono
specificati esattamente come nell'esempio di Convalida semplice.
Nella Raccolta ActiveX sono disponibili diversi controlli ActiveX™ utilizzabili
in Internet Explorer, nonché informazioni dettagliate su proprietà, metodi,
eventi e identificatori di classe (CLSID) dei controlli nelle pagine di
riferimento alla programmazione. Per ulteriori informazioni sul tag
<OBJECT>, vedere la pagina Internet Explorer 4.0 Author's Guide and HTML
Reference.
Nota Nelle versioni precedenti di Internet Explorer, gli attributi CLSID
dovevano essere racchiusi tra parentesi graffe ({}), diversamente da quanto indicato
nella specifica W3C. Nella versione corrente, l'utilizzo delle parentesi graffe
genera un messaggio in cui si avvisa che nella pagina viene utilizzata una
versione non aggiornata del tag <OBJECT>.