免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
VB超頻快餐,讓我一次用個(gè)夠!
編程人員從大量的程序開(kāi)發(fā)中積累了許多非常實(shí)用的經(jīng)驗(yàn)與技巧,它們就象一盤(pán)盤(pán)的快餐,看似簡(jiǎn)單但營(yíng)養(yǎng)絕對(duì)豐富!用“餐”之后,您的VB程序?qū)⒘⒓闯l。還猶豫什么,快來(lái)品嘗品嘗吧 ...
VB超頻快餐,讓我一次用個(gè)夠?。ㄒ唬?br>1.用Mid$命令超速字符串添加操作
2.從頭開(kāi)始刪除集合項(xiàng)目
3.用InStr函數(shù)實(shí)現(xiàn)代碼減肥
4.精用Boolean表達(dá)式,讓代碼再減肥
5.函數(shù)名巧做局部變量
VB超頻快餐,讓我一次用個(gè)夠!(二)
6.火眼識(shí)破隱藏的Variant變量
7.GoSub在編譯程序中速度變慢
8.減少DoEvents語(yǔ)句的數(shù)量
9.And、Or和Xor:讓我們來(lái)優(yōu)化表達(dá)式
10.靜態(tài)變量慢于動(dòng)態(tài)變量
VB超頻快餐,讓我一次用個(gè)夠?。ㄈ?br>11.善用"Assume No Aliasing"編譯選項(xiàng)
12.為常量定義合適的類(lèi)型
13.你真正理解"Allow Unrounded Floating Point Operations"選項(xiàng)的含義嗎?
14.除法運(yùn)算符"\"與"/"的區(qū)別
15.使用"$-類(lèi)型"字符串函數(shù)會(huì)更快
VB超頻快餐,讓我一次用個(gè)夠!(四)
16.妙用Replace函數(shù)替代字符串連接操作符&
17.固定長(zhǎng)度字符串?dāng)?shù)組:賦值快,釋放快!
18.未公開(kāi)的返回?cái)?shù)組型函數(shù)加速秘訣
19.深入使用LIKE操作符
20.創(chuàng)建任意長(zhǎng)度重復(fù)字符串的簡(jiǎn)潔方法
VB超頻快餐,讓我一次用個(gè)夠?。ㄎ澹?br>21.另辟蹊徑處理字符串中的字符:字節(jié)數(shù)組法
22.快速清除數(shù)組部分內(nèi)容
23.快速初始化Variant和String類(lèi)型數(shù)組
24.訪(fǎng)問(wèn)簡(jiǎn)單變量總是快于數(shù)組元素值
25.創(chuàng)建新表時(shí),快速拷貝字段
VB超頻快餐,讓我一次用個(gè)夠?。?br>26.無(wú)閃爍地快速附加字符串到textbox控件
27.快速找到選中的OptionButton
28.表單及控件的引用阻止了表單的卸載
29.重定義編譯DLL文件的基地址
30.快速調(diào)入TreeView控件以及ListView控件的子項(xiàng)內(nèi)容
VB超頻快餐,讓我一次用個(gè)夠?。ㄆ撸?br>31.Friend過(guò)程快于Public過(guò)程
32.使用Objptr函數(shù)快速查找集合中的對(duì)象
33.使用ObjPtr檢測(cè)2個(gè)對(duì)象變量是否指向同一對(duì)象
34.讀取文件內(nèi)容的簡(jiǎn)潔方法
35.字體對(duì)象克隆招法
(一)
用Mid$命令超速字符串添加操作
大家都知道,&操作符的執(zhí)行速度是相當(dāng)慢的,特別是處理長(zhǎng)字符串時(shí)。當(dāng)必須重復(fù)地在同一變量上附加字符時(shí),有一個(gè)基于Mid$命令的技巧可
以使用。基本思路就是:預(yù)留一個(gè)足夠長(zhǎng)的空間存放操作的結(jié)果。下面是應(yīng)用這個(gè)技術(shù)的一個(gè)例子。
假設(shè)要建立一個(gè)字符串,它要附加從1開(kāi)始的10000個(gè)整數(shù):"1 2 3 4 5 6 7 ... 9999 10000"。下面是最簡(jiǎn)單的實(shí)現(xiàn)代碼:
res = ""
For i = 1 to 10000: res = res & Str(i): Next
代碼雖然簡(jiǎn)單,但問(wèn)題也很明顯:Res變量將被重分配10000次。下面的代碼實(shí)現(xiàn)同樣的目的,但效果明顯好轉(zhuǎn):
Dim res As String
Dim i As Long
Dim index As Long
'預(yù)留足夠長(zhǎng)的緩沖空間
res = Space(90000)
'指針變量,指出在哪里插入字符串
index = 1
'循環(huán)開(kāi)始
For i = 1 to 10000
substr = Str(i)
length = Len(substr)
'填充字符串的相應(yīng)區(qū)間段數(shù)值
Mid$(res, index, length) = substr
'調(diào)整指針變量
index = index + length
Next
'刪除多余字符
res = Left$(res, index - 1)
測(cè)試表明:在一個(gè)333MHz的計(jì)算機(jī)上,前段代碼執(zhí)行時(shí)間為2.2秒,后者僅僅為0.08秒!代碼雖然長(zhǎng)了些,可是速度卻提高了25倍之多。呵呵,
由此看來(lái):代碼也不可貌相啊
從頭開(kāi)始刪除集合項(xiàng)目
刪除集合中的所有內(nèi)容有許多方法,其中有些非常得迅速。來(lái)看看一個(gè)包含10,000個(gè)項(xiàng)目的集合:
Dim col As New Collection, i As Long
For i = 1 To 10000
   col.Add i, CStr(i)
