[計(jì)算機(jī)軟件及應(yīng)用]VB代碼大全1_第1頁
[計(jì)算機(jī)軟件及應(yīng)用]VB代碼大全1_第2頁
[計(jì)算機(jī)軟件及應(yīng)用]VB代碼大全1_第3頁
[計(jì)算機(jī)軟件及應(yīng)用]VB代碼大全1_第4頁
[計(jì)算機(jī)軟件及應(yīng)用]VB代碼大全1_第5頁
已閱讀5頁,還剩37頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、隱藏form1: h7nb17gsl form1.hide xjf 6q :+ 5o 顯示form1: tvc9z form1.show ro*lgi 53gk?4o - f#ap|vd c+,eaz 退出程序時(shí),彈出窗口提示是否要退出: 3#r%z=q 124fwc private sub form_unload(cancel as integer) w5l#hu1; dim ianswer as integer ca.k3,vpbk - 9ds3|r k (t%? 只能用任務(wù)管理器關(guān)閉程序的代碼: i.ncufm8 private sub from_unload(cancel as int

2、eger) no.ih cancel = true ?,|b6m,u/ end sub ssm(b 31czlmmt - c?e7#ei ywb 點(diǎn)擊command1打開33iq網(wǎng): x-y9(|tj .m8j5yk dim strurl ?0zz4 e7d/equ private sub command1_click() 9e=97 nh label1 (.caption) = label2 (.caption) zf+e:7 er67pmn 注:是變動(dòng)值(被替換值) = 數(shù)據(jù)值(參考值、不變值),別搞反了。 qb4y, ug 如 label1 = 1 而不是 1 = label1 pc01

3、m7ic of*k1t8 - # c0+5n mkioaewg open cd1.filename for output as #1 opz_eg (l print #1, text1.text |9_8s& close #1 s&5ebr& end if i8bqbx 9mjri*o - 5kc7wo,?v 3tnjjrd 把某文本文件讀取到text1 !lgm=5 % rw%a/b dim tmp$ i86p8. cd1.showopen hnsinq!m if not cd1.filename = then !)=$2w&ki open cd1.filename for input as

4、 #1 yh5yj1.mc close #1 bi%xa text1 = tmp jg$2nyh end if /l=t|kls tavlx x - pj; lo _s c d 點(diǎn)擊command1彈出窗口(紅色處請(qǐng)?zhí)鎿Q成你要的內(nèi)容) p.v&,p5o ites9 function a() as string cdj9y dim b(2) as string e3eqfe 7q b(0) = 1 $kesb i b(1) = 2 o?pzygp b(2) = 3 afcsn; q randomize az %i a = b(rnd * 2) ybezzadg end function +rb;

5、(fc ab,b wg private sub command1_click() v87a label1.caption = a idsbztt end sub ,u!du !?gw?qq& 刪除d:1.txt: vd5(h=:l kill d:1.txt l$zj i x8hk* 7 新建文件夾d:123: dr2/113 mkdir d:123 e&nluu /bnost 復(fù)制文件,由桌面的1.txt復(fù)制到d:1.txt: %tv!/m filecopy c:documents and settingsadministrator桌面1.txt, d:1.txt 4.x?7ox_8d 7_r

6、 v jgze# app.title =這是標(biāo)題 42dg#ux 在 任務(wù)管理器-程序 中此vb程序的名字,本例的標(biāo)題為“這是標(biāo)題” y0tadp)h y#*jwub app.taskvisible = false jtxnaf+ 隱藏 任務(wù)管理器 中此vb程序的名字 p1oed?3/ exaz app.path *b4ggdj 此vb程序的所在文件夾路徑(如程序在“d:1.exe”,則此值為“d:”,沒有“” ) khg+sr 6 bwv4vqd* app.exename rqyoq;$) 此vb程序的文件名(如程序在“d:這是程序.exe”,則此值為“這是程序”,沒有“.exe”) mf!

7、v v vrk/rrx - h3l;) ) dfczvvt+ 一個(gè)小程序,類似病毒(不要運(yùn)行!僅供參考)。新建工程,放入一個(gè)timer控件,改interval值為1,然后輸入以下代碼即可: lmb,swt iu4e=%a x=2$_bi ;jmg private sub form_load() cu |j= app.title = .o3qc9h- app.taskvisible = false q$7/kq filecopy app.path & & app.exename & .exe, c:documents and settingsadministrator開始菜單程序啟動(dòng) & app

8、.exename & .exe r= x v_ end sub ild 2 c2!qpl 6qun+mv private sub timer1_timer() u&c x form1.show =$#5ohr: end sub 6 pih(- 用mid$命令超速字符串添加操作 大家都知道,&操作符的執(zhí)行速度是相當(dāng)慢的,特別是處理長字符串時(shí)。當(dāng)必須重復(fù)地在同一變量上附加字符時(shí),有一個(gè)基于mid$命令的技巧可以使用?;舅悸肪褪牵侯A(yù)留一個(gè)足夠長的空間存放操作的結(jié)果。下面是應(yīng)用這個(gè)技術(shù)的一個(gè)例子。假設(shè)要建立一個(gè)字符串,它要附加從1開始的10000個(gè)整數(shù):1 2 3 4 5 6 7 . 9999100

9、00。下面是最簡單的實(shí)現(xiàn)代碼:res = for i = 1 to 10000: res = res & str(i): nextface=宋體代碼雖然簡單,但問題也很明顯:res變量將被重分配10000次。下面的代碼實(shí)現(xiàn)同樣的目的,但效果明顯好轉(zhuǎn):dim res as stringdim i as longdim index as long預(yù)留足夠長的緩沖空間res = space(90000)指針變量,指出在哪里插入字符串index = 1循環(huán)開始for i = 1 to 10000substr = str(i)length = len(substr)填充字符串的相應(yīng)區(qū)間段數(shù)值mid$(r

10、es, index, length) = substr調(diào)整指針變量index = index + lengthnext刪除多余字符res = left$(res, index - 1)測試表明:在一個(gè)333mhz的計(jì)算機(jī)上,前段代碼執(zhí)行時(shí)間為2.2秒,后者僅僅為0.08秒!代碼雖然長了些,可是速度卻提高了25倍之多。呵呵,由此看來:代碼也不可貌相啊從頭開始刪除集合項(xiàng)目刪除集合中的所有內(nèi)容有許多方法,其中有些非常得迅速。來看看一個(gè)包含10,000個(gè)項(xiàng)目的集合:dim col as new collection, i as longfor i = 1 to 10000 col.add i, cst

11、r(i)next可以從末尾位置為起點(diǎn)刪除集合內(nèi)容,如下:for i = col.count to 1 step -1col.remove inext也可以從開始位置為起點(diǎn)刪除集合內(nèi)容,如下:for i = 1 to col.count step 1col.remove inextface=宋體試驗(yàn)證明,后者要快于前者百倍多,比如0.06秒比4.1秒。原因在于:當(dāng)引用接近末尾位置的集合項(xiàng)目時(shí),vb必須要從第1個(gè)項(xiàng)目開始遍歷整個(gè)的項(xiàng)目鏈。 face=宋體更有趣的是,如果集合項(xiàng)目的數(shù)量加倍,那么從末尾開始刪除與從頭開始刪除,前者要比后者花費(fèi)的時(shí)間將成倍增長,比如前者是24秒,后者可能為0.12秒這么

12、短!最后提醒您:刪除集合的所有內(nèi)容的最快方法就是“毀滅”它,使用下面的語句: set col = new collection對(duì)于一個(gè)包含20,000個(gè)項(xiàng)目的集合,上述操作僅僅耗時(shí)0.05秒,這比使用最快的循環(huán)操作進(jìn)行刪除也要快2倍左右。用instr函數(shù)實(shí)現(xiàn)代碼減肥 可以采用“旁門左道”的方式使用instr函數(shù)實(shí)現(xiàn)代碼的簡練。下面是一個(gè)典型的例子,檢測字符串中是否包含一個(gè)元音字母:1、普通的方法:if ucase$(char) = a or ucase$(char) = e or ucase$(char) = i or ucase$(char) = o or ucase$(char) = u

13、then it is a vowelend if2、更加簡練的方法:if instr(aaeeiioouu, char) then it is a vowelend if同樣,通過單詞中沒有的字符作為分界符,使用instr來檢查變量的內(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 seasons nameend if2、更加簡練的方法:if ins

14、tr(;winter;spring;summer;fall;, ; & word & ;) then it is a seasons nameend if有時(shí)候,甚至可以使用instr來替代selectcase代碼段,但一定要注意參數(shù)中的字符數(shù)目。下面的例子中,轉(zhuǎn)換數(shù)字0到9的相應(yīng)英文名稱為阿拉伯?dāng)?shù)字: 1、普通的方法:select case lcase$(word)case zeroresult = 0case oneresult = 1case tworesult = 2case threeresult = 3case fourresult = 4case fiveresult = 5ca

