2010年9月29日 星期三

vbscript default method 和 default property

在VBScript裡面的class可以有所謂 default method 和 default property 他的作用是可以讓人不需要用 method name 或 property name 就可以呼叫
此外一個class 只能有一個 default method 和 default property 否則會造成錯誤

如以下例子為 default method

class FOO
    public default function no_name
        msgbox "default function called"
        no_name = "i am FOO"
    end function
end class

dim o : set o = new FOO
msgbox o()
  
以上的程式會跳出兩個msgbox 可以得知 no_name 在執行到 o() 時被呼叫

在VBScript 裡面的 dictionary 還有 collection 物件都有 default property
collection 和 dictionary 的 default property 就是 Item property
可以讓人在 coding 時方便許多
例如 要在 dictionary 取一個 key 是 "kerker" 的 value
嚴謹的寫法是 dict.Item("kerker")
但是因為 default property 的關係 用 dict("kerker") 也可以 這樣用起來就方便多了

不過網路上關於 VBScript 的 default method, default property資料好像蠻少的 而且有人說最好不要用這個特性
因為這樣會讓寫出來的code 難以閱讀

2010年9月27日 星期一

Scripting.Dictionary

在 VBScript 或是 Jscript 中有一個很好用的物件叫做Scripting.Dictionary
他就像是 C++ 的 map, PHP 的 array 是一個關聯陣列 (不過Jscript的物件已經可以當關聯陣列用了 所以這個物件對Jscript不太需要)

這個物件有一個很好的特性 就是他的 Items() 和 Keys() method 傳回的陣列元素的順序就是元素加入物件時的先後順序
利用這個特性 用這個物件實做出像是 Stack 或是 Queue 就非常容易了

並沒有任何公開文件聲明Scripting.Dictionary物件必須維持此特性 只能說這是Scripting.Dictionary內部資料結構的實作造成這個事實
雖然依賴這種未公開特性去寫code有風險 只要微軟改變這個物件的實作 就可以讓這一性質消失
但是我覺得微軟應該不會再對Scripting.Dictionary有什麼變動了 沒有這個必要 VBScript 也不是微軟的焦點
所以如果有需要 就用這個特性寫下去吧  畢竟要自己實作 Stack 或是 Queue 太麻煩了

2010年9月24日 星期五

利用adodb.stream作編碼轉換

會知道adodb.stream有這個功能是因為我用winhttprequest物件去要求網頁時
該網頁回傳的是用 big-5 編碼的網頁 導致我出現亂碼
接著我上網搜尋在 vbscript 中作編碼轉換的資料 於是發現 adodb.stream 有這種功能

如以下例子

dim http : set http = createobject("WinHttp.WinHttpRequest.5.1")
http.Open "http://some_big-5_page.html"
http.Send
http.WaitForResponse

msgbox http.ResponseText

Dim oStream : Set oStream = CreateObject("adodb.stream")
oStream.Type = 1                                       '以二進位方式操作
oStream.Mode = 3                                      '可同時進行讀寫
oStream.Open                                            '開啟物件
oStream.Write http.ResponseBody               '將 content 寫入物件內
oStream.Position = 0                                  '從頭開始
oStream.Type = 2                                       '以文字模式操作
oStream.Charset="Big5"                              '設定編碼方式
msgbox oStream.ReadText()

在這裡會發現第一次 跳出來的視窗有亂碼  但是第二次的視窗就正常了
adodb.stream很好很強大 而且它支援多種編碼 不只是big-5
真的很方便