Next
可以從末尾位置為起點(diǎn)刪除集合內(nèi)容,如下:
For i = col.Count To 1 Step -1
col.Remove i
Next
也可以從開(kāi)始位置為起點(diǎn)刪除集合內(nèi)容,如下:
For i = 1 To col.Count Step 1
col.Remove i
Next
試驗(yàn)證明,后者要快于前者百倍多,比如0.06秒比4.1秒。原因在于:當(dāng)引用接近末尾位置的集合項(xiàng)目時(shí),VB必須要從第1個(gè)項(xiàng)目開(kāi)始遍歷整個(gè)的項(xiàng)目鏈。
face=宋體>更有趣的是,如果集合項(xiàng)目的數(shù)量加倍,那么從末尾開(kāi)始刪除與從頭開(kāi)始刪除,前者要比后者花費(fèi)的時(shí)間將成倍增長(zhǎng),比如前者是24秒,后者可能為0.12秒這么短!
最后提醒您:刪除集合的所有內(nèi)容的最快方法就是“毀滅”它,使用下面的語(yǔ)句: Set col = New Collection
對(duì)于一個(gè)包含20,000個(gè)項(xiàng)目的集合,上述操作僅僅耗時(shí)0.05秒,這比使用最快的循環(huán)操作進(jìn)行刪除也要快2倍左右。
用InStr函數(shù)實(shí)現(xiàn)代碼減肥
可以采用“旁門(mén)左道”的方式使用Instr函數(shù)實(shí)現(xiàn)代碼的簡(jiǎn)練。下面是一個(gè)典型的例子,檢測(cè)字符串中是否包含一個(gè)元音字母:
1、普通的方法:
If UCase$(char) = "A" Or UCase$(char) = "E" Or UCase$(char) = "I" Or UCase$(char) = "O" Or UCase$(char) = "U" Then
' it is a vowel
End If
2、更加簡(jiǎn)練的方法:
If InStr("AaEeIiOoUu", char) Then
' it is a vowel
End If
同樣,通過(guò)單詞中沒(méi)有的字符作為分界符,使用InStr來(lái)檢查變量的內(nèi)容。下面的例子檢查Word中是否包含一個(gè)季節(jié)的名字: 1、普通的方法:
If LCase$(word) = "winter" Or LCase$(word) = "spring" Or LCase$(word) = _ "summer" Or LCase$(word) = "fall" Then
' it is a season's name
End If
2、更加簡(jiǎn)練的方法:
If Instr(";winter;spring;summer;fall;", ";" & word & ";") Then
' it is a season's name
End If
有時(shí)候,甚至可以使用InStr來(lái)替代Select
Case代碼段,但一定要注意參數(shù)中的字符數(shù)目。下面的例子中,轉(zhuǎn)換數(shù)字0到9的相應(yīng)英文名稱(chēng)為阿拉伯?dāng)?shù)字: 1、普通的方法:
Select Case LCase$(word)
Case "zero"
result = 0
Case "one"
result = 1
Case "two"
result = 2
Case "three"
result = 3
Case "four"
result = 4
Case "five"
result = 5
Case "six"
result = 6
Case "seven"
result = 7
Case "eight"
result = 8
Case "nine"
result = 9
End Select
2、更加簡(jiǎn)練的方法:
result = InStr(";zero;;one;;;two;;;three;four;;five;;six;;;seven;eight;nine;", _
";" & LCase$(word) & ";") \ 6
精用Boolean表達(dá)式,讓代碼再減肥
當(dāng)設(shè)置基于表達(dá)式結(jié)果的Boolean型數(shù)值時(shí),要避免使用多余的If/Then/Else語(yǔ)句結(jié)果。比如:
If SomeVar > SomeOtherVar Then
BoolVal = True
Else
BoolVal = False
End If
上面這段代碼就很煩瑣,它們完全可以使用下面的一行代碼來(lái)替代:
BoolVal = (SomeVar > SomeOtherVar)
括號(hào)不是必須的,但可以增加可讀性。根據(jù)表達(dá)式中的操作數(shù)不同,后者比前者執(zhí)行起來(lái)大約快50%到85%。后者中的括號(hào)對(duì)速度沒(méi)有影響。
有時(shí),使用這個(gè)技術(shù)實(shí)現(xiàn)代碼的簡(jiǎn)練并非很明顯。關(guān)鍵是要牢記:所有的比較操作結(jié)果或者是0(false),或者是-1(True)。所以,下面例
子中的2段代碼是完全相同的,但是第2段要運(yùn)行得快些:
1、傳統(tǒng)方法:
If SomeVar > SomeOtherVar Then
x = x + 1
End If
2、更簡(jiǎn)練的方法
x = x - (SomeVar > SomeOtherVar)

函數(shù)名巧做局部變量
很多程序員都沒(méi)有認(rèn)識(shí)到“在函數(shù)本身中使用函數(shù)名”的妙處,這就象對(duì)待一個(gè)局部變量一樣。應(yīng)用這個(gè)技巧可以起到臨時(shí)變量的作用,有時(shí)
還能加速程序運(yùn)行??纯聪旅娴拇a:
Function Max(arr() As Long) As Long
Dim res As Long, i As Long
res = arr(LBound(arr))
For i = LBound(arr) + 1 To UBound(arr)
If arr(i) > res Then res = arr(i)
Next
Max = res
End Function
去掉res變量,使用函數(shù)名稱(chēng)本身這個(gè)局部變量,可以使程序更加簡(jiǎn)練:
Function Max(arr() As Long) As Long
Dim i As Long
Max = arr(LBound(arr))
For i = LBound(arr) + 1 To UBound(arr)
If arr(i) > Max Then Max = arr(i)
Next
End Function