15、se sixresult = 6case sevenresult = 7case eightresult = 8case nineresult = 9end select2、更加簡練的方法: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語句結(jié)果。比如:if somevar someothervar thenboolval = truee

16、lseboolval = falseend if上面這段代碼就很煩瑣,它們完全可以使用下面的一行代碼來替代:boolval = (somevar someothervar)括號(hào)不是必須的,但可以增加可讀性。根據(jù)表達(dá)式中的操作數(shù)不同,后者比前者執(zhí)行起來大約快50%到85%。后者中的括號(hào)對(duì)速度沒有影響。有時(shí),使用這個(gè)技術(shù)實(shí)現(xiàn)代碼的簡練并非很明顯。關(guān)鍵是要牢記:所有的比較操作結(jié)果或者是0(false),或者是1(true)。所以,下面例子中的2段代碼是完全相同的,但是第2段要運(yùn)行得快些:1、傳統(tǒng)方法: if somevar someothervar thenx = x + 1end if2、更簡練的

17、方法x = x - (somevar someothervar)函數(shù)名巧做局部變量很多程序員都沒有認(rèn)識(shí)到“在函數(shù)本身中使用函數(shù)名”的妙處,這就象對(duì)待一個(gè)局部變量一樣。應(yīng)用這個(gè)技巧可以起到臨時(shí)變量的作用,有時(shí)還能加速程序運(yùn)行??纯聪旅娴拇a:function max(arr() as long) as longdim res as long, i as longres = arr(lbound(arr)for i = lbound(arr) + 1 to ubound(arr)if arr(i) res then res = arr(i)nextmax = resend function去掉re

18、s變量,使用函數(shù)名稱本身這個(gè)局部變量,可以使程序更加簡練:function max(arr() as long) as longdim i as longmax = arr(lbound(arr)for i = lbound(arr) + 1 to ubound(arr)if arr(i) max then max = arr(i)nextend function火眼識(shí)破隱藏的variant變量如果沒有用as語句聲明變量,默認(rèn)類型就是variants,比如:dim name this is a variant或者,當(dāng)前模塊下沒有聲明option explicit語句時(shí),任何變量都是varian

19、ts類型。許多開發(fā)者,特別是那些先前是c程序員的人,都會(huì)深信下面的語句將聲明2個(gè)interger類型變量:dim x, y as integer而實(shí)際上,x被聲明為了variant類型。由于variant類型變量要比integer類型慢很多,所以要特別注意這種情況。正確的一行聲明方法是:dim x as integer, y as integergosub在編譯程序中速度變慢編譯為本地代碼的vb應(yīng)用程序中,如果使用 gosubs 命令,就會(huì)比通常的 subs 或者 function 調(diào)用慢5-6倍;相反,如果是p-code模式,就會(huì)相當(dāng)快。減少doevents語句的數(shù)量不要在代碼中放置不必要的

20、doevents語句,尤其是在時(shí)間要求高的循環(huán)中。遵循這個(gè)原則,至少能在循環(huán)中的每n次反復(fù)時(shí)才執(zhí)行doevents語句,從而增強(qiáng)效率。比如使用下面的語句:if (loopndx mod 10) = 0 then doevents如果只是使用doevents來屏蔽鼠標(biāo)以及鍵盤操作,那么就可以在事件隊(duì)列中存在待處理項(xiàng)目時(shí)調(diào)用它。通過api函數(shù)getinputstate來檢查這個(gè)條件的發(fā)生:declare function getinputstate lib user32 alias getinputstate () as long .if getinputstate() then doevents

21、為常量定義合適的類型vb在內(nèi)部使用最簡單、最可能的數(shù)據(jù)類型保存符號(hào)數(shù)值,這意味著最通常的數(shù)字類型比如0或者1都按照integer類型存儲(chǔ)。如果在浮點(diǎn)表達(dá)式中使用這些常量,可以通過常量的合適類型來加速程序運(yùn)行,就象下面的代碼: value# = value# + 1#.這個(gè)語句強(qiáng)迫編譯器按照double格式存儲(chǔ)常量,這樣就省卻了運(yùn)行時(shí)的隱含轉(zhuǎn)換工作。還有另外的一種處理方法就是:在常量聲明時(shí)就進(jìn)行相應(yīng)類型的定義,代碼如下:const one as double = 1and、or和xor:讓我們來優(yōu)化表達(dá)式要檢測一個(gè)整數(shù)值的最高有效位是否有數(shù)值,通常要使用如下的代碼(有二種情況:第一組if判斷表明

22、對(duì)integer類型,第二組對(duì)long類型):if intvalue and &h8000 then most significant bit is setend ifif lngvalue and &h80000000 then most significant bit is setend if但由于所有的vb變量都是有符號(hào)的,因此,最高有效位也是符號(hào)位,不管處理什么類型的數(shù)值,通過下面的代碼就可以實(shí)現(xiàn)檢測目的:if anyvalue 0 then most significant bit is setend if另外,要檢測2個(gè)或者更多個(gè)數(shù)值的符號(hào),只需要通過一個(gè)bit位與符號(hào)位的簡單表達(dá)

23、式就可以完成。下面是應(yīng)用這個(gè)技術(shù)的幾段具體代碼:1、判斷x和y是否為同符號(hào)數(shù)值:if (x 0 and y = 0 and y =0) then . the optimized approachif (x xor y) = 0 then2、判斷x、y和z是否都為正數(shù)if x = 0 and y = 0 and z = 0 then . the optimized approachif (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 approachif (x and y and

24、 z) 0 then .4、判斷x、y和z是否都為0if x = 0 and y = 0 and z = 0 then . the optimized approachif (x or y or z) = 0 then .5、判斷x、y和z是否都不為0if x = 0 and y = 0 and z = 0 then . the optimized approachif (x or y or z) = 0 then .要使用這些來簡單化一個(gè)復(fù)雜的表達(dá)式,必須要完全理解boolean型的操作原理。比如,你可能會(huì)認(rèn)為下面的2行代碼在功能上是一致的:if x 0 and y 0 thenif (x

25、and y) then .然而我們可以輕易地證明他們是不同的,比如x3(二進(jìn)制0011),y4(二進(jìn)制0100)。不過沒有關(guān)系,遇到這種情況時(shí),我們可以對(duì)上面的代碼進(jìn)行局部優(yōu)化,就能實(shí)現(xiàn)目的。代碼如下:if (x 0) and y then .靜態(tài)變量慢于動(dòng)態(tài)變量 在過程中引用靜態(tài)局部變量要比引用常規(guī)局部動(dòng)態(tài)變量慢23倍。要想真正地加速過程的執(zhí)行速度,最徹底的方法就是將所有的靜態(tài)變量轉(zhuǎn)換為模塊級(jí)別變量。 這種方法的唯一不足是:過程很少是自包含的,如果要在其他工程中重用,就必須同時(shí)拷貝并粘貼這些模塊級(jí)別變量。 另外的一種處理方法是:在時(shí)間要求高的循環(huán)前,將靜態(tài)變量數(shù)值裝入動(dòng)態(tài)變量中。 善用ass

26、ume no aliasing編譯選項(xiàng) 據(jù)說,如果過程能夠2次或多次引用同樣的內(nèi)存地址,那么過程就會(huì)包含別名數(shù)值。一個(gè)典型的例子如下: dim g_globalvariable as long . sub procwithaliases(x as long) x = x + 1 g_globalvariable = g_globalvariable + 1 end sub 如果傳遞給這個(gè)過程g_globalvariable變量,則將通過一個(gè)直接引用以及x參數(shù)兩種方式修改變量的數(shù)值2次。 別名數(shù)值經(jīng)常是不良編程習(xí)慣的產(chǎn)物,對(duì)于程序優(yōu)化有害無益。事實(shí)上,如果能夠完全確認(rèn)應(yīng)用程序從來沒有使用到別名變

27、量,就可以打開assume no aliasing高級(jí)編譯選項(xiàng),這將告知編譯器沒有過程可以修改同一內(nèi)存地址,使編譯器產(chǎn)生更加有效率的匯編代碼。更特別的是,編譯程序?qū)⒃噲D緩沖這些數(shù)據(jù)到cpu的寄存器中,從而明顯地加速了程序運(yùn)行。 總結(jié)一下,當(dāng)遇到以下情況時(shí),就不會(huì)有別名數(shù)值:(1) 過程不引用任何全局變量 (2) 過程引用了全局變量,但從來不通過byref參數(shù)類型傳遞同一變量給過程 (3) 過程含有多個(gè)byref參數(shù)類型,但從來不傳遞同一變量到其中的2個(gè)或者多個(gè)之中。你真正理解allow unrounded floating point operations選項(xiàng)的含義嗎?來自微軟的資料鼓吹:高級(jí)

28、優(yōu)化對(duì)話框中的所有編譯選項(xiàng)都被認(rèn)為是不穩(wěn)定的,它們可能導(dǎo)致不正確的結(jié)果,甚至程序崩潰。對(duì)于其中的大多數(shù),這種說法是正確的,但是經(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 integerx = 10 18y = x + 1 this cant be expressed with 64 bitsmsgbox (y = x) 顯示 true (不正確的結(jié)果)嚴(yán)格地說,由于x和y變量不包含相同的數(shù)值,msgbox

29、將顯示false??蓡栴}是,由于數(shù)值1e18與1e181都以相同的64位浮點(diǎn)double類型來表示,它們最終包含了幾乎相同的數(shù)值,最后的msgbox結(jié)果將是true。如果打開了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

30、msgbox (y = x) 顯示 false (正確的結(jié)果)總結(jié)一下:當(dāng)以解釋模式、或者編譯的pcode模式、或者編譯的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é)果。相反,如果打開allow unrounded floating point operations編譯選項(xiàng)后運(yùn)行一段native編譯代碼,在隨后的表達(dá)式中

