如果你想知道一個物件是否是特殊的類型,請編寫下面的程式碼:
If TypeOf obj Is ListItem Then ...
如果想得到物件類型的名字,使用:
MsgBox "The item is a " & TypeName(obj)
控制長時間的循環當程式陷入一個很長時間的循環時,你就不可能點擊任何一個命令按鈕或按鍵。這樣對於使用者來說,就很不好控制。或許用戶不想再執行循環,透過點擊Cancel按鈕退出呢?怎麼解決這個問題?答案是:使用DoEvents指令!就是說,在迴圈的開始執行DoEvents指令,就像下面的程式碼一樣:
Dim i As Long
For i = 1 To 1000000
DoEvents
……
Next i
實際上,DoEvents命令並不需要放置在第1行,將它放在循環中的任何地方都可以。這樣做後,程式的其他部分,例如一個結束循環的命令按鈕,就又機會接受點擊事件了。
使長循環運行更快我發現,一般情況下,使用API函數GetInputState來檢查程式輸入佇列的數值是較好的。我不知道為什麼If語句提高了程式碼運行速度,但實際上確實工作得很好。
因此,可以將下面的程式碼行
DoEvents
替換為
If GetInputState() Then DoEvents
試一試吧!
其實,這裡面的原因在於:DoEvents語句允許任何應用程式執行相關事件,而不僅僅是你自己的程式。加入了GetInputState的判斷後,就只接受你自己的程式的事件動作了!
讓Select Case更簡單讓我們看看下面的例子:透過使用者點擊不同組合的標籤,建立一個字串:
lbl(0) = "Hello "
lbl(1) = " I註解:m "
lbl(2) = " Happy"
lbl(3) = " Sad"
……
sub lbl_click (index as integer)
string$ = string$+lbl(index).caption
然後,你就必須要寫一系列的select case語句來分析這個字串...
select case string$
case "Hello I註解:m Happy"
do something
case "Hello I註解:m"
this would be an error...
case else
do something else
end select
可以看出,這將非常複雜,特別是又許多標籤而且需要合併操作的合法檢查時。
為了解決這個難題,我創建了一個數組,它與標籤的數目等長:
arraylbl(n) as integer
數組起始數值為1,然後每個項目的值等於前一個的值乘以2(value*2),就像這樣:1 2 4 8 16 32 64 ... 這樣,每一對標籤的組合都會又一個唯一的數值“
lbl(0) + lbl(1) = 1 + 2 = 3
lbl(0) + lbl(1) + lbl(4) = 1 + 2 + 16 = 19
現在,當點擊一個標籤時,將它對應的lblarray()數值加進變數中。這樣,基於幾個數字,就可以簡單地寫select case語句了:
select case IsLegal
case 3
註: the string was valid
call goodstuff
case 19
註:the string was valid
call goodstuff
caseelse
註:invalid
call nogood
end select
呵呵,有時候,將字元進行數位化,能起到意想不到的好效果!