(二)
火眼識(shí)破隱藏的Variant變量
如果沒(méi)有用As語(yǔ)句聲明變量,默認(rèn)類(lèi)型就是Variants,比如:
Dim name ' this is a variant
或者,當(dāng)前模塊下沒(méi)有聲明Option Explicit語(yǔ)句時(shí),任何變量都是Variants類(lèi)型。
許多開(kāi)發(fā)者,特別是那些先前是C程序員的人,都會(huì)深信下面的語(yǔ)句將聲明2個(gè)Interger類(lèi)型變量:
Dim x, y As Integer
而實(shí)際上,x被聲明為了variant類(lèi)型。由于variant類(lèi)型變量要比Integer類(lèi)型慢很多,所以要特別注意這種情況。正確的一行聲明方法是:
Dim x As Integer, y As Integer
GoSub在編譯程序中速度變慢
編譯為本地代碼的VB應(yīng)用程序中,如果使用 GoSubs 命令,就會(huì)比通常的 Subs 或者 Function 調(diào)用慢5-6倍;相反,如果是p-code模式,就會(huì)
相當(dāng)快。
減少DoEvents語(yǔ)句的數(shù)量
不要在代碼中放置不必要的DoEvents語(yǔ)句,尤其是在時(shí)間要求高的循環(huán)中。遵循這個(gè)原則,至少能在循環(huán)中的每N次反復(fù)時(shí)才執(zhí)行DoEvents語(yǔ)句
,從而增強(qiáng)效率。比如使用下面的語(yǔ)句:
If (loopNdx Mod 10) = 0 Then DoEvents
如果只是使用DoEvents來(lái)屏蔽鼠標(biāo)以及鍵盤(pán)操作,那么就可以在事件隊(duì)列中存在待處理項(xiàng)目時(shí)調(diào)用它。通過(guò)API函數(shù)GetInputState來(lái)檢查這個(gè)
條件的發(fā)生:
Declare Function GetInputState Lib "user32" Alias "GetInputState" () As Long
' ...
If GetInputState() Then DoEvents
為常量定義合適的類(lèi)型
VB在內(nèi)部使用最簡(jiǎn)單、最可能的數(shù)據(jù)類(lèi)型保存符號(hào)數(shù)值,這意味著最通常的數(shù)字類(lèi)型-比如0或者1-都按照Integer類(lèi)型存儲(chǔ)。如果在浮點(diǎn)表達(dá)
式中使用這些常量,可以通過(guò)常量的合適類(lèi)型來(lái)加速程序運(yùn)行,就象下面的代碼:
value# = value# + 1#.
這個(gè)語(yǔ)句強(qiáng)迫編譯器按照Double格式存儲(chǔ)常量,這樣就省卻了運(yùn)行時(shí)的隱含轉(zhuǎn)換工作。還有另外的一種處理方法就是:在常量聲明時(shí)就進(jìn)行相
應(yīng)類(lèi)型的定義,代碼如下:
Const ONE As Double = 1
And、Or和Xor:讓我們來(lái)優(yōu)化表達(dá)式
要檢測(cè)一個(gè)整數(shù)值的最高有效位是否有數(shù)值,通常要使用如下的代碼(有二種情況:第一組If判斷表明對(duì)Integer類(lèi)型,第二組對(duì)Long類(lèi)型):
If intValue And &H8000 Then
' most significant bit is set
End If
If lngValue And &H80000000 Then
' most significant bit is set
End If
但由于所有的VB變量都是有符號(hào)的,因此,最高有效位也是符號(hào)位,不管處理什么類(lèi)型的數(shù)值,通過(guò)下面的代碼就可以實(shí)現(xiàn)檢測(cè)目的:
If anyValue < 0 Then
' most significant bit is set
End If
另外,要檢測(cè)2個(gè)或者更多個(gè)數(shù)值的符號(hào),只需要通過(guò)一個(gè)Bit位與符號(hào)位的簡(jiǎn)單表達(dá)式就可以完成。下面是應(yīng)用這個(gè)技術(shù)的幾段具體代碼:
1、判斷X和Y是否為同符號(hào)數(shù)值:
If (x < 0 And y < 0) Or (x >= 0 And y >=0) Then ...
' the optimized approach
If (x Xor y) >= 0 Then
2、判斷X、Y和Z是否都為正數(shù)
If x >= 0 And y >= 0 And z >= 0 Then ...
' the optimized approach
If (x Or y Or z) >= 0 Then ...
3、判斷X、Y和Z是否都為負(fù)數(shù)
If x < 0 And y < 0 And z < 0 Then ...
' the optimized approach
If (x And y And z) < 0 Then ...
4、判斷X、Y和Z是否都為0
If x = 0 And y = 0 And z = 0 Then ...
' the optimized approach
If (x Or y Or z) = 0 Then ...
5、判斷X、Y和Z是否都不為0
If x = 0 And y = 0 And z = 0 Then ...
' the optimized approach
If (x Or y Or z) = 0 Then ...
要使用這些來(lái)簡(jiǎn)單化一個(gè)復(fù)雜的表達(dá)式,必須要完全理解boolean型的操作原理。比如,你可能會(huì)認(rèn)為下面的2行代碼在功能上是一致的:
If x <> 0 And y <> 0 Then
If (x And y) Then ...
然而我們可以輕易地證明他們是不同的,比如X=3(二進(jìn)制=0011),Y=4(二進(jìn)制=0100)。不過(guò)沒(méi)有關(guān)系,遇到這種情況時(shí),我們可以對(duì)
上面的代碼進(jìn)行局部?jī)?yōu)化,就能實(shí)現(xiàn)目的。代碼如下:
If (x <> 0) And y Then ...