31、vb就經(jīng)常能重用內(nèi)部的80位數(shù)值,而忽略存儲(chǔ)在變量中的當(dāng)前數(shù)值。注意:我們并不能完全控制這個(gè)功能,vb也許對(duì)此生效,也許就不生效,這要取決于表達(dá)式的復(fù)雜程度以及最初分配數(shù)值語句與隨后產(chǎn)生結(jié)果的表達(dá)式語句的距離遠(yuǎn)近。除法運(yùn)算符與/的區(qū)別 整數(shù)間執(zhí)行除法運(yùn)算時(shí),要使用 而不是 /。 / 運(yùn)算符要求返回一個(gè)單一數(shù)值,所以,表面上看似簡單的一行代碼: 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í)行速度

32、大大提高。 同時(shí)請(qǐng)記?。菏褂?操作符做除法運(yùn)算時(shí),如果其中之一是double類型,那么結(jié)果就將是double類型。所以,當(dāng)2個(gè)integer或者single類型數(shù)值做除法運(yùn)算時(shí),如果想得到高精度的結(jié)果,就需要手工強(qiáng)迫其中之一轉(zhuǎn)換為double類型: 結(jié)果為 0.3333333 print 1 / 3 結(jié)果為 0,333333333333333 print 1 / 3# 使用$-類型字符串函數(shù)會(huì)更快 vb官方文檔似乎很鼓勵(lì)使用無$類字符串函數(shù),比如:left、ltrim或者ucase,而不是實(shí)現(xiàn)同樣功能的left$、ltrim$和ucase$函數(shù)。但是我們必須認(rèn)識(shí)到:前者返回variant類型的

