標籤

系統管理 (12) 資料結構 (6) 控制結構 (4) 字串處理 (2)
顯示具有 資料結構 標籤的文章。 顯示所有文章
顯示具有 資料結構 標籤的文章。 顯示所有文章

20130916

VBScript Collection 物件方法

Collection: A class representing a collection of ordered elements. The stored elements can be referred by an index number or by the key associated with the elements. It offers the following methods and properties based on the documentation of Visual Basic .NET:

Item(i|key):
傳回指定索引及鍵值的物件,
因為Item是 collection 物件預設方法,
所以collection.Item(i)可以簡寫 collection(i)。

"Count": Property to return the number of elements in the collection.
"Add(element)": Method to add an element at the end of the collection without a key.
"Add(element, key)": Method to add an element at the end of the collection with a key.
"Remove(i|key)": Method to remove the element of the specified index or key.

Unfortunately, I was not able to write an ASP page with a new collection object.

20130608

VBScript 運算子

VBScript 具有完整的運算子,包括算術運算子、比較運算子、連結運算子和邏輯運算子。
運算子的優先權

當一個運算式中有數個動作發生時,各部分的動作會在預先決定的順序下完成,而此順序就是運算子的優先順序。括號則可推翻優先順序的等級,並且強迫運算式的某些部分必須優先執行。括號內要比括號外部的先執行。然而,括號中運算子的優先順序與正常情況是一樣的。當運算式有超過一種運算子時,會先執行算術運算子,其次是比較運算子,而後才是邏輯運算子。比較運算子的優先順序全都是相同的,也就是說依照出現的順序由左到右依序執行。而算術和邏輯運算子則必須依照下列的優先順序,依序執行:
算術比較邏輯
描述符號描述符號描述符號
指數運算^相等=NotNot
負數-不等<>AndAnd
乘法*小於<OrOr
除法/大於>XorXor
整數除法\小於或相等<=EqvEqv
ModMod大於或相等>=ImpImp
加法+IsIs  
減法-    
字串連結&    
若乘法和除法同時存在於運算式中,則計算時的順序就是依照其由左到右的位置來決定。同樣地,若加法和減法同時存在於一個運算式中,計算時的順序就是依照其由左到右的位置來決定。
字串連結運算子 (&) 不是算術運算子,但是在優先順序上它會落在所有算術運算子之後,且在所有比較運算子之前。Is 運算子是一個物件引用比較運算子。它並非比較物件或是它們的值;而是檢查兩個物件是否引用到相同的物件。

VBScript 常數

常數是一個用來取代固定數字或固定字串的有意義名稱。VBScript 定義了許多內建常數。

建立常數

在 VBScript 中,您可以使用 Const 陳述式建立使用者自訂的常數。藉由 Const 陳述式,您就可以使用一個有意義的名稱來建立一個字串或數字常數,並給它們指定值。舉例來說,像:
Const MyString = "This is my string." 
Const MyAge = 49