(三)
態(tài)變量慢于動(dòng)態(tài)變量
在過(guò)程中引用靜態(tài)局部變量要比引用常規(guī)局部動(dòng)態(tài)變量慢2-3倍。要想真正地加速過(guò)程的執(zhí)行速度,最徹底的方法就是將所有的靜態(tài)變量轉(zhuǎn)換
為模塊級(jí)別變量。
這種方法的唯一不足是:過(guò)程很少是自包含的,如果要在其他工程中重用,就必須同時(shí)拷貝并粘貼這些模塊級(jí)別變量。
另外的一種處理方法是:在時(shí)間要求高的循環(huán)前,將靜態(tài)變量數(shù)值裝入動(dòng)態(tài)變量中。
善用"Assume No Aliasing"編譯選項(xiàng)
據(jù)說(shuō),如果過(guò)程能夠2次或多次引用同樣的內(nèi)存地址,那么過(guò)程就會(huì)包含別名數(shù)值。一個(gè)典型的例子如下:
Dim g_GlobalVariable As Long
...
Sub ProcWithAliases(x As Long)
x = x + 1
g_GlobalVariable = g_GlobalVariable + 1
End Sub
如果傳遞給這個(gè)過(guò)程g_GlobalVariable變量,則將通過(guò)一個(gè)直接引用以及x參數(shù)兩種方式修改變量的數(shù)值2次。
別名數(shù)值經(jīng)常是不良編程習(xí)慣的產(chǎn)物,對(duì)于程序優(yōu)化有害無(wú)益。事實(shí)上,如果能夠完全確認(rèn)應(yīng)用程序從來(lái)沒(méi)有使用到別名變量,就可以打開(kāi)"As
sume No Aliasing"高級(jí)編譯選項(xiàng),這將告知編譯器沒(méi)有過(guò)程可以修改同一內(nèi)存地址,使編譯器產(chǎn)生更加有效率的匯編代碼。更特別的是,編譯
程序?qū)⒃噲D緩沖這些數(shù)據(jù)到CPU的寄存器中,從而明顯地加速了程序運(yùn)行。
總結(jié)一下,當(dāng)遇到以下情況時(shí),就不會(huì)有別名數(shù)值:(1) 過(guò)程不引用任何全局變量 (2) 過(guò)程引用了全局變量,但從來(lái)不通過(guò)ByRef參數(shù)類(lèi)型傳
遞同一變量給過(guò)程 (3) 過(guò)程含有多個(gè)ByRef參數(shù)類(lèi)型,但從來(lái)不傳遞同一變量到其中的2個(gè)或者多個(gè)之中。
你真正理解"Allow Unrounded Floating Point Operations"選項(xiàng)的含義嗎?
來(lái)自微軟的資料鼓吹:高級(jí)優(yōu)化對(duì)話(huà)框中的所有編譯選項(xiàng)都被認(rèn)為是不穩(wěn)定的,它們可能導(dǎo)致不正確的結(jié)果,甚至程序崩潰。對(duì)于其中的大多
數(shù),這種說(shuō)法是正確的,但是經(jīng)常有一個(gè)叫做"Allow Unrounded Floating Point Operations"的選項(xiàng)能夠給予正確的結(jié)果,防止應(yīng)用程序產(chǎn)生
bug??紤]下面的代碼段:
Dim x As Double, y As Double, i As Integer
x = 10 ^ 18
y = x + 1 ' this can't be expressed with 64 bits
MsgBox (y = x) ' 顯示 "True" (不正確的結(jié)果)
嚴(yán)格地說(shuō),由于X和Y變量不包含相同的數(shù)值,MsgBox將顯示False。可問(wèn)題是,由于數(shù)值1E18與1E18+1都以相同的64位浮點(diǎn)Double類(lèi)型來(lái)表示
,它們最終包含了幾乎相同的數(shù)值,最后的MsgBox結(jié)果將是True。
如果打開(kāi)了"Allow Unrounded Floating Point Operations"編譯選項(xiàng),VB就能重用已在數(shù)學(xué)協(xié)處理器堆棧中的數(shù)值,而不是內(nèi)存中的數(shù)值(比
如:變量)。因?yàn)镕PU堆棧具備80位的精度,因此就可以區(qū)分出這2個(gè)數(shù)值的不同:
' if the program is compiled using the
' "Allow Unrounded Floating Point Operations" compiler option
MsgBox (y = x) ' 顯示 "False" (正確的結(jié)果)
總結(jié)一下:當(dāng)以解釋模式、或者編譯的p-code模式、或者編譯的native代碼模式但關(guān)掉"Allow Unrounded Floating Point Operations"選項(xiàng)
這3種方式運(yùn)行一個(gè)程序時(shí),所有浮點(diǎn)數(shù)字運(yùn)算在內(nèi)部都以80位的精度進(jìn)行處理。但如果有一個(gè)數(shù)值是存儲(chǔ)在64位Double變量中,結(jié)果就是接近
的了,并且,隨后使用那個(gè)變量的表達(dá)式也將產(chǎn)生近似的結(jié)果,而不是絕對(duì)正確的結(jié)果。
相反,如果打開(kāi)"Allow Unrounded Floating Point Operations"編譯選項(xiàng)后運(yùn)行一段native編譯代碼,在隨后的表達(dá)式中VB就經(jīng)常能重用內(nèi)部
的80位數(shù)值,而忽略存儲(chǔ)在變量中的當(dāng)前數(shù)值。注意:我們并不能完全控制這個(gè)功能,VB也許對(duì)此生效,也許就不生效,這要取決于表達(dá)式的
復(fù)雜程度以及最初分配數(shù)值語(yǔ)句與隨后產(chǎn)生結(jié)果的表達(dá)式語(yǔ)句的距離遠(yuǎn)近。
除法運(yùn)算符"\"與"/"的區(qū)別
整數(shù)間執(zhí)行除法運(yùn)算時(shí),要使用 "\" 而不是 "/"。 "/" 運(yùn)算符要求返回一個(gè)單一數(shù)值,所以,表面上看似簡(jiǎn)單的一行代碼:
C% = A% / B%
實(shí)際上包含了3個(gè)隱含的轉(zhuǎn)換操作:2個(gè)為除法運(yùn)算做準(zhǔn)備,從Integer轉(zhuǎn)換到Single;一個(gè)完成最后的賦值操作,從Integer轉(zhuǎn)換到Single。但
是如果使用了"\"操作符,情況就大不相同了!不僅不會(huì)有這么多中間步驟,而且執(zhí)行速度大大提高。
同時(shí)請(qǐng)記?。菏褂?/"操作符做除法運(yùn)算時(shí),如果其中之一是Double類(lèi)型,那么結(jié)果就將是Double類(lèi)型。所以,當(dāng)2個(gè)Integer或者Single類(lèi)型數(shù)
值做除法運(yùn)算時(shí),如果想得到高精度的結(jié)果,就需要手工強(qiáng)迫其中之一轉(zhuǎn)換為Double類(lèi)型:
'結(jié)果為 0.3333333
Print 1 / 3
'結(jié)果為 0,333333333333333
Print 1 / 3#
使用"$-類(lèi)型"字符串函數(shù)會(huì)更快
VB官方文檔似乎很鼓勵(lì)使用"無(wú)$"類(lèi)字符串函數(shù),比如:Left、LTrim或者UCase,而不是實(shí)現(xiàn)同樣功能的Left$、LTrim$和UCase$函數(shù)。但是我
們必須認(rèn)識(shí)到:前者返回variant類(lèi)型的數(shù)值,當(dāng)用于字符串表達(dá)式中時(shí),最終必須要轉(zhuǎn)換為字符串(string)類(lèi)型。
因此,在嚴(yán)格要求時(shí)間的代碼段中,我們應(yīng)該使用后者,它們將快5-10%。
(四)
妙用Replace函數(shù)替代字符串連接操作符&
你大概不知道Replace函數(shù)還能這么用吧?比如下面的語(yǔ)句:
MsgBox "Disk not ready." & vbCr & vbCr & _
"Please check that the diskette is in the drive" & vbCr & _
"and that the drive's door is closed."
可以看出,為了顯示完整的字符串含義,要將可打印字符與非打印字符(比如:回車(chē)符vbCr)用&符號(hào)連接在一起。結(jié)果是:長(zhǎng)長(zhǎng)的字符連接串
變得難于閱讀。但是,使用Replace函數(shù),可以巧妙地解決這個(gè)問(wèn)題。方法就是:將非打印字符以字符串中不出現(xiàn)的一個(gè)可打印字符表示,這樣
完整地寫(xiě)出整個(gè)字符串,然后使用Replace函數(shù)替換那個(gè)特別的打印字符為非打印字符(比如:回車(chē)符vbCr)。代碼如下:
MsgBox Replace("Disk not ready.§§Please check that the diskette is in the " _
& "drive§and that the drive's door is closed.", "§", vbCr)
固定長(zhǎng)度字符串?dāng)?shù)組:賦值快,釋放快!
固定長(zhǎng)度字符串的處理速度通常慢于可變長(zhǎng)度字符串,這是因?yàn)樗械腣B字符串函數(shù)和命令只能識(shí)別可變長(zhǎng)度字符串。因此,所有固定長(zhǎng)度字
符串比然被轉(zhuǎn)換為可變長(zhǎng)度字符串。
但是,由于固定長(zhǎng)度字符串?dāng)?shù)組占據(jù)著一塊連續(xù)的內(nèi)存區(qū)域,因此在被分配以及釋放時(shí),速度明顯快于可變長(zhǎng)度的數(shù)組。比如:在一個(gè)Pentium
233MHz機(jī)器上,對(duì)于一個(gè)固定長(zhǎng)度為100,000的數(shù)組,給其中30個(gè)位置分配數(shù)值,大約只花費(fèi)半秒種的時(shí)間。而如果是可變長(zhǎng)度的數(shù)組,同樣的
操作要耗費(fèi)8秒之多!后者的刪除操作耗時(shí)大約0.35秒,但固定長(zhǎng)度的數(shù)組幾乎可以立即“斃命”!如果應(yīng)用程序中涉及到這么大的一個(gè)數(shù)組操
作,選擇固定長(zhǎng)度方式數(shù)組絕對(duì)是確定無(wú)疑的了,無(wú)論是分配數(shù)值,還是釋放操作,都可以風(fēng)馳電掣般完成。
未公開(kāi)的返回?cái)?shù)組型函數(shù)加速秘訣
在VB6中,函數(shù)是能夠返回?cái)?shù)組對(duì)象的。這種情況下,我們不能象返回對(duì)象或者數(shù)值的其他函數(shù)一樣使用函數(shù)名當(dāng)做局部變量來(lái)存儲(chǔ)中間結(jié)果,
因此不得不生成一個(gè)臨時(shí)局部數(shù)組,函數(shù)退出前再分配這個(gè)數(shù)組給函數(shù)名,就象下面的代碼一樣:
' 返回一個(gè)數(shù)組,其中含有N個(gè)隨即元素
' 并且將平均值保存在A(yíng)VG中
Function GetRandomArray(ByVal n As Long, avg As Single) As Single()
Dim i As Long, sum As Single
ReDim res(1 To n) As Single
' 以隨機(jī)數(shù)填充數(shù)組,并計(jì)算總和
Randomize Timer
For i = 1 To n
res(i) = Rnd
sum = sum + res(i)
Next
' 賦值結(jié)果數(shù)組,計(jì)算平均值
GetRandomArray = res
avg = sum / n
End Function
難以置信的是,只需要簡(jiǎn)單地顛倒最后2條語(yǔ)句的順序,就能使上面這段程序變得快些:
' ... ' 賦值結(jié)果數(shù)組,計(jì)算平均值
avg = sum / n
GetRandomArray = res
End Function
例如,在一個(gè)Pentium II 333MHz 機(jī)器上,當(dāng)N=100,000時(shí),前段程序運(yùn)行時(shí)間為0.72秒,后段程序則為0.66秒,前后相差10%。
原因何在呢?前段程序中,VB將拷貝res數(shù)組到GetRandomArray對(duì)應(yīng)的結(jié)果中,當(dāng)數(shù)組很大時(shí),花費(fèi)的時(shí)間是很長(zhǎng)的。后段程序中,由于GetRan
domArray = res是過(guò)程的最后一條語(yǔ)句,VB編譯器就能確認(rèn)res數(shù)組不會(huì)被再使用,因此將直接交換res和GetRandomArray的地址數(shù)值,從而節(jié)
省了數(shù)組元素的物理拷貝操作以及隨后的res數(shù)組釋放操作。
總結(jié)如下:當(dāng)編寫(xiě)返回?cái)?shù)組的函數(shù)時(shí),一定要將分配臨時(shí)數(shù)組到函數(shù)名的語(yǔ)句放在最后,就是其后緊挨者Exit Function 或者End Function的
位置。
深入使用LIKE操作符
在VB中,相對(duì)于本身的潛在功能,LIKE可能是最被忽視的一個(gè)操作符了。它的最基本用途是檢查一個(gè)字符串與給定樣式的匹配程度。比如,很
容易檢查一個(gè)產(chǎn)品ID號(hào)是否由一個(gè)字母以及3個(gè)數(shù)字組成:
If ProductID Like "[A-Za-z][0-9][0-9][0-9]" Then Print "OK"
' this is equivalment, because "#" stands for a digit
If ProductID Like "[A-Za-z]###" Then Print "OK"
除了上述基本功能,LIKE在其他情況下也非常有用。以下就一一列舉:
比如,可以檢查一個(gè)字符串只包含大寫(xiě)字母:
If Not ProductID Like "*[!A-Z]*" Then Print "OK"
同理,也可以檢查一個(gè)字符串只包含數(shù)字:
If Not ProductID Like "*[!0-9]*" Then Print "OK"
下面的語(yǔ)句檢查一個(gè)字符串只包含字母或者數(shù)字符:
If Not ProductID Like "*[!A-Za-z0-9]*" Then Print "OK"
下面的語(yǔ)句檢查一個(gè)字符串是否為合法的VB變量名,就是說(shuō),開(kāi)頭是一個(gè)字母,接著跟隨字母或數(shù)字符:
' VarName是被檢查的字符串
If VarName like "[A-Za-z]*" And Not Mid$(VarName, 2) Like "*[!A-Z_a-z0-9]*" _
Then Print "OK"
下面的語(yǔ)句檢查字符串是否至少包含2個(gè)空格(連續(xù)的或者間隔的):
If TestString Like "* * *" Then Print "OK"
而下面的語(yǔ)句進(jìn)一步確認(rèn)2個(gè)空格是不連續(xù)的:
If TestString Like "* ?* *" Then Print "OK"
檢查一個(gè)有符號(hào)整數(shù)是很復(fù)雜的事情,因?yàn)楸仨氂?jì)算出前導(dǎo)符號(hào)并且計(jì)算好"#"符號(hào)的正確數(shù)目:
' NumValue是被檢測(cè)的字符串
If NumValue Like "#" Or (Len(NumValue) > 1 And NumValue Like "[-+0-9]" & _
String$(Len(NumValue) - 1, "#")) Then Print "OK"
最后一個(gè)例子是:檢測(cè)NumValue是否包含一個(gè)有符號(hào)的十進(jìn)制數(shù)值。這種情況下,我們必須要確定存在一個(gè)前導(dǎo)符號(hào)以及只有一個(gè)十進(jìn)制分隔
符,并且所有其他字符都是數(shù)字符:
' NumValue是被檢測(cè)的字符串
If NumValue Like "#" Or (Len(NumValue) > 1 And Left$(NumValue, _
1) Like "[-+.0-9]" And Not Mid$(NumValue, 2) Like "*[!.0-9]*" And Not _
NumValue Like "*.*.*" ) Then Print "OK"
創(chuàng)建任意長(zhǎng)度重復(fù)字符串的簡(jiǎn)潔方法
String$函數(shù)只能重復(fù)復(fù)制單字符,當(dāng)需要重復(fù)復(fù)制2個(gè)或多個(gè)字符時(shí),就需要一個(gè)循環(huán)??雌饋?lái)是否很麻煩?然而,使用以下的函數(shù)就能解決
這個(gè)問(wèn)題。基本思路是:建立一個(gè)空格字符串,其長(zhǎng)度為要重復(fù)復(fù)制的數(shù)目,然后替換每一個(gè)空格為要復(fù)制的字符串:
Function ReplicateString(Source As String, Times As Long) As String
ReplicateString = Replace$(Space$(Times), " ", Source)
End Function
但是請(qǐng)注意:根據(jù)字符串的長(zhǎng)度以及重復(fù)的數(shù)目,這個(gè)方法也許比傳統(tǒng)的循環(huán)方法要慢些。
(五)
另辟蹊徑處理字符串中的字符:字節(jié)數(shù)組法
當(dāng)要處理字符串中的每一個(gè)字符時(shí),可以將字符串賦值到一個(gè)byte數(shù)組中進(jìn)行操作。要記住:每一個(gè)Unicode字符對(duì)應(yīng)雙字節(jié)。這種方法通常要
快許多,因?yàn)楣?jié)省了大量的Mid$函數(shù)操作以及大量的臨時(shí)字符串空間。下面的代碼是統(tǒng)計(jì)字符串中空格數(shù)目的最快方法
Dim b() as Byte, count As Integer
b() = source$
For i = 0 to UBound(b) Step LenB("A")
If b(i) = 32 Then count = count + 1
Next
請(qǐng)注意上面代碼中LenB()函數(shù)的特殊用法:在VB4(32位)、VB5和VB6中它返回?cái)?shù)值2, 在VB4(16位)中返回?cái)?shù)值1。因此,我們就可以使用同
一代碼段,而無(wú)需#If編譯指令。
快速清除數(shù)組部分內(nèi)容
清除動(dòng)態(tài)數(shù)組的最快方法是使用ReDim,清除靜態(tài)數(shù)組則是使用刪除。但是如果只想清除數(shù)組的一部分內(nèi)容,怎么辦呢?看上去似乎只能使用Fo
r-Next循環(huán)了。
如果處理的是數(shù)字?jǐn)?shù)組,有一個(gè)較快的方法。它基于ZeroMemory API函數(shù),正如函數(shù)名所示,它能將一塊內(nèi)存區(qū)域填充為0??纯丛趺磻?yīng)用這個(gè)
函數(shù)來(lái)清除一個(gè)Long類(lèi)型數(shù)組的一部分內(nèi)容:
Private Declare Sub ZeroMemory Lib "kernel32" Alias "RtlZeroMemory" (dest As _
Any, ByVal Bytes As Long)
'定義數(shù)組,填充數(shù)據(jù)
Dim a(1000) As Long
For i = 1 To UBound(a)
a(i) = i
Next
'從a(200)開(kāi)始清除100個(gè)元素內(nèi)容
ZeroMemory a(200), 100 * Len(a(1))
請(qǐng)注意上述代碼中清除長(zhǎng)度的表示方法,使用Len()函數(shù)保證了當(dāng)數(shù)組類(lèi)型改變時(shí)代碼仍然有效。
快速初始化Variant和String類(lèi)型數(shù)組
VB中沒(méi)有提供定義數(shù)組并同時(shí)初始化其內(nèi)容的方法,所以大多數(shù)情況下,必須單獨(dú)地設(shè)置每一個(gè)元素,就象下面一樣:
Dim strArray(0 To 3) As String
strArray(0) = "Spring"
strArray(1) = "Summer"
strArray(2) = "Fall"
strArray(3) = "Winter"
在VB4、VB5和VB6中,可以使用Array()函數(shù)隨意創(chuàng)建一個(gè)Variants類(lèi)型數(shù)組:
Dim varArray() As Variant
varArray() = Array("Spring", "Summer", "Fall", "Winter")
但卻沒(méi)有同樣的函數(shù)能創(chuàng)建非Variant類(lèi)型數(shù)組。但是我們發(fā)現(xiàn),在VB6中可以使用Split()函數(shù)創(chuàng)建字符串?dāng)?shù)組:
Dim varArray() As String
'由Split建立的數(shù)組下標(biāo)通常是從0開(kāi)始的
varArray() = Split("Spring;Summer;Fall;Winter", ";")
在VB6中,同樣能充分利用函數(shù)返回?cái)?shù)組的能力,創(chuàng)建數(shù)組初始化程序段。比如下面的代碼段:
Function ArrayInt(ParamArray values() As Variant) As Integer()
Dim i As Long
ReDim res(0 To UBound(values)) As Integer
For i = 0 To UBound(values)
res(i) = values(i)
Next
ArrayInt = res()
End Function
同時(shí),也可以創(chuàng)建一個(gè)子程序段來(lái)檢測(cè)傳遞給它的數(shù)值的類(lèi)型,并返回正確類(lèi)型的數(shù)組。這種情況下,函數(shù)應(yīng)該定義為返回Variant。
訪(fǎng)問(wèn)簡(jiǎn)單變量總是快于數(shù)組元素值
讀寫(xiě)數(shù)組中的元素速度通常都慢于訪(fǎng)問(wèn)一個(gè)簡(jiǎn)單變量,因此,如果在一個(gè)循環(huán)中要重復(fù)使用同一數(shù)組元素值,就應(yīng)該分配數(shù)組元素值到臨時(shí)變
量中并使用這個(gè)變量。下面舉一個(gè)例子,檢測(cè)整數(shù)數(shù)組中是否存在重復(fù)項(xiàng):
Function AnyDuplicates(intArray() As Integer) As Boolean
'如果數(shù)組包含重復(fù)項(xiàng),返回True
Dim i As Long, j As Long,
Dim lastItem As Long
Dim value As Integer
'只計(jì)算機(jī)UBound()一次
lastItem = UBound(intArray)
For i = LBound(intArray) To lastItem
' 保存intArray(i)到非數(shù)組變量中
value = intArray(i)
For j = i + 1 To lastItem
If value = intArray(j) Then
AnyDuplicates = True
Exit Function
End If
Next
Next
'沒(méi)有發(fā)現(xiàn)重復(fù)項(xiàng)
AnyDuplicates = False
End Function
上述程序有2層循環(huán),通過(guò)緩存intArray(i)的數(shù)值到一個(gè)普通的、非數(shù)組變量中,節(jié)省了CPU運(yùn)行時(shí)間。經(jīng)測(cè)試,這將提高80%的速度。
創(chuàng)建新表時(shí),快速拷貝字段
在VB6中,無(wú)需離開(kāi)開(kāi)發(fā)環(huán)境就可以創(chuàng)建新的SQL Server和Oracle表。方法很簡(jiǎn)單:打開(kāi)DataView窗口,用鼠標(biāo)右鍵單擊數(shù)據(jù)庫(kù)的表文件夾,再
選擇新表格菜單命令。
當(dāng)處理相似表格時(shí),就是說(shuō)具有許多相同字段的表格,我們完全可以在很短的時(shí)間內(nèi)容完成設(shè)定操作。具體步驟是:在設(shè)計(jì)模式下打開(kāi)源表格
,加亮選擇要拷貝字段對(duì)應(yīng)的行,按Ctrl-C拷貝信息到粘貼板;然后,在設(shè)計(jì)模式打開(kāi)目標(biāo)表格,將光標(biāo)置于要粘貼字段所在的位置,按Ctrl-
V。
這樣,就拷貝了所有的字段名稱(chēng)以及它們所帶的屬性。
(六)
無(wú)閃爍地快速附加字符串到textbox控件
附加文本到TextBox或者RichTextBox控件的通常方法是在當(dāng)前內(nèi)容上連接上新的字符串:
Text1.Text = Text1.Text & newString
但還有一個(gè)更快的方法,并且會(huì)減少連接操作的閃爍感,代碼如下:
Text1.SelStart = Len(Text1.Text)
Text1.SelText = newString
快速找到選中的OptionButton
OptionButton控件經(jīng)常是作為控件數(shù)組存在的,要快速找到其中的哪一個(gè)被選中,可以使用下面的代碼:
'假設(shè)控件數(shù)組包含3個(gè)OptionButton控件
intSelected = Option(0).Value * 0 - Option(1).Value * 1 - Option(2).Value * 2
注意,因?yàn)榈谝粋€(gè)操作數(shù)總是0,所以上述代碼可以精簡(jiǎn)如下:
intSelected = -Option(1).Value - Option(2).Value * 2
表單及控件的引用阻止了表單的卸載
當(dāng)指派表單或者表單上的控件到該表單模塊以外的一個(gè)對(duì)象變量中時(shí),如果要卸載表單,就必須首先將那個(gè)變量設(shè)置為 to Nothing。也就是說(shuō)
,如果不設(shè)置為Nothing,即使看不到這個(gè)對(duì)象了,但它仍舊是保存在內(nèi)存中的。
注意:這并非是一個(gè)bug,這僅僅是COM引用規(guī)則的一個(gè)結(jié)果。唯一要注意的就是引用的這個(gè)控件將阻止整個(gè)表單的卸載操作,它將依賴(lài)于它的
父表單而存在。
重定義編譯DLL文件的基地址
許多VB開(kāi)發(fā)者都知道應(yīng)該在工程屬性對(duì)話(huà)框的“編譯”功能頁(yè)面中定義一個(gè)DLL基地址數(shù)值。這不同于工程中任何其他DLL或OCX的基地址。
當(dāng)操作沒(méi)有源代碼的編譯DLL或者OCX文件時(shí),可以使用EDITBIN程序修改它的基地址。EDITBIN程序隨Visual
Studio安裝后就有了,可以在主Visual Studio目錄的VC98\BIN目錄下找到它。比如,以下代碼重新設(shè)定一個(gè)編譯DLL文件的基地址為12000000
(16進(jìn)制):
EDITBIN /REBASE:BASE=0x12000000 myfile.dll
同樣,EDITBIN程序?qū)蓤?zhí)行文件也有一些處理技巧。
以下是該程序支持的完整功能選項(xiàng)列表(使用EDITBIN /? 可以列出這些):
/BIND[:PATH=path]
/HEAP:reserve[,commit]
/LARGEADDRESSAWARE[:NO]
/NOLOGO
/REBASE[:[BASE=address][,BASEFILE][,DOWN]]
/RELEASE
/SECTION:name[=newname][,[[!]{cdeikomprsuw}][a{1248ptsx}]]
/STACK:reserve[,commit]
/SUBSYSTEM:{NATIVE|WINDOWS|CONSOLE|WINDOWSCE|POSIX}[,#[.##]]
/SWAPRUN:{[!]CD|[!]NET}
/VERSION:#[.#]
/WS:[!]AGGRESSIVE
快速調(diào)入TreeView控件以及ListView控件的子項(xiàng)內(nèi)容
有一個(gè)簡(jiǎn)單但仍未發(fā)現(xiàn)的技巧可用于在TreeView控件中裝載多個(gè)節(jié)點(diǎn),或者在ListView控件中裝載多個(gè)ListItems。這種方法要比傳統(tǒng)做法快。
先看看下面這個(gè)傳統(tǒng)方法:
For i = 1 To 5000
TreeView1.Nodes.Add , , , "Node " & i
Next
改進(jìn)一下,代替重復(fù)引用TreeView1對(duì)象的Nodes集合,我們可以先將之保存在臨時(shí)對(duì)象變量中:
Dim nods As MSComctlLib.Nodes
Set nods = TreeView1.Nodes
For i = 1 To 5000
nods.Add , , , "Node " & i
Next
甚至,如果使用With代碼塊,還可以不需要臨時(shí)變量:
With TreeView1.Nodes
For i = 1 To 5000
.Add , , , "Node " & i
Next
End With
經(jīng)測(cè)試,優(yōu)化的循環(huán)代碼要比傳統(tǒng)方法執(zhí)行速度快40%左右。原因在于:將Nodes集合對(duì)象保存在臨時(shí)變量中,或者應(yīng)用With代碼塊后VB將使用
隱藏的臨時(shí)變量后,就可以避免在循環(huán)中重復(fù)綁定Nodes對(duì)象到它的父TreeView1對(duì)象上。由于這種綁定是低效率的,因此省卻它就能節(jié)省大量
的執(zhí)行時(shí)間。
同樣的道理對(duì)于其他ActiveX控件也生效:

ListView控件的ListItems、ListSubItems以及ColumnHeaders集合
Toolbar控件的Buttons和ButtonMenus集合
ImageList的ListImages集合
StatusBar控件的Panels集合
TabStrip控件的Tabs集合
(七)

Friend過(guò)程快于Public過(guò)程
你可能會(huì)非常驚奇:Friend類(lèi)型過(guò)程的執(zhí)行速度要明顯快于Public類(lèi)型。這可以通過(guò)創(chuàng)建一個(gè)帶有Private類(lèi)和Public類(lèi) (設(shè)定Instancing =
MultiUse)的ActiveX EXE工程看到,在2個(gè)類(lèi)模塊中添加下面的代碼:
Public Sub PublicSub(ByVal value As Long)
'
End Sub
Public Function PublicFunction(ByVal value As Long) As Long
'
End Function
Friend Sub FriendSub(ByVal value As Long)
'
End Sub
Friend Function FriendFunction(ByVal value As Long) As Long
'
End Function
然后,在表單模塊中創(chuàng)建一個(gè)循環(huán),執(zhí)行每個(gè)例程許多次。比如,要在一個(gè)Pentium
II機(jī)器上查看執(zhí)行時(shí)間上的區(qū)別,可以調(diào)用每個(gè)例程1,000,000次。下面是測(cè)試的結(jié)果:
Private類(lèi)模塊中,反復(fù)調(diào)用1,000,000次Public Sub或者Function耗費(fèi)了0.46秒,而調(diào)用內(nèi)容相同的Friend類(lèi)型模塊則分別只有0.05秒和0.06
秒。前后竟然相差了8-9倍之多!對(duì)于MultiUse類(lèi)型的Public類(lèi)模塊,也是一樣的結(jié)果。
對(duì)于這個(gè)不可思議的結(jié)果的可能解釋是:Friend型過(guò)程沒(méi)有處理匯集和拆裝代碼的消耗(Public過(guò)程可以從當(dāng)前工程外被調(diào)用,因此COM必須要
來(lái)回地匯集數(shù)據(jù))。
但是在多數(shù)情況下,這些時(shí)間差別是不明顯的,特別是程序中包含一些復(fù)雜和耗時(shí)的語(yǔ)句時(shí)。
即使這樣,F(xiàn)riend型過(guò)程仍有其他的優(yōu)勢(shì)高于Public類(lèi)型,比如:接受和返回在BAS模塊中定義的UDT變量的能力。
使用Objptr函數(shù)快速查找集合中的對(duì)象
ObjPtr函數(shù)的一個(gè)最簡(jiǎn)單但是卻最有效的用途就是提供快速尋找集合中對(duì)象的關(guān)鍵字。假設(shè)有一個(gè)對(duì)象集合,它沒(méi)有可以當(dāng)做關(guān)鍵字以從集合
中取回的屬性。那么,我們就可以使用ObjPtr函數(shù)的返回值作為集合中的關(guān)鍵字:
Dim col As New Collection
Dim obj As CPerson
'創(chuàng)建新的CPerson對(duì)象,并添加到集合中
Set obj = New CPerson
obj.Name = "John Smith"
col.Add obj, CStr(ObjPtr(obj)) '關(guān)鍵字必須是字符串
因?yàn)槿魏螌?duì)象都有一個(gè)明確的ObjPtr數(shù)值,而且它是不變的,所以,我們可以容易地、快速地從集合中取回它:
' 刪除集合中的對(duì)象
col.Remove CStr(ObjPtr(obj))
這個(gè)技巧可以適用于任何類(lèi)型的對(duì)象,包括VB中的表單和控件,以及外部對(duì)象。
使用ObjPtr檢測(cè)2個(gè)對(duì)象變量是否指向同一對(duì)象
判斷2個(gè)對(duì)象變量釋放指向同一對(duì)象的方法是使用Is操作符,代碼如下:
If obj1 Is obj2 Then ...
但當(dāng)2個(gè)對(duì)象是同一類(lèi)型時(shí),或者指向同一個(gè)二級(jí)接口時(shí),我們就可以利用ObjPtr()函數(shù)對(duì)代碼進(jìn)行一些優(yōu)化處理:
If ObjPtr(obj1) = ObjPtr(obj2) Then ...
后者的執(zhí)行速度將比前種方法快40%多。但是請(qǐng)注意,2種方法原本就是很有效率的,只有在時(shí)間要求非常嚴(yán)格的上百成千次的循環(huán)中,才會(huì)體
現(xiàn)出這種差別。
讀取文件內(nèi)容的簡(jiǎn)潔方法
讀取text文件的最快方法是使用Input$函數(shù),就象下面的過(guò)程:
Function FileText (filename$) As String
Dim handle As Integer
handle = FreeFile
Open filename$ For Input As #handle
FileText = Input$(LOF(handle), handle)
Close #handle
End Function
使用上述方法要比使用Input命令讀取文件每一行的方法快很多。下面是應(yīng)用這個(gè)函數(shù)讀取Autoexec.bat的內(nèi)容到多行textbox控件的例子:
Text1.Text = FileText("c:\autoexec.bat")
但請(qǐng)注意:當(dāng)文件包含Ctrl-Z(EOF)字符時(shí),上面的函數(shù)代碼可能會(huì)發(fā)生錯(cuò)誤。因此,要修改一下代碼:
Function FileText(ByVal filename As String) As String
Dim handle As Integer
' 判斷文件存在性
If Len(Dir$(filename)) = 0 Then
Err.Raise 53 '文件沒(méi)有找到
End If
' 以binary模式打開(kāi)文件
handle = FreeFile
Open filename$ For Binary As #handle
' 讀取內(nèi)容,關(guān)閉文件
FileText = Space$(LOF(handle))
Get #handle, , FileText
Close #handle
End Function
字體對(duì)象克隆招法
當(dāng)要應(yīng)用一個(gè)控件的字體到另一控件時(shí),最直接的方法就是直接賦值:
Set Text2.Font = Text1.Font
但多數(shù)情況下這種方法并不奏效,因?yàn)檫@實(shí)際上是將同一字體的引用分配給了2個(gè)控件。換言之,當(dāng)隨后修改其中之一控件的字體時(shí),另外一個(gè)
控件也受到影響。因此,要實(shí)現(xiàn)我們的目的,需要做的就是克隆字體對(duì)象并賦值給需要的控件。
最簡(jiǎn)單的克隆字體的方法是手工地拷貝所有單獨(dú)的字體屬性,就象下面一樣:
Function CloneFont(Font As StdFont) As StdFont
Set CloneFont = New StdFont
CloneFont.Name = Font.Name
CloneFont.Size = Font.Size
CloneFont.Bold = Font.Bold
CloneFont.Italic = Font.Italic
CloneFont.Underline = Font.Underline
CloneFont.Strikethrough = Font.Strikethrough
End Function
'函數(shù)的應(yīng)用
Set Text2.Font = CloneFont(Text1.Font)
如果使用VB6,就可以使用PropertyBag對(duì)象快速拷貝所有字體屬性,并且代碼會(huì)很簡(jiǎn)練、速度也快2倍:
Function CloneFont(Font As StdFont) As StdFont
Dim pb As New PropertyBag
'拷貝字體到PropertyBag對(duì)象中
pb.WriteProperty "Font", Font
恢復(fù)字體對(duì)象到新控件
Set CloneFont = pb.ReadProperty("Font")
End Function
但是我們還能進(jìn)一步地對(duì)代碼進(jìn)行優(yōu)化,方法就是使用可被所有StdFont對(duì)象識(shí)別的隱藏IFont接口。這個(gè)接口具有一個(gè)Clone方法,用它就可以
精確地實(shí)現(xiàn)我們的目的。它以非正常方式執(zhí)行:創(chuàng)建一個(gè)克隆Font對(duì)象,然后返回相應(yīng)的引用。這可能是實(shí)現(xiàn)克隆目的的最簡(jiǎn)潔代碼了,而且
,執(zhí)行速度也是這里列舉的3種方法中最快的一個(gè),要比使用PropertyBag對(duì)象的方法快大約3倍左右。來(lái)看看具體代碼:
Function CloneFont(Font As IFont) As StdFont
Font.Clone CloneFont
End Function
 
本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/sxycgxj/archive/2006/03/08/618531.aspx
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
VBA基礎(chǔ)05--變量
如何提高質(zhì)量的VB代碼的質(zhì)量
VB中的變量和數(shù)組
我的VB感受 作者:梁利鋒
VB編程步步高-雜類(lèi)篇(一)
VB 字節(jié)數(shù)組和字符串的轉(zhuǎn)換問(wèn)題 (String<>Byte)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服