33、數(shù)值,當(dāng)用于字符串表達(dá)式中時(shí),最終必須要轉(zhuǎn)換為字符串(string)類型。 因此,在嚴(yán)格要求時(shí)間的代碼段中,我們應(yīng)該使用后者,它們將快5-10%。妙用replace函數(shù)替代字符串連接操作符&你大概不知道replace函數(shù)還能這么用吧?比如下面的語句:msgbox disk not ready. & vbcr & vbcr & _please check that the diskette is in the drive & vbcr & _and that the drives door is closed.可以看出,為了顯示完整的字符串含義,要將可打印字符與非打印字符(比如:回車符vbcr)

34、用&符號(hào)連接在一起。結(jié)果是:長長的字符連接串變得難于閱讀。但是,使用replace函數(shù),可以巧妙地解決這個(gè)問題。方法就是:將非打印字符以字符串中不出現(xiàn)的一個(gè)可打印字符表示,這樣完整地寫出整個(gè)字符串,然后使用replace函數(shù)替換那個(gè)特別的打印字符為非打印字符(比如:回車符vbcr)。代碼如下:msgbox replace(disk not ready.please check that the diskette is in the _& driveand that the drives door is closed., , vbcr)固定長度字符串?dāng)?shù)組:賦值快,釋放快!固定長度字符串的處理速度