請注意,字串文字是放在引號(" ")中。引號是分辨字串值和數值最明顯的一個方法。日期表示式和時間表示式則都需用井字符號(#)把它們括起來。比如像:
Const CutoffDate = #6-1-97#

您可以採用不同的命名結構來辨別常數和變數。這樣做可以避免您在執行 script 時犯下重複指定常數值的錯誤。舉例來說,您可以在常數名稱前加上「vb」或「con」當作字首,或者常數名稱全部用大寫字母來命名。當您在開發比較複雜的 script 時,區分常數和變數可以減少不少困擾。

VBScript 程式撰寫規格

什麼是程式撰寫規格?
程式撰寫規格包含了下列數項:
  • 物件、變數和程序的命名規格
  • 寫註解時的規格
  • 文字格式和縮排的使用原則
使用一致的程式撰寫規格之主要理由在於可以標準化一個 script 或一組 script 的架構和程式碼樣式。如此一來,您和其它人便可以輕鬆地了解這些程式碼的意義。使用良好的程式撰寫規格,可提高原始程式碼的精確度、可讀性和清晰度,而且可使它與其他程式語言規格更具一致性和直覺性。
常數命名規格
早期的 VBScript 版本不能建立使用者自訂常數。如果需要使用常數時,通常都是以一變數來當作常數,同時使用全部大寫的字母來命名以和一般的變數區別。而每個字之間則使用底線( _ )字元來做區隔。比如像:
 USER_LIST_MAX
 NEW_LINE
雖然現在這仍是一個辨別常數的可行辦法,但因為現在可以使用 Const 陳述式來建立一個真正的常數,所以您可能會希望改用另一種命名的架構。這個方式混合了大小寫字母,同時在常數之前加了一個「con」當作字首。比如像:
 conYourOwnConstant
變數命名規格
為了維持程式的可讀性和一致性,請您在您的 VBScript 程式碼內的變數名稱前,加上下述的字首。
子型態字首範例
BooleanblnblnFound
BytebytbytRasterData
Date (Time)dtmdtmStart
DoubledbldblTolerance
ErrorerrerrOrderNum
IntegerintintQuantity
LonglnglngDistance
ObjectobjobjCurrent
SinglesngsngAverage
StringstrstrFirstName
變數的有效範圍
變數應該盡可能的定義在最小的有效範圍之中。VBScript 變數有下列幾種有效範圍:
有效範圍變數宣告的地點可視性
程序層級事件,函數,或 Sub 程序可見範圍在其宣告的程序中
Script 層級HTML 網頁的 HEAD 區段,需寫在所有程序之外Script 中的每一個程序都可見
變數有效範圍字首
當 script 很大時,加上變數有效範圍字首將可以快速區別變數的有效範圍。一個置於型態字首之前的單一字母之有效範圍字首可以幫我們做到這點,同時又不會過度的增加變數名稱的長度。
有效範圍字首範例
程序層級不必加dblVelocity
Script 層級ssblnCalcInProgress
有說明性的變數和程序名稱
變數和程序名稱應該使用大小寫混合的命名名稱,同時這個名稱應該盡可能地能夠說明變數的用途。此外,程序名稱應該以動詞開頭,比如像 InitNameArray 或 CloseDialog。對於一些經常使用的長名詞,我們建議您使用標準的縮寫,以免名稱過長。一般來說,名稱長度如果超過 32 個字元就很難閱讀。當您使用縮寫時,請在全部的 script 中都保持相同的縮寫方式。舉例來說,如果您在一個 script 或一組 script 中時而用 Cnt,時而用 Count,那麼有時可能會造成困擾。
物件命名規格
下清單格列出了您在撰寫 VBScript 時會遭遇的物件型態及建議的命名規格。
物件型態字首範例
3D PanelpnlpnlGroup
Animated buttonanianiMailBox
Check boxchkchkReadOnly
Combo box, drop-down list boxcbocboEnglish
Command buttoncmdcmdExit
Common dialogdlgdlgFileOpen
FramefrafraLanguage
Horizontal scroll barhsbhsbVolume
ImageimgimgIcon
LabellbllblHelpMessage
LinelinlinVertical
List BoxlstlstPolicyCodes
SpinspnspnPages
Text boxtxttxtLastName
Vertical scroll barvsbvsbRate
SlidersldsldScale
程式註解規格
所有的程序都應該以一簡短的註解當作開頭來解釋程序的功用。這些說明不必解釋程式製作的細節(它怎麼做到的), 因為這些內容可能時時會改變。如此一來,您就不必做一些不必要的註解維護工作,或是讓您的註解錯誤百出。這些程式碼本身和所有必要的行間註解就足以說明製作的方式。當要傳遞到程序中的引數之目的不是很明顯時,或是程序預期引數的值應該介於某個範圍之間時,您就應該在註解中說明。函數的傳回值以及會被程序更動的變數,特別是經由引用的引數,也都應該寫在程序的前頭的註解中。
程序的開頭註解應該包含下列幾個區段標題。您可以參考以下「格式化您的程式碼」中的例子。
區段標題註解內容
目的(Purpose)程序的功用(不是如何達成其功用)。
假設(Assumptions)列出任何會影響這個程序的外部變數、控制項或其它元件。
影響(Effects)列出這個程序會影響的任何外部變數、控制項或其它元件。
輸入(Inputs)解釋每一個沒有明顯功能的引數。每一個引數都應該自成一行,同時使用行間註解。
傳回值(Return Values)解釋傳回值的意義。
請記得下列幾個要點:
  • 每一個重要變數的宣告都應該伴隨著一個行間註解來說明變數的功用。
  • 變數、控制項和程序的名稱都應該要令人可以一目了然。行間註解只需要用在一些較複雜的程式細節部分。
  • 在 script 的開頭,您應該包含一段描述整個 script 的概觀,同時列舉物件、程序、演算法、對話方塊以及其它和系統相關的事項。有時用一段虛擬碼來說明演算法可能會有不小的幫助。
格式化您的程式碼
盡可能保留螢幕的空間,但是同時要讓您的程式格式可以反映程式的邏輯結構和巢狀架構。這裡有幾個要點:
  • 標準的巢狀區塊應該用四個空格縮排。
  • 一個程序的概觀註解應該用一個空格縮排。
  • 緊接在概觀註解後的最高層級陳述式應該要用四個空格縮排,其中的巢狀區塊則再用四個空格縮排。下面是一個例子:

 '*********************************************************
 ' Purpose:  Locates the first occurrence of a specified user 
 '           in the UserList array.
 ' Inputs:   strUserList():   the list of users to be searched.
 '           strTargetUser:   the name of the user to search for.
 ' Returns:  The index of the first occurrence of the strTargetUser 
 '           in the strUserList array. 
 '           If the target user is not found, return -1.
 '*********************************************************

 Function intFindUser (strUserList(), strTargetUser)
     Dim i                     ' Loop counter.
     Dim blnFound        ' Target found flag
     intFindUser = -1
     i = 0                     ' Initialize loop counter
     Do While i <= Ubound(strUserList) and Not blnFound
         If strUserList(i) = strTargetUser Then 
             blnFound = True   ' Set flag to True
             intFindUser = i   ' Set return value to loop count
         End If
         i = i + 1             ' Increment loop counter
     Loop
 End Function

VBScript 變數

什麼是變數?
變數代表一個指向電腦記憶體位置的預留空間。在這個空間中,您可以儲存一些在 script 執行過程中會變動的程式資訊。舉例來說,在某個網頁中,您可以建立一個稱做 ClickCount 的變數來儲存使用者用滑鼠點選某一個物件的次數。變數儲存在電腦記憶體中的哪個位置並不重要,重要的是您只需用變數的名稱即可檢視儲存在其中的值、或更改這個值。在 VBScript 中,基本資料型態就是 Variant。
宣告變數
使用 Dim 陳述式、Public 陳述式、或 Private 陳述式在 script 中明確宣告一個變數。比如像:
 Dim DegreesFahrenheit
可以同時宣告多個變數,變數之間以逗號隔開即可。比如像:
 Dim Top, Bottom, Left, Right
在 script 中使用時宣告一個變數。不過一般來說,這並不是一個好的方法。因為您可能會在使用時拼錯了變數的名稱,而產生不可預期的執行結果。基於這個理由,您可以使用 Option Explicit 陳述式來要求所有變數都要明確宣告。您應該在 script 的開端都放上 Option Explicit 陳述式。
命名的限制
在 VBScript 中,變數的命名必須遵循一標準規則。一個變數名稱中:
  • 必須以字母開頭。
  • 中間不能包含句點(.)。
  • 不能超過 255 個字元。
  • 在宣告的有效範圍中必須唯一。
變數的有效範圍和生命週期
一個變數的有效範圍是由其宣告的地點來決定。當您在一個程序中宣告變數時,那麼就只有程序中的程式碼可以存取或更改這個變數的值。它有區域的有效範圍,同時稱之為程序層級變數。如果您是在程序之外宣告一個變數,那麼 script 中的所有程序將都能使用這個變數。這是一個 script 層級的變數,同時它有 script 層級的有效範圍。一個變數的存在時間稱之為變數的生命週期。一個 script 層級變數的生命週期是從變數被宣告開始一直到 script 執行完畢為止。而程序層級變數就只有在程序執行時會存在。當離開程序時,這些變數就會消失。當程序執行時,區域變數是一個用來暫存資料的絕佳選擇。您可以在許多個不同程序中宣告同樣名稱的區域變數,因為只有變數所在的程序才會認得該變數。
指定值給變數
指定值給變數所要使用的運算式如下:變數在運算式的左邊,您要指定給變數的值在右邊。舉例來說,像:
 B = 200
單一值變數和陣列變數
在大多數的情形下,您只會想指定單一個值給您宣告的變數。一個含有單一個值的變數稱為單一值變數。在某些情形中,指定數個相關的值給一個變數會比指定一個來得方便。此時,您就可以建立一個可以包含一群值的變數。這種變數稱之為陣列變數。 宣告陣列變數和宣告單一值變數是相同的,但是在宣告陣列變數時,您需要在變數名稱後面加上括號 ( )。在下面的例子中,我們宣告了一個含有 11 個元素的一維陣列:
 Dim A(10)
雖然在括號中的數字是 10,不過因為在 VBScript 中的所有陣列都是以零為基底的陣列,所以這個陣列實際上包含了 11 個元素。在以零為基底的陣列中,陣列的元素個數永遠是括號中的數字再加 1。這種類型的陣列稱為固定大小的陣列。您可以使用索引來指定值給陣列中的元素。索引的值由零開始,其最大值到 10。您可以用下列的方式把資料指定給陣列中的元素:
 A(0) = 256
 A(1) = 324
 A(2) = 100
 . . .
 A(10) = 55
同樣地,您也可以使用索引值來讀取特定陣列元素中的資料。比如像:
 . . . 
 SomeVariable = A(8)  
 . . . 
陣列並不一定要是一維陣列,它最大可以到達 60 維。不過大部分的人通常最多都只用到三或四維。宣告多維陣列的方法是在括號中填入陣列各個維度的大小,而每個數字之間是以逗號隔開。在下面的例子中,MyTable 這個變數是一個二維陣列,它包含了 6 個資料列和 11 個資料行:
 Dim MyTable(5, 10)
在一個二維的陣列中,第一個數字代表資料列的數目;第二個則代表資料行的數目。您也可以宣告一個在 script 執行過程中大小會改變的陣列。這種陣列稱之為動態陣列。在程序中,您可以用 Dim 陳述式或 ReDim 陳述式來宣告動態陣列。然而在動態陣列的宣告中,括號內不必填入任何維度或陣列的大小。比如像:
 Dim MyArray()
 ReDim AnotherArray()
當您要使用動態陣列時,您必須先使用 ReDim 來決定陣列的維度以及每個維度的大小。在下面的例子中,ReDim 首先將動態陣列的起始大小設為 25,之後的ReDim 陳述式則將大小修改為 30,同時它使用了 Preserve 這個關鍵字,它可以在陣列大小改變時,使原來儲存在陣列中的資料得以保存。
 ReDim MyArray(25)
 . . . 
 ReDim Preserve MyArray(30)
動態陣列之大小變化的次數並沒有任何限制。不過,您應該注意的是,當您縮小陣列的大小時,存放在被刪除掉的元素中的資料都會消失不見。

VBScript 資料型態


VBScript 只有一種稱為 Variant 的資料型態。Variant 是一個很特殊的資料型態,它可以隨著被使用方法的不同而包含不同的資訊。因為 Variant 是 VBScript 中的唯一資料型態,所以它也是 VBScript 中所有函數傳回資料的唯一型態。

在這麼簡單的結構中,Variant 同樣可以包含數字或字串的資訊。當您在一個應該使用數字的地方使用 Variant 時,它就會被當成一個數字;當您在一個應該使用字串的地方使用 Variant 時,它就會被當成一個字串。這也就是說,當您使用一個看起來像數字的資料時,VBScript 就會假設它是數字,同時採取適當的處理。相同的,如果您使用的資料只能是字串資料時,VBScript 就會把它當成字串資料。當然,您可以在數字外加上引號(" ")強迫 VBScript 把它當成字串。
Variant 子型態
除了數值或字串的分別之外,Variant 還可以更進一步區分數值資訊的性質。舉例來說,您可以讓一個數值代表日期或時間。當它和其它日期或時間一起做運算時,其結果都會以日期或時間表示。當然,您還可以使用各種不同大小的數值資訊。它可以小如布林值,或大如浮點數。這些可以包含在 Variant 中的不同種類資訊稱為副型態。在大部分的情形下,您都可以直接把您所想用的型態放到 Variant 中,Variant 會以最適當的方式來處理其中所包含的資料。下面的表格中列出了 Variant 可以包含的子型態。
子型態描述
EmptyVariant 仍未初始化。數值變數將會是 0,字串變數則是長度為零的字串("")。
NullVariant 包含一個無效的資料。
Boolean包含 True 或 False。
Byte包含 0 到 255 之間的整數。
Integer包含介於 -32,768 到 32,767 之間的整數。
Currency介於 -922,337,203,685,477.5808 到 922,337,203,685,477.5807 之間。
Long包含介於 -2,147,483,648 到 2,147,483,647 之間的整數。
Single包含一個單精度浮點數,其負數的範圍介於 -3.402823E38 到 -1.401298E-45 之間;正數的範圍則介於 1.401298E-45 到 3.402823E38 之間。
Double包含一個雙精度浮點數,其負數的範圍介於 -1.79769313486232E308 到 -4.94065645841247E-324 之間;正數的範圍則介於 4.94065645841247E-324 到 1.79769313486232E308 之間。
Date (Time)包含一個代表日期的數值,其值介於西元 100 年 1 月 1 日到西元 9999 年 12 月 31 日之間。
String包含一個可變長度的字串,其長度最長可以到將近 20 億個字元。
Object包含一個物件。
Error包含一個錯誤代碼。
您可以使用轉換函數來轉換資料的子型態。此外,VarType 函數可以傳回儲存在 Variant 中的資料。