例如,表達(dá)式 (3>2) And (3<4)的結(jié)果為True,表達(dá)式(3>2) And (3>4)的結(jié)果為False,而表達(dá)式(3>2) And Null的結(jié)果為Null,表達(dá)式(3>4) And Null的結(jié)果為False。 與運(yùn)算符還可以對(duì)數(shù)值進(jìn)行運(yùn)算操作,如果兩個(gè)操作數(shù)是數(shù)值的話,那么VBScript先將其轉(zhuǎn)化為二進(jìn)制,再?gòu)淖畹臀婚_始,按位進(jìn)行與運(yùn)算,最后再將運(yùn)算的結(jié)果以十進(jìn)制的形式返回。運(yùn)算的時(shí)候遵循以下規(guī)則:只有1 And 1的結(jié)果為1,否則,結(jié)果均為0。例如,4 And 3的結(jié)果是0,因?yàn)?的二進(jìn)制形式是100,而3的二進(jìn)制形式是011,按位與操作之后結(jié)果是000,所以返回結(jié)果是0。 2.5.3.2 或運(yùn)算符(Or) 在執(zhí)行邏輯或運(yùn)算的過程中,只有當(dāng)兩個(gè)操作數(shù)均為False的時(shí)候,返回結(jié)果才為False,如果有一個(gè)操作數(shù)為True,則返回結(jié)果為True。當(dāng)然,也存在操作數(shù)為Null的情況,在表2.6中列舉了邏輯或運(yùn)算的條件和結(jié)果: 表2.6 邏輯或運(yùn)算的條件和結(jié)果 左操作數(shù) 右操作數(shù) 邏輯運(yùn)算結(jié)果 True True True True False True False True True False False False True Null True Null True True False Null Null Null False Null Null Null Null
例如,表達(dá)式 (2>3) Or (3>4)的結(jié)果為False,表達(dá)式(2<3) Or (3>4)的結(jié)果為True,而表達(dá)式(3>4) Or Null的結(jié)果為Null,表達(dá)式(2<3) Or Null的結(jié)果為True。 當(dāng)或運(yùn)算符對(duì)數(shù)值進(jìn)行運(yùn)算的時(shí)候,對(duì)于二進(jìn)制數(shù)的每一位進(jìn)行或運(yùn)算,運(yùn)算的時(shí)候遵循以下規(guī)則:只有0 Or 0的結(jié)果為0,其他情況下結(jié)果均為1。例如,4 Or 3的結(jié)果是7,因?yàn)?的二進(jìn)制形式是100,而3的二進(jìn)制形式是011,按位與操作之后結(jié)果是111,所以返回結(jié)果是7。 2.5.3.3 非運(yùn)算符(Not) 非運(yùn)算符只有一個(gè)操作數(shù),在執(zhí)行邏輯非運(yùn)算的過程中,如果操作數(shù)為True,返回結(jié)果False;如果操作數(shù)為False,返回結(jié)果為True;如果操作數(shù)為Null,則返回結(jié)果也為Null,如表2.7所示: 表2.7 邏輯非運(yùn)算的條件和結(jié)果 操作數(shù) 邏輯運(yùn)算結(jié)果 True False False True Null Null
3.1.1.1 使用If...Then...Else語句 VBScript中最常用的條件語句就是If…Then…Else語句,一般If…Then…Else語句用來檢查一個(gè)布爾條件,然后根據(jù)結(jié)果為True或者False執(zhí)行相應(yīng)的腳本,如果為True,則執(zhí)行Then后面的腳本,如果為False,則執(zhí)行Else后面的腳本。 If…Then…Else語句有兩種形式:?jiǎn)涡行问胶投嘈行问?也稱塊形式),單行形式中整條語句都需要在一行中完成,其中也包括條件和判斷后執(zhí)行的腳本,其語法如下所示: If condition Then statements [Else elsestatements] 多行形式的語法如下所示: If condition Then statements [Else elsestatements] End If 其中,condition是測(cè)試條件,statements是條件為True的情況下所執(zhí)行的腳本,elsestatements是條件為False的情況下所執(zhí)行的腳本,如果條件為Null,那么執(zhí)行的腳本仍然是elsestatements。通常情況下,測(cè)試條件是使用比較運(yùn)算符對(duì)值或變量進(jìn)行比較的表達(dá)式。在這兩種語法中,Else都是可選的,如果沒有Else,則表明如果判斷條件為True,執(zhí)行Then后面的腳本,如果條件為False,則不執(zhí)行任何腳本。 注意:在多行形式中,語句結(jié)束的最后一行中有一句End If,而單行形式則不需要。 對(duì)于比較短小而簡(jiǎn)單的測(cè)試,我們可以使用單行形式。例如,如果學(xué)生成績(jī)大于60分,則判定成績(jī)?yōu)镻ass,否則判定其成績(jī)?yōu)镕ail,如以下腳本所示: If Score >= 60 Then Status = “Pass” Else Status = “Fail” 不過,在編寫腳本的過程中,多行形式比單行形式的結(jié)構(gòu)化更強(qiáng),更加容易閱讀、維護(hù)和調(diào)試。對(duì)于上面單行形式的語句,我們可以改寫為多行形式如下: If Score >= 60 Then Status = “Pass” Else Status = “Fail” End If 在VBScript中,還可以擴(kuò)展If…Then…Else語句的功能,通過添加ElseIf子句,我們可以對(duì)多個(gè)條件進(jìn)行判斷和分支選擇,其語法如下所示: If condition Then statements ElseIf conditin-n Then elseifstatements Else elsestatements End If
Sub ReportValue(value) If value = 0 Then MsgBox value ElseIf value = 1 Then MsgBox value ElseIf value = 2 then Msgbox value Else Msgbox "Value out of range!" End If
用戶可以根據(jù)需要加上多個(gè)ElseIf子句以提供其它選項(xiàng)。但是,有時(shí)ElseIf子句用得太多,也常常會(huì)變成一種麻煩。經(jīng)常我們所采用的方法是使用可以進(jìn)行多種選擇的Select Case語句。 3.1.1.2 使用Select Case 語句 如果需要實(shí)現(xiàn)多重分支選擇,一般我們使用Select Case語句,而不使用If…Then…Else語句,盡管后者也完全能夠?qū)崿F(xiàn)這些功能。Select Case語句的功能就是根據(jù)表達(dá)式的值執(zhí)行幾組腳本當(dāng)中的一組。其語法如下所示: Select Case testexpression Case expressionlist statements… Case Else expressionlist elsestatements End Select 其中,testexpression是語句的判斷條件,可以是任何數(shù)值或者字符串表達(dá)式,expressionlist則是可能出現(xiàn)的表達(dá)式的值,statements和elsestatements是根據(jù)表達(dá)式結(jié)果執(zhí)行的腳本。 如果testexpression的表達(dá)式結(jié)果和某一個(gè)Case子句中列舉的值相符合,那么則執(zhí)行這一個(gè)Case子句和下一個(gè)Case子句之間的腳本,如果和任何列舉出的值都不符合,則執(zhí)行Case Else子句和End Select之間的腳本,如果再?zèng)]有Case Else語句,那么將會(huì)直接執(zhí)行End Select之后的腳本。如果表達(dá)式的結(jié)果和多個(gè)Case子句中的值相符合,則只會(huì)執(zhí)行第一個(gè)匹配后的語句。 其實(shí),Select Case語句提供了除了 If...Then...ElseIf 以外的另外一種條件語句的形式,可允許用戶從多個(gè)語句塊中作出一個(gè)選擇,并執(zhí)行相應(yīng)的語句。Select Case 語句提供的功能和 If...Then...Else 語句類似,但它可使整個(gè)程序代碼行執(zhí)行起來更加的有效率,而且也提高了程序的可讀性。 Select Case語句在其前端,即Select Case子句后有一個(gè)測(cè)試運(yùn)算式,這個(gè)運(yùn)算式只會(huì)被執(zhí)行一次。執(zhí)行完后的結(jié)果將被用來和每一個(gè) Case子句的值作比較。如果有相符的情況時(shí),這個(gè)Case 子句后的語句塊就將被執(zhí)行,注意下面這個(gè)例子:
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
Sub ChkFirstWhile() Dim counter, myNum counter = 0 myNum = 20 Do While myNum > 10 myNum = myNum - 1 counter = counter + 1 Loop MsgBox "The loop made " & counter & " repetitions." End Sub
Sub ChkLastWhile() Dim counter, myNum counter = 0 myNum = 9 Do myNum = myNum - 1 counter = counter + 1 Loop While myNum > 10 MsgBox "The loop made " & counter & " repetitions." End Sub
Sub ChkFirstUntil( ) Dim counter, myNum counter = 0 myNum = 20 Do Until myNum = 10 myNum = myNum - 1 counter = counter + 1 Loop MsgBox "The loop made " & counter & " repetitons." End Sub
Sub ChkLastUntil() Dim counter, myNum counter = 0 myNum = 1 Do myNum = myNum + 1 counter = counter + 1 Loop Until myNum = 10 MsgBox "The loop made " & counter & " repetitions." End Sub
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 "The loop made " & counter & " repetitions." End Sub
3.1.2.3 While…Wend語句 While…Wend語句和Do…Loop語句十分類似,但不如Do…Loop語句那樣靈活,在While…Wend語句中,如果條件為True,則執(zhí)行循環(huán)內(nèi)腳本。其語法如下所示: While condition statements Wend 其中,conditin是循環(huán)執(zhí)行條件,statements是循環(huán)內(nèi)執(zhí)行的腳本。 While…Wend語句的執(zhí)行步驟如下所示: 1. 判斷condition是否為True,如果為True,則進(jìn)入步驟2執(zhí)行循環(huán)內(nèi)腳本,如果為False或者為Null,則跳出循環(huán); 2. 執(zhí)行循環(huán)中腳本,然后返回步驟1。 與Do … Loop語句不同的是,While循環(huán)語句沒有任何可以跳離循環(huán)的語句,用戶不能想當(dāng)然地使用Exit While語句。 不過,和Do…Loop語句比較而言,While…Wend語句的靈活性要差一些,腳本的清晰程度則是相同的,所以我們建議,在同樣的情況下,還是使用Do…Loop語句。 3.1.2.4 For Each…Next語句 For Each…Next語句和上述三個(gè)循環(huán)語句都有所不同,它既不指定循環(huán)執(zhí)行的次數(shù),也不指定循環(huán)結(jié)束條件,而是對(duì)數(shù)組和集合中的元素進(jìn)行枚舉,當(dāng)枚舉結(jié)束之后才會(huì)退出循環(huán)。其語法如下所示: For Each element In group statements Next 其中,group是我們進(jìn)行枚舉的數(shù)組或者集合,element是枚舉變量的名稱,statements是對(duì)于每個(gè)元素都會(huì)執(zhí)行的循環(huán)腳本。 For Each...Next和For...Next循環(huán)非常相似。它們的不同之處在于,F(xiàn)or Each...Next循環(huán)是針對(duì)集合對(duì)象中的每一個(gè)對(duì)象或數(shù)組中的每一個(gè)元素重復(fù)執(zhí)行一次循環(huán),而ForEach...Next循環(huán)語句是依指定的數(shù)字重復(fù)執(zhí)行循環(huán)的次數(shù)。當(dāng)用戶不知道集合對(duì)象中有幾個(gè)元素時(shí),F(xiàn)or Each...Next循環(huán)語句將會(huì)特別的有用。 在下面的HTML程序范例中,Dictionary對(duì)象的功能是要將文字放到數(shù)個(gè)文本框中:
<HTML> <HEAD> <TITLE>簡(jiǎn)單例子</TITLE> </HEAD> <SCRIPT LANGUAGE="VBScript"> <!-- Sub btnFill_OnClick Dim d ‘定義一個(gè)對(duì)象變量 Set d = CreateObject("Scripting.Dictionary") ‘建立一個(gè)Dictionary對(duì)象 d.Add "0", "Sanders" ‘將有關(guān)信息放入該對(duì)象之中 d.Add "1", "Shirley" d.Add "2", "Winfred"
For Each I in d Document.Form.Elements(I).Value = D.Item(I) ‘將文字放入文本框之中 Next End Sub --> </SCRIPT> <BODY> <CENTER> <FORM NAME="Form"
<Input Type = "Text"><p> <Input Type = "Text"><p> <Input Type = "Text"><p> <Input Type = "Text"><p> <Input Type = "Button" NAME=btnFill VALUE="填入信息"><p> </FORM> </CENTER> </BODY> </HTML>
<HTML> <HEAD> <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0"> <TITLE></TITLE> <SCRIPT LANGUAGE="VBScript"> <!-- Function FillterNum(NumValue) If (IsNumeric(NumValue)) Then FillterNum = NumValue Else FillterNum = 0 End If End Function
Function AddSum(ByRef Value1, ByRef Value2) AddSum = Value1 + Value2 Value1 = Value1 + 1 Value2 = Value2 + 2 End Function
Sub btnSum_onClick() Dim a,b a = FillterNum(txtValue1.value) b = FillterNum(txtValue2.value) txtSum.value = AddSum(a,b) txtValue1.value = a txtValue2.value = b End Sub --> </SCRIPT> </HEAD> <BODY>
3.2.4.2 Function語句 該語句用于聲明Function過程的名稱、參數(shù)以及構(gòu)成其主體的代碼。 如果在該語句中沒有明確指定使用Public或Private,則Function過程默認(rèn)為公用,即它們對(duì)于Script中的所有其他過程是可見和可用的。Function中局部變量的值在對(duì)過程的調(diào)用中不被保留。 此外,所有可執(zhí)行的代碼必須包含于過程中,用戶不能在另一個(gè)Function或Sub過程中定義Function過程。 使用Exit Function語句可以從Function過程中立即退出,而程序?qū)⒗^續(xù)執(zhí)行調(diào)用Function過程的語句之后的語句。用戶可在Function過程的任何位置出現(xiàn)任意個(gè)Exit Function語句。 與Sub過程類似,F(xiàn)unction過程是可以獲取參數(shù)、執(zhí)行一系列語句并改變其參數(shù)值的獨(dú)立過程。與Sub過程的不同之處是:當(dāng)要使用由函數(shù)返回的值時(shí),可以在表達(dá)式的右邊使用Function過程,這與內(nèi)部函數(shù)的使用方式一樣,例如Sqr、Cos或Chr。 在表達(dá)式中,可以通過使用函數(shù)名,并在其后用圓括號(hào)給出相應(yīng)的參數(shù)列表來調(diào)用Function過程。有關(guān)調(diào)用Function過程的詳細(xì)信息,請(qǐng)參閱Call語句。 需要注意的是,F(xiàn)unction過程可以是遞歸的,即該過程可以調(diào)用自身以完成某個(gè)給定的任務(wù)。但是,遞歸可能會(huì)導(dǎo)致堆棧溢出。 如要從函數(shù)返回一個(gè)值,則將值賦給函數(shù)名即可。在過程的任意位置都可以出現(xiàn)任意個(gè)這樣的賦值。如果沒有給name賦值,則過程將返回一個(gè)默認(rèn)值:數(shù)值函數(shù)返回0,字符串函數(shù)返回零長(zhǎng)度字符串(" ")。如果在Function中沒有對(duì)象引用被指定給name(使用Set),則返回對(duì)象引用的函數(shù)將返回Nothing。 在Function過程中使用的變量分為兩類:一類是在過程內(nèi)顯式聲明的,另一類則不是。在過程內(nèi)顯式聲明的變量(使用Dim或等效方法)總是過程的局部變量。被使用但沒有在過程中顯式聲明的變量也是局部變量,除非在該過程外更高級(jí)別的位置顯式聲明它們。 過程可以使用沒有在過程內(nèi)顯式聲明的變量,但如果在Script級(jí)中任何定義的名稱與之相同,則會(huì)發(fā)生名稱沖突。如果過程中使用的未聲明的變量與另一個(gè)過程、常量或變量的名稱相同,則會(huì)認(rèn)為過程使用的是Script級(jí)的名稱。顯式聲明變量可以避免這類沖突??梢允褂肙ption Explicit語句來強(qiáng)制顯式聲明變量。 VBScript可能會(huì)重新排列數(shù)學(xué)表達(dá)式以提高內(nèi)部效率。當(dāng)Function過程修改數(shù)學(xué)表達(dá)式中變量的值時(shí),應(yīng)避免在同一表達(dá)式中使用該函數(shù)。 Function語句的語法: [Public | Private] Function name [(arglist)] [statements] [name = expression] [Exit Function] [statements] [name = expression] End Function
Function 語句的語法包含表3.4所示的各部分。 表3.4 Function 語句的語法組成 組成部分 說明 Public 表示Function過程可被所有Script中的所有其他過程訪問。 Private 表示Function過程只可被聲明它的Script中的其他過程訪問。 Name Function的名稱,遵循標(biāo)準(zhǔn)的變量命名約定。 Arglist 代表調(diào)用時(shí)要傳遞給Function過程的參數(shù)的變量列表。用逗號(hào)隔開多個(gè)變量。 Statements 在Function過程的主體中執(zhí)行的任意語句組。 Expression Function的返回值。
Sub selectOption_onChange Dim nBegin, nEnd, nResult nBegin = FilterNumber(frmFORM.txtBegin.value) nEnd = FilterNumber(frmFORM.txtEnd.value)
Dim i i = nBegin if (frmFORM.selectOption.value = "從起始值到終止值的連加") Then nResult = 0 For i = nBegin To nEnd nResult = nResult + i Next Elseif (frmFORM.selectOption.value = "從起始值到終止值的連乘") Then nResult = 1 For i = nBegin To nEnd nResult = nResult * i Next End If frmFORM.txtResult.value = nResult
Sub InitOptionSelect Dim d Set d = CreateObject("Scripting.Dictionary") d.Add "0", "從起始值到終止值的連加" d.Add "1", "從起始值到終止值的連乘"
Dim i Dim e For Each i in d Set e = Document.createElement("OPTION") e.Text = d.Item(i) e.Value = d.Item(i) frmFORM.selectOption.Options.Add e Next
End Sub
修改顏色值的代碼也寫在下拉列表的onChange事件的過程中。
Sub InitColorSelect Dim d Set d = CreateObject("Scripting.Dictionary") d.Add "0", "紅色" d.Add "1", "綠色" d.Add "2", "藍(lán)色" d.Add "3", "黃色" d.Add "4", "藍(lán)綠" d.Add "5", "紫色"
Dim i Dim e For Each i in d Set e = Document.createElement("OPTION") e.Text = d.Item(i) e.Value = d.Item(i) frmFORM.selectBkColor.Options.Add e frmFORM.selectBkColor.value = d.Item(i) Next
<HTML> <HEAD> <META name=VI60_defaultClientScript content=VBScript> <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0"> <TITLE>第四章節(jié)的一個(gè)例子:關(guān)于選擇語句和循環(huán)語句的使用</TITLE> </HEAD> <SCRIPT ID=clientEventHandlersVBS LANGUAGE=vbscript> <!-- Sub InitColorSelect Dim d Set d = CreateObject("Scripting.Dictionary") d.Add "0", "紅色" d.Add "1", "綠色" d.Add "2", "藍(lán)色" d.Add "3", "黃色" d.Add "4", "藍(lán)綠" d.Add "5", "紫色"
Dim i Dim e For Each i in d Set e = Document.createElement("OPTION") e.Text = d.Item(i) e.Value = d.Item(i) frmFORM.selectBkColor.Options.Add e frmFORM.selectBkColor.value = d.Item(i) Next
End Sub
Sub InitOptionSelect Dim d Set d = CreateObject("Scripting.Dictionary") d.Add "0", "從起始值到終止值的連加" d.Add "1", "從起始值到終止值的連乘"
Dim i Dim e For Each i in d Set e = Document.createElement("OPTION") e.Text = d.Item(i) e.Value = d.Item(i) frmFORM.selectOption.Options.Add e Next
End Sub
Function FilterNumber(NumValue) If ( IsNumeric(NumValue) ) Then FilterNumber = NumValue else FilterNumber = 0 End If
End Function
Sub selectBkColor_onchange Dim ColorValue Select Case frmFORM.selectBkColor.Value Case "紅色" ColorValue = RGB(255, 0, 0) Case "綠色" ColorValue = RGB(0, 255, 0) Case "藍(lán)色" ColorValue = RGB(0, 0, 255) Case "黃色" ColorValue = RGB(255, 255, 0) Case "藍(lán)綠" ColorValue = RGB(0, 255, 255) Case "紫色" ColorValue = RGB(255, 0, 255) End Select
document.bgColor = ColorValue
End Sub
Sub selectOption_onChange Dim nBegin, nEnd, nResult nBegin = FilterNumber(frmFORM.txtBegin.value) nEnd = FilterNumber(frmFORM.txtEnd.value)
Dim i i = nBegin if (frmFORM.selectOption.value = "從起始值到終止值的連加") Then nResult = 0 For i = nBegin To nEnd nResult = nResult + i Next Elseif (frmFORM.selectOption.value = "從起始值到終止值的連乘") Then nResult = 1 For i = nBegin To nEnd nResult = nResult * i Next End If frmFORM.txtResult.value = nResult
第4章 VBScript的函數(shù) 我們已經(jīng)對(duì)VBScript的基本知識(shí)有所了解,本章我們將進(jìn)一步學(xué)習(xí)VBScript的各類函數(shù)。由于學(xué)習(xí)抽象的函數(shù)知識(shí)近似于學(xué)習(xí)理論知識(shí),會(huì)讓人感到十分的枯燥和乏味,所以在這一章中,我們先從總體上對(duì)VBScript的函數(shù)作一綜合介紹,然后再通過一些典型的例子,來詳細(xì)講解較常用到的VBScript函數(shù)。 4.1 VBScript函數(shù)綜述 在VBScript中,函數(shù)包含在Function和End Function之間,函數(shù)和過程有許多相同之處,同樣可以獲取一定的參數(shù),執(zhí)行一系列的語句,并完成一定的操作,但和過程不同之處在于,函數(shù)會(huì)有一個(gè)返回值,其語法如下所示: Public|Private Function name [(argulist)] statements name = expression End Function 和過程一樣,使用Private和Public可以表示函數(shù)是是公有的還是私有的,缺省情況下,函數(shù)默認(rèn)是公有的。name是函數(shù)的名稱,其命名需要遵循VBScript關(guān)于變量命名的規(guī)定。argulist是函數(shù)的參數(shù)列表,多個(gè)參數(shù)之間通過逗號(hào)進(jìn)行分隔,參數(shù)傳遞有兩種傳遞方式:ByVal進(jìn)行值傳遞、ByRef進(jìn)行地址傳遞。statements是函數(shù)內(nèi)執(zhí)行的腳本。 name=expression語句則將expression的結(jié)果返回給調(diào)用該函數(shù)的語句,其中返回的結(jié)果數(shù)據(jù)類型是Variant類型。 如果需要在函數(shù)執(zhí)行的過程中,滿足某種條件后直接退出函數(shù)的處理邏輯,返回主程序,應(yīng)該使用Exit Function語句。 例如,我們可以編寫函數(shù)完成將溫度的華氏度換算為攝氏度,如下所示:
<!-- Function CDegree(ByVal fDegree) CDegree = (fDegree – 32) * 5 /9 End Function -->