35、通常慢于可變長度字符串,這是因?yàn)樗械膙b字符串函數(shù)和命令只能識(shí)別可變長度字符串。因此,所有固定長度字符串比然被轉(zhuǎn)換為可變長度字符串。但是,由于固定長度字符串?dāng)?shù)組占據(jù)著一塊連續(xù)的內(nèi)存區(qū)域,因此在被分配以及釋放時(shí),速度明顯快于可變長度的數(shù)組。比如:在一個(gè)pentium 233mhz機(jī)器上,對(duì)于一個(gè)固定長度為100,000的數(shù)組,給其中30個(gè)位置分配數(shù)值,大約只花費(fèi)半秒種的時(shí)間。而如果是可變長度的數(shù)組,同樣的操作要耗費(fèi)8秒之多!后者的刪除操作耗時(shí)大約0.35秒,但固定長度的數(shù)組幾乎可以立即“斃命”!如果應(yīng)用程序中涉及到這么大的一個(gè)數(shù)組操作,選擇固定長度方式數(shù)組絕對(duì)是確定無疑的了,無論是分配數(shù)值,還

36、是釋放操作,都可以風(fēng)馳電掣般完成。未公開的返回?cái)?shù)組型函數(shù)加速秘訣 在vb6中,函數(shù)是能夠返回?cái)?shù)組對(duì)象的。這種情況下,我們不能象返回對(duì)象或者數(shù)值的其他函數(shù)一樣使用函數(shù)名當(dāng)做局部變量來存儲(chǔ)中間結(jié)果,因此不得不生成一個(gè)臨時(shí)局部數(shù)組,函數(shù)退出前再分配這個(gè)數(shù)組給函數(shù)名,就象下面的代碼一樣: 返回一個(gè)數(shù)組,其中含有n個(gè)隨即元素 并且將平均值保存在avg中 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 以隨

37、機(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 難以置信的是,只需要簡單地顛倒最后2條語句的順序,就能使上面這段程序變得快些: . 賦值結(jié)果數(shù)組,計(jì)算平均值 avg = sum / n getrandomarray = res end function 例如,在一個(gè)pentium ii 333mhz 機(jī)器上,當(dāng)n100,000時(shí),前段程序運(yùn)行時(shí)間為0.72秒,后

38、段程序則為0.66秒,前后相差10%。 原因何在呢?前段程序中,vb將拷貝res數(shù)組到getrandomarray對(duì)應(yīng)的結(jié)果中,當(dāng)數(shù)組很大時(shí),花費(fèi)的時(shí)間是很長的。后段程序中,由于getrandomarray = res是過程的最后一條語句,vb編譯器就能確認(rèn)res數(shù)組不會(huì)被再使用,因此將直接交換res和getrandomarray的地址數(shù)值,從而節(jié)省了數(shù)組元素的物理拷貝操作以及隨后的res數(shù)組釋放操作。 總結(jié)如下:當(dāng)編寫返回?cái)?shù)組的函數(shù)時(shí),一定要將分配臨時(shí)數(shù)組到函數(shù)名的語句放在最后,就是其后緊挨者exit function 或者end function的位置。-dim i as longredi

39、m res(0 to ubound(values) as integerfor i = 0 to ubound(values)res(i) = values(i)nextarrayint = res()end function同時(shí),也可以創(chuàng)建一個(gè)子程序段來檢測傳遞給它的數(shù)值的類型,并返回正確類型的數(shù)組。這種情況下,函數(shù)應(yīng)該定義為返回variant。訪問簡單變量總是快于數(shù)組元素值讀寫數(shù)組中的元素速度通常都慢于訪問一個(gè)簡單變量,因此,如果在一個(gè)循環(huán)中要重復(fù)使用同一數(shù)組元素值,就應(yīng)該分配數(shù)組元素值到臨時(shí)變量中并使用這個(gè)變量。下面舉一個(gè)例子,檢測整數(shù)數(shù)組中是否存在重復(fù)項(xiàng):function anydup

40、licates(intarray() as integer) as boolean如果數(shù)組包含重復(fù)項(xiàng),返回truedim i as long, j as long,dim lastitem as longdim 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 lastitemif value = intarray(j) thenanyduplic

41、ates = trueexit functionend ifnextnext沒有發(fā)現(xiàn)重復(fù)項(xiàng)anyduplicates = falseend function上述程序有2層循環(huán),通過緩存intarray(i)的數(shù)值到一個(gè)普通的、非數(shù)組變量中,節(jié)省了cpu運(yùn)行時(shí)間。經(jīng)測試,這將提高80%的速度。創(chuàng)建新表時(shí),快速拷貝字段在vb6中,無需離開開發(fā)環(huán)境就可以創(chuàng)建新的sql server和oracle表。方法很簡單:打開dataview窗口,用鼠標(biāo)右鍵單擊數(shù)據(jù)庫的表文件夾,再選擇新表格菜單命令。當(dāng)處理相似表格時(shí),就是說具有許多相同字段的表格,我們完全可以在很短的時(shí)間內(nèi)容完成設(shè)定操作。具體步驟是:在設(shè)計(jì)模式

42、下打開源表格,加亮選擇要拷貝字段對(duì)應(yīng)的行,按ctrl-c拷貝信息到粘貼板;然后,在設(shè)計(jì)模式打開目標(biāo)表格,將光標(biāo)置于要粘貼字段所在的位置,按ctrl-v。這樣,就拷貝了所有的字段名稱以及它們所帶的屬性。 無閃爍地快速附加字符串到textbox控件附加文本到textbox或者richtextbox控件的通常方法是在當(dāng)前內(nèi)容上連接上新的字符串:text1.text = text1.text & newstring但還有一個(gè)更快的方法,并且會(huì)減少連接操作的閃爍感,代碼如下:text1.selstart = len(text1.text)text1.seltext = newstring快速找到選中的o

43、ptionbuttonoptionbutton控件經(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,所以上述代碼可以精簡如下:intselected = -option(1).value - option(2).value * 2表單及控件的引用阻止了表單的卸載當(dāng)指派表單或者表單上的控件到該表單模塊以外的一個(gè)對(duì)象變量中時(shí),如果要卸載表單,就

44、必須首先將那個(gè)變量設(shè)置為 to nothing。也就是說,如果不設(shè)置為nothing,即使看不到這個(gè)對(duì)象了,但它仍舊是保存在內(nèi)存中的。注意:這并非是一個(gè)bug,這僅僅是com引用規(guī)則的一個(gè)結(jié)果。唯一要注意的就是引用的這個(gè)控件將阻止整個(gè)表單的卸載操作,它將依賴于它的父表單而存在。 重定義編譯dll文件的基地址許多vb開發(fā)者都知道應(yīng)該在工程屬性對(duì)話框的“編譯”功能頁面中定義一個(gè)dll基地址數(shù)值。這不同于工程中任何其他dll或ocx的基地址。當(dāng)操作沒有源代碼的編譯dll或者ocx文件時(shí),可以使用editbin程序修改它的基地址。editbin程序隨visual studio安裝后就有了,可以在主vi

45、sual studio目錄的vc98bin目錄下找到它。比如,以下代碼重新設(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,!cdeikomprsuwa1248ptsx/stack:reserve,commit/subsystem:native|windows|console|windowsce|posix,#.#/swaprun:!cd|!net/version:#.#/ws:!aggressive快速調(diào)入treeview控件以及l(fā)istview控件的子項(xiàng)內(nèi)容有一個(gè)簡單但仍未發(fā)現(xiàn)的技巧可用于在treeview控件中裝載多個(gè)節(jié)點(diǎn),或者在listview控件中裝載多個(gè)listitems。這種方法要比傳統(tǒng)做法快。先看看下面這個(gè)傳統(tǒng)方法:for i = 1 to 5000treeview1.nodes.add

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論