版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
VB教程I
VB練習(xí)試題(適合新手)
我們需要什么?當(dāng)我們?cè)谝粋€(gè)精彩的游戲世界中游歷了一番之后,或
是驚嘆于某一工具軟件的小巧精致之余,多少總會(huì)產(chǎn)生些許編程的沖動(dòng)。
編程嗎,在以前如果你對(duì)電腦還是一個(gè)門外漢,那實(shí)在是一件可望而不可
及的事情。如果運(yùn)用基于DOS下的編程語言,譬如C、Qbasic、Pascal等
等,真不知何年何月才能有所成就。
編程是需要天賦的,你必須在大腦中對(duì)整個(gè)程序有一個(gè)清晰的輪廓,
一個(gè)高效的流程,這并不是每個(gè)人都能做到的,你必須思之慎之,這也使
編程變成一件最枯燥無味的事情。但在第四代計(jì)算機(jī)語言(可視化編程)
出現(xiàn)后,可以確切的說它開發(fā)了人們的更多天賦,并不局限于那些頭腦異
常清晰的人,每一個(gè)人都可以發(fā)現(xiàn)自己也可以編出一些從前不敢問津的程
序,想象力的充分發(fā)揮才是第四代語言的精粹。
VisualBasic(以下簡(jiǎn)稱VB)可以說是可視化語言的先驅(qū)了,而且它
也是可視化程度最高的一個(gè),從幾年前VB誕生之日起到現(xiàn)在,它已經(jīng)經(jīng)歷
了五個(gè)版本,而且現(xiàn)在微軟正在緊張的進(jìn)行著VB6.0的研制、測(cè)試,這么
高的更新率,不外乎說明兩個(gè)問題:用戶對(duì)VB的熱衷,微軟對(duì)VB的重視。
不可否認(rèn)微軟對(duì)市場(chǎng)的預(yù)測(cè)能力是極為高明的,而它強(qiáng)大的技術(shù)、財(cái)力支
持也使它在許多以前未進(jìn)入的領(lǐng)域,在不長(zhǎng)的時(shí)間內(nèi)有成為最有力的競(jìng)爭(zhēng)
對(duì)手,如IE之于瀏覽器領(lǐng)域,《帝國(guó)時(shí)代》之于游戲都是最好的例證。對(duì)
于VB現(xiàn)在也有一個(gè)很強(qiáng)的競(jìng)爭(zhēng)對(duì)手一一Delphi,有人把它稱作VB殺手,
這顯然有偏激之處,VB的確有它的不足之處,但Delphi又何嘗不是呢,而
且以微軟對(duì)VB的傾心,VB的功能必然會(huì)越來越強(qiáng)大。
VB的誕生
VB的出現(xiàn)可以說是MicrosoftWindows的日漸成熟的必然產(chǎn)物。
MicrosoftWindows為程序員和最終用戶提供了一個(gè)共同的人機(jī)界面。對(duì)用
戶,Windows提供了一個(gè)圖形鼠標(biāo)的操作環(huán)境,該環(huán)境對(duì)所有的應(yīng)用程序都
一樣;對(duì)于程序員,Windows提供了一組預(yù)定義工具稱之為Microsoft
Windows的軟件開發(fā)工具箱(SDK),該工具能使程序員建立一個(gè)與Windows
界面相同的應(yīng)用程序,而且,程序員不必關(guān)心最終用戶的硬件配置情況。
在這一開發(fā)環(huán)境中,程序員唯一困難的是MicrosoftSDK提供了六百多個(gè)
函數(shù)和與其一致的事件驅(qū)動(dòng)(event-driven)編程技術(shù)。兩種新方法的交
叉使眾多的程序員重新陷入困境,程序員不僅要掌握程序驅(qū)動(dòng)編程技術(shù)和
六百多個(gè)函數(shù)的功能,而且還得用C語言描述這些問題。因此一般情況下,
程序員首先要掌握C程序設(shè)計(jì)技術(shù),而后再開始學(xué)習(xí)SDKo這樣的條件下就
要求在Microsoft多任務(wù)環(huán)境下出現(xiàn)一種操作方便,使用簡(jiǎn)單的新工具一
VisualBasic由此誕生。
何為可視
英文Visual的意思是“視覺的”,“可視的Baisc”這個(gè)名字可能
抽象了點(diǎn),但實(shí)際上它卻是最直觀的編程方法,之所以叫做“可視”,你
只要看到VB的界面就會(huì)明白,實(shí)際上你無需編程,就可以完成許多步驟。
在VB中引入了控件的概念,在Windows中控件的身影無處不在,各種各樣
的按鈕、文本框、無線鈕,都是控件的種類,VB把這些控件模式化,并且
每個(gè)控件都有若干屬性用來控制控件的外觀,工作方法。這樣你就可以象
在畫板上一樣,隨意點(diǎn)幾下鼠標(biāo),一個(gè)按鈕就完成了,這些在以前的編程
語言下是要經(jīng)過相當(dāng)復(fù)雜的工作的。
第二章:事件、屬性及數(shù)據(jù)類型
以后兩章可能會(huì)比較枯燥,但不可否認(rèn)也很重要,所以為了學(xué)好VB,我們
一定要打好基礎(chǔ)才行。
一、事件
通過上一章的例子,你可能對(duì)“面向?qū)ο蟮木幊獭币呀?jīng)有了一定了解,它
是由事件驅(qū)動(dòng)的,對(duì)于不同的對(duì)象,所能感應(yīng)到的事件也會(huì)不同,譬如說
當(dāng)你把鼠標(biāo)移進(jìn)某一區(qū)域時(shí)就會(huì)觸發(fā)MouseMove事件,這很直觀,也容易
理解,但也有些事件比較抽象,下面我來對(duì)一般的事件進(jìn)行一下解釋。
窗體和圖象框類事件
Paint事件:當(dāng)某一對(duì)象在屏幕中被移動(dòng),改變尺寸或清除后,程序會(huì)自動(dòng)
調(diào)用Paint事件。注意:當(dāng)對(duì)象的AutoDraw屬性為True(—1)時(shí),程序
不會(huì)調(diào)用Paint事件。
Resize事件:當(dāng)對(duì)象的大小改變時(shí)觸發(fā)Resize事件。
Load事件:僅適用于窗體對(duì)象,當(dāng)窗體被裝載時(shí)運(yùn)行。
Unload事件:僅適用于窗體對(duì)象,當(dāng)窗體被卸載時(shí)運(yùn)行。
2.當(dāng)前光標(biāo)(Focus)事件
GotFocus事件:當(dāng)光標(biāo)聚焦于該對(duì)象時(shí)發(fā)生事件。
LostFocus事件:當(dāng)光標(biāo)離開該對(duì)象時(shí)發(fā)生事件。
注意:Focus英文為“焦點(diǎn)”、“聚焦”之意,最直觀的例子是,比如有兩
個(gè)窗體,互相有一部分遮蓋,當(dāng)你點(diǎn)下面的窗體時(shí),它就會(huì)全部顯示出來,
這時(shí)它處在被激活的狀態(tài),并且標(biāo)題條變成藍(lán)色,這就是GotFocus事件,
而相反,另外一個(gè)窗體被遮蓋,并且標(biāo)題條變灰,稱為L(zhǎng)ostFocus事件。
上面所說的“光標(biāo)”并非指鼠標(biāo)指針。
3.鼠標(biāo)操作事件
Click事件:鼠標(biāo)單擊對(duì)象。
DbClick事件:鼠標(biāo)雙擊事件。
MouseDown>MouseUp屬性:按下/放開鼠標(biāo)鍵事件。
MouseMove事件:鼠標(biāo)移動(dòng)事件。
DragDrop事件:拖放事件,相當(dāng)于MouseDown、MouseMove和MouseUp的組
合。
DragOver事件:鼠標(biāo)在拖放過程中就會(huì)產(chǎn)生DragOver事件。
4.鍵盤操作屬性
KeyDown、KeyUp事件:按鍵的按下/放開事件。
KeyPress事件:按鍵事件。
5.改變控制項(xiàng)事件
Change事件:當(dāng)對(duì)象的內(nèi)容發(fā)生改變時(shí),觸發(fā)Change事件。最典型的例子
是文本框(TextBox)o
DropDown事件:下彈事件,僅用于組合框(ComboBox)對(duì)象。
PathChange事件:路徑改變事件,僅用于文件列表框(FileBox)對(duì)象。
6.其他事件
Timer事件:僅用于計(jì)時(shí)器,每隔一段時(shí)間被觸發(fā)一次。
二、屬性
每個(gè)對(duì)象都有它的屬性,并且“Name”屬性是共有的,有了“Name”
屬性才可以在程序中進(jìn)行調(diào)用。對(duì)于屬性,可以在窗體的布局操作中完成,
也可以在程序運(yùn)行中改變,這取決你的需要,但有些屬性是只讀的,它只
能在控件布局時(shí)改變。我將在以后的實(shí)例中具體介紹各個(gè)屬性的作用。
三、數(shù)據(jù)類型
學(xué)過編程的人都知道大多數(shù)的計(jì)算機(jī)語言都規(guī)定了各自的數(shù)據(jù)類型,VB也
不例外。其實(shí),在一個(gè)最簡(jiǎn)單的程序中數(shù)據(jù)類型是可以不作規(guī)定的,也就
是說,變量可以使用各種類型,但是在一個(gè)復(fù)雜的程序里,這樣做就很危
險(xiǎn),因?yàn)楹芸赡芙o同一個(gè)變量賦予了不同的類型,而導(dǎo)致程序出錯(cuò)。所以,
為了程序的嚴(yán)謹(jǐn)和便于查看,正確的定義數(shù)據(jù)類型是必要的。定義數(shù)據(jù)的
另一個(gè)原因是,不同的數(shù)據(jù)占用不同的內(nèi)存數(shù)量,譬如整型(Interger)
數(shù)據(jù)占2字節(jié),而長(zhǎng)整型數(shù)據(jù)占4個(gè)字節(jié),定義合適的數(shù)據(jù)類型,不管你
相信不相信,它可以節(jié)省內(nèi)存!
VB常用的數(shù)據(jù)類型有:整型(Integer,表示-32768至32767之間的整數(shù))、
長(zhǎng)整型(Long,表示-2,147,483,648至2,147,483,647之間的整數(shù))、實(shí)
型(Single,表示-3.37E+38至3.37E+38之間的實(shí)數(shù))、雙精度實(shí)型(Double,
表示-1.67E+308至1.67E+308之間的實(shí)數(shù)),字符(String,每個(gè)字符占
一字節(jié),可以儲(chǔ)存0?65,535個(gè)字符),布爾(Boolean,只有兩個(gè)值True/-1,
或False/0)。
數(shù)據(jù)類型的定義方法:
定義變量最簡(jiǎn)單的方法是用“Dim”關(guān)鍵字,它的語法:
Dim【變量名】As【數(shù)據(jù)類型】
如:DimIndexAsInteger
也可以在一行中定義多個(gè)變量,如:
DimIndexAsInteger,DimNumberAsLong
把多個(gè)變量定義成同一類型可以寫成:
DimIndex,NumberAsInteger
更可以在定義時(shí)進(jìn)行初賦值:
DimIndex=3
有時(shí)為了簡(jiǎn)便,也以符號(hào)進(jìn)行簡(jiǎn)單的定義,作用是和上面一樣的。整型可
以用“%”代替,長(zhǎng)整型可以用代替,實(shí)型可以用“!”,雙精度實(shí)型
可以用“曠定義,如剛才的第一個(gè)例子可以寫成:
DimIndex%等價(jià)于DimIndexAsInteger
對(duì)于常量的定義用Const定義,如:ConstC0L0R=255o
為了在程序中便于查閱,我們對(duì)變量和常量的寫法進(jìn)行規(guī)定,變量一般用
小寫方式,常量則全部大寫。
注意:使用常量的好處,對(duì)于程序中經(jīng)常出現(xiàn)的數(shù)值,應(yīng)設(shè)常量等于它,
這樣一是書寫方便,其二,如果要改變?cè)摂?shù)值,只需改變定義常量的語句
值,而不需改變每個(gè)語句,提高了效率。
數(shù)組的定義類似于變量定義,所不同的是數(shù)組需要指定數(shù)組中的元素個(gè)數(shù),
例如:
DimIntegerArray(99)AsInteger
這個(gè)數(shù)組中包含100個(gè)元素,腳標(biāo)從。到99。
也可以指定腳標(biāo)的起始值,例如:
DimIntegerArray(2to10)AsInteger
這個(gè)數(shù)組含有九個(gè)元素,腳標(biāo)從2到10。
還可以定義多維數(shù)組:
DimThreeD(4,2to5,3to6)AsInteger
上例定義了一個(gè)三維數(shù)組(4X4X4)o
記錄的定義
記錄定義是把控制權(quán)交給用戶的方法,它讓用戶可以定義自己的數(shù)據(jù)類型,
它使用關(guān)鍵字“Type”,方法是:
Type【數(shù)據(jù)類型標(biāo)識(shí)符】
〈域名>As〈數(shù)據(jù)類型》
〈域名》As〈數(shù)據(jù)類型》
〈域名>As〈數(shù)據(jù)類型》
EndType
例如,定義一個(gè)地址數(shù)據(jù):
TypeAddress
StreetAsString
ZipCodeAsString
PhoneAsString
EndType
這個(gè)地址數(shù)據(jù)里包括三個(gè)屬性,街區(qū)、郵政編碼和電話,可以把某數(shù)據(jù)定
義成此類型:
DimMyHomeAsAddress
要調(diào)用或改變“MyHome”的值時(shí),類似于對(duì)對(duì)象的屬性的操作:
變量名.域名=”……”
為了簡(jiǎn)化書寫重復(fù)的部分,可以用關(guān)鍵字“With”:
WithMyHome
.Streeti'阜成路"
.ZipCode="100037”
.Phone="12345678”
EndWith
本章提要:
VB語法與Basic的異同
注釋語句
長(zhǎng)語句的分行
條件語句
循環(huán)語句
運(yùn)算操作
數(shù)據(jù)定義與賦值
函數(shù)和過程
一、VB與Basic
VB之所以叫做“VisualBasic"就是因?yàn)樗褂昧薆asic語言作為代碼,
所以它們之間有著千絲萬縷的關(guān)系,如果學(xué)過Basic的話,看到VB的程序
結(jié)構(gòu)會(huì)感到很親切。但VB作為新生物,也超越了Basic的限制,有了許多
自己的特點(diǎn):
VB建立了一種新的變量類型一一貨幣型變量,通過使用僅帶有二位小數(shù)的
貨幣變量,就能避免因使用實(shí)型變量而帶來的數(shù)值積累誤差問題。
VB在調(diào)用函數(shù)(Function)時(shí),必須在函數(shù)名后跟一對(duì)括號(hào)。
VB對(duì)白蘭地使用范圍重新做了規(guī)范,在Basic里把隱含變量都當(dāng)作全局變
量,而在VB里對(duì)隱含變量都當(dāng)作局部變量。
VB里的說明語句(Declare),僅支持動(dòng)態(tài)鏈結(jié)庫(kù)(DLL)的子程序和無變
量函數(shù)。
使用數(shù)組,必須事先用Dim或Redim進(jìn)行定義。
二、注釋語句
在使用注釋語句之前必須先了解注釋的作用,注釋不僅僅是對(duì)程序的解釋,
有時(shí)它對(duì)于程序的調(diào)試也非常有用,譬如說可以利用注釋屏蔽一條語句以
觀察變化,發(fā)現(xiàn)問題和錯(cuò)誤。以后注釋語句將是我們?cè)诰幊汤镒罱?jīng)常用到
的語句之一。
在VB里,注釋語句有兩種,一種是用“Rem”關(guān)鍵字,這跟DOS里的批處
理文件的用法一樣,還有一種是利用單引號(hào),例如:
'DimaAsString與
RemDimaAsString的作用是一致的。
三、長(zhǎng)語句的分行
在比較早的版本中,因?yàn)闆]有象C等語言用“;”隔開語句與語句,VB的
語句是必須寫在一行里的,不過后來版本的VB里如許用分行符“,把一
個(gè)長(zhǎng)語句分成若干行來存放。
四、條件語句
如果你學(xué)過任何一種編程的話,都會(huì)知道在程序里控制其流程的有兩種語
句,條件與循環(huán),VB自然也不例外,其實(shí)不管哪種語言,條件和循環(huán)的樣
子都差不多,只不過各有各的規(guī)矩罷了。
在條件語句里,我們先來學(xué)習(xí)“If……Then……”語句。
它的一般語法是:
If〈條件》Then
〈語句〉
〈語句〉
EndIf
與C語言不同,VB的條件語句更符合英語的語法,如果Then后面所跟的
語句只有一條,可以寫成:
If〈條件》Then〈語句〉
而不用EndIfo
有時(shí)我們還會(huì)用到
If〈條件》Then
<語句》
Else
(語句〉
EndIf
更可以在Else里在嵌套If語句,如:
If〈條件》Then
〈語句〉
ElseIf
〈語句〉
Else
〈語句〉
EndIf
所有這些可以用一個(gè)表格表示:
條件1
TrueFalse
語條件2
句TrueFalse
1
語條件3
句
TrueFalse
2
條件N
???
TrueFalse
語句N語句N+l
用了過多的Else后你會(huì)感到很不方便,而且程序結(jié)構(gòu)也不清晰,所以大多
數(shù)的語言還有Select語句幫助解決這個(gè)問題。
VB里的Select語句的格式是這樣的:
SelectCase〈變量名〉
Case〈情況1>
Case〈情況2>
Case〈情況3>
CaseElse
EndSelect
例如:
SelectCasea%
Case1
Print“a=l”
Case2
Print“a=2”
CaseElse
Print“adoesnotequalto1or2.”
EndSelect
五、循環(huán)語句
循環(huán)結(jié)構(gòu)是計(jì)算機(jī)語言里一種重要的結(jié)構(gòu),它的應(yīng)用廣泛,最簡(jiǎn)單的例子
是累加器的作用,還可以用于窮舉法,更直觀的例子是把某件事重復(fù)指定
的次數(shù),這樣就不用把要重復(fù)的語句輸入多次,而通過循環(huán)結(jié)構(gòu)完成,非
常方便。
C語言里有一個(gè)“for”循環(huán)語句,VB里也有“For”關(guān)鍵字,作用也差不
多,只是VB的“For”語句更容易理解。它的格式是:
For〈循環(huán)變量>=(初賦值〉To(終值>[Step〈步長(zhǎng)》]
Next〈循環(huán)變量》
在默認(rèn)情況下,Step被設(shè)為“1”,可以省略,Step也可以設(shè)為負(fù)值,例
如:
Dima=0
For1=1To10
a=a+I
NextI
這是一個(gè)最簡(jiǎn)單的累加器的例子,把1到10累加在一起,然后賦值給“a”
這樣的效果和上面是一樣的,只不過是倒著加罷了,請(qǐng)看:
Dima=0
For1=10To1Step-1
a=a+I
NextI
While語句也是一個(gè)很常用的循環(huán)語句,它的形式很多。
DoWhile...Loop語句
While...Wend語句
Do...LoopWhile
While后面都跟邏輯條件判斷,"DoWhile……Loop語句”和“While……
Wend語句”作用相似,都是先判斷While后面的條件是否為“真”,如果
為“真”則執(zhí)行里面的語句,如果為“假”,則退出循環(huán),循環(huán)直至條件
為“假”終止。"Do……LoopWhile”與前兩者的區(qū)別在于,它不管條
件的真假,都會(huì)先執(zhí)行“Do”后面的語句,也就是說,它至少執(zhí)行語句一
次。
與While用法相似的還有Until語句,它是直至條件為真則終止循環(huán),句
式把While上述三個(gè)語句的While換成Until即可,但是因?yàn)槿菀子浕欤?/p>
所以我建議只用While即可。Until<條件)可以相當(dāng)于WhileNot〈條件》。
For循環(huán)和Whlie循環(huán)應(yīng)當(dāng)根據(jù)適當(dāng)?shù)沫h(huán)境使用,它們有時(shí)也可替換。
六、運(yùn)算操作
數(shù)學(xué)運(yùn)算
+:加法運(yùn)算,也適合于字符串的之間的合并運(yùn)算。
-:加法運(yùn)算。
*:乘法運(yùn)算。
/:除法運(yùn)算。
\:整除運(yùn)算。
Mod:求余運(yùn)算。例如:aModb表示a被b整除以后的余數(shù)。
7塞運(yùn)算。A「B表示以A為底的B次方。
關(guān)系運(yùn)算
關(guān)系運(yùn)算也稱比較運(yùn)算,它表示不等式的真或假,VB共提供六種運(yùn)算符,
分別是=(等于),>(大于),<(小于),>=(大于等于),<=(小于等
于)和<>(不等于)。
邏輯運(yùn)算
邏輯運(yùn)算是對(duì)真或假的運(yùn)算,我將列表說明:
ABNotAAndOrXorEqvImp
非與或異或相等蘊(yùn)
含
TTFTTFTT
TFFFTTFF
FTTFTTFT
FFTFFFTT
TTrueFFalse
七、數(shù)據(jù)與定義
本標(biāo)題的內(nèi)容已經(jīng)在上一章向大家詳述過,在這里就不再重復(fù)。
八、函數(shù)與過程
函數(shù)與過程有許多相似的地方,它們之間最大也是最本質(zhì)的區(qū)別就在于,
函數(shù)有一個(gè)返回值,而過程只是執(zhí)行一系列動(dòng)作,所以可以簡(jiǎn)單的把函數(shù)
理解成為一個(gè)變量,而VB中的每個(gè)事件都是一個(gè)過程,比如
Command1_Click()就是—過程。
因?yàn)樵诔绦蛟O(shè)計(jì)中經(jīng)常會(huì)有重復(fù)的地方,所以把它做成一個(gè)函數(shù)或一個(gè)過
程,在使用時(shí)進(jìn)行調(diào)用,可以節(jié)省大量的輸入代碼的時(shí)間,而且使用函數(shù)
和過程也便于程序的結(jié)構(gòu)化和修改查看。函數(shù)和過程都可以有參數(shù),也可
以沒有參數(shù)。
關(guān)于函數(shù)和過程將在以后的章中配合實(shí)例講解,請(qǐng)您繼續(xù)VB教程。
第四章按鈕(一)
從本章開始我們將正式進(jìn)入VB的編程世界,但這還僅僅是個(gè)開端,要
編出功能強(qiáng)大的軟件,還要學(xué)很多東西,那就要看以后的VB高級(jí)教程了,
我也得努力學(xué)??!
按鈕是我們?cè)赪indows操作見到最多的控件,它們有著各種各樣的功
能:“確認(rèn)”、“取消”、“下一步”等等,這些都是按鈕的表現(xiàn),另外
還有很多圖形話的按鈕,其實(shí)它們并沒什么不同,所有的按鈕都是通過單
擊(click)事件實(shí)現(xiàn)的,只不過是在外表不同罷了。下面就讓我們建立一
個(gè)最簡(jiǎn)單的按鈕,雙擊工具箱的CommandButton,將在窗體上建立一個(gè)形如
圖4—1,。2叫的按鈕,它的缺省名(Name屬性)為Commandl,我們可
以把它改名為cmdExit,把Caption屬性設(shè)為“退出”,然后雙擊,按鈕填
寫代碼:
PrivateSubcmdExit_Click()
UnloadMe
EndSub
按下F5或者工具條上的播放按鈕,運(yùn)行程序。圖4—2當(dāng)你按下退出
按鈕的時(shí)候,就會(huì)自動(dòng)退出程序,原因是當(dāng)你單擊按鈕時(shí)激活了它的Click
事件,執(zhí)行“UnloadMe”語句,使得窗體被卸載。
上面舉了一個(gè)比較簡(jiǎn)單的例子,下面的例子稍微復(fù)雜些:
新建窗體,控件布局如圖4—3所示,包括一個(gè)List控件,一個(gè)Text
控件和兩個(gè)按鈕(Command1和Command2),(比較簡(jiǎn)單的程序我們都采
用缺省名),對(duì)它們屬性做如下修改:
ListlCaption="請(qǐng)輸入你
的名字”
TextlText="(空字符
串)
ButtonlCaption="復(fù)原"
Enabled=False
Button2Caption="清除"
把使用Buttonl的Enabled屬性設(shè)為False(假),是使程序在初始時(shí),
無法單擊Commandl。按F5,運(yùn)行程序,圖4—4,復(fù)原按鈕成為灰色,不可
選。
當(dāng)然現(xiàn)在程序還什么也不能做,下面我們?cè)诔绦蛑刑砑哟a:
首先在General里聲明全局變量:
DimStoreStringAsString'用來儲(chǔ)存字符串
※注意:為什么用全局變量?
VB里每一個(gè)小過程都相當(dāng)于一個(gè)程序,程序里的變量稱為局部變量,是只
能在程序內(nèi)部使用的,而當(dāng)程序調(diào)用結(jié)束后,由于從內(nèi)存中被清除,所以
變量?jī)?chǔ)存的值也就消失了,這里的全局變量是用來在過程中傳遞字符串。
接著填寫以下代碼:
PrivateSubCommand1_Click()
Textl.Text=StoreString
Command1.Enabled=False
EndSub
PrivateSubCommand2C1ick()
StoreString=Textl.Text
Textl.Text='清除
Command1.Enabled=True
EndSub
運(yùn)行程序,如圖4—5。按下“清除”,文本框被清除,按下“復(fù)原”,
文本有被恢復(fù),許多程序中的Undo/Redo就是利用這個(gè)原理實(shí)現(xiàn)的,現(xiàn)在
知道為什么內(nèi)存越多越好了吧。
我們?cè)诎殉绦蛐薷囊幌拢袯utton2刪除,Buttonl的Enabled屬性改
為True,Caption改為“清除”,填寫代碼:
PrivateSubCommand1Click()
IfCommand1.Caption="清除"Then
StoreString=Textl.Text
Textl.Text='清除
Command1.Caption="復(fù)原"
Else
Textl.Text=StoreString
Command1.Caption="清除"
EndIf
EndSub
同樣可以上面的功能,但是卻少用了一個(gè)控件,控件使用少的程序啟
動(dòng)會(huì)快些。
下面的例子要更加復(fù)雜些,大家一定都用過Windows附件中的計(jì)算器,
它是一個(gè)標(biāo)準(zhǔn)的科學(xué)計(jì)算器,利用VB我們也可以做到,只是沒有那么復(fù)雜,
四則運(yùn)算而已。
先建立一個(gè)新的項(xiàng)目文件,里面包含一個(gè)Forml的窗體。然后,添加
控件,包括一個(gè)Text框(Textl),和17個(gè)按鈕,這17個(gè)按鈕使用的名
稱都是Command1,只是Index屬性不同,就好象一個(gè)數(shù)組,創(chuàng)立一組按鈕
的方法是,先在窗體上建立一個(gè)按鈕(Command1),然后在Commandl上擊
鼠標(biāo)右鍵,選擇復(fù)制(Copy),然后在窗體上任意部位擊右鍵,選擇粘貼
(Paste),系統(tǒng)會(huì)提示是否創(chuàng)建控件組,選擇“是”,重復(fù)上面步驟,直
至創(chuàng)立17個(gè)按鈕為止。各控件屬性如下表:
TextlBackColor=&H00C0FFFF&
Text="0.”
CommandlIndex016
Index09
Caption="0”一“9”
Index10Caption=a”
Index11Caption=“=”
Index12Caption=“+"
Index13Caption=a_v
Index14Caption=“X”
Index15Caption=a”
Index16Caption=“清
除“
如果想改變一些其他的屬性,比如字體,可以自己定義一下Font屬性,
如果相對(duì)多個(gè)控件的共同屬性進(jìn)行改變,可以在窗體上按下鼠標(biāo),拖動(dòng),
把多個(gè)控件一起選定,然后對(duì)它們的共同屬性進(jìn)行修改。
別看這個(gè)東西小,還費(fèi)了近我兩個(gè)小時(shí)呢,不覺大嘆手生,里面也有
些地方很繞彎子,我盡量解釋清楚。
在編寫程序之前,我們先來回顧一下計(jì)算器的使用。
按下數(shù)字鍵在液晶屏上會(huì)出現(xiàn)數(shù)字,這是最基本的功能。
第一次按下運(yùn)算鍵,再按下數(shù)字鍵,將重新輸入第二個(gè)數(shù)字,再次按下運(yùn)
算鍵,將算出前兩個(gè)數(shù)的結(jié)果,然后按下數(shù)字鍵,將又重新輸入新的數(shù)字。
輸入數(shù)字后,按下“等于鍵”將仍輸出原來的數(shù)字,輸入運(yùn)算符和第二個(gè)
數(shù)字后在按下“等于",將得到二者的結(jié)果。然后又重復(fù)第二、三步。
按下“清除”,數(shù)據(jù)被全部清除。
了解了這些,我們一步一步實(shí)現(xiàn)。
先實(shí)現(xiàn)數(shù)據(jù)的輸入,請(qǐng)看代碼。
與未創(chuàng)立組的控件相比,它的事件里多了Index參數(shù),組里所有的對(duì)
象都使用同一個(gè)事件。
先在General里聲明窗體級(jí)全局變量:
DimNuml,Num2AsSingle
DimStrNuml,StrNum2AsString
DimFirstNumAsBoolean'判斷是否是數(shù)字開頭
因?yàn)門extl里是存放字符串的,所以要把輸入的數(shù)據(jù)進(jìn)行運(yùn)算,必須
把字符型變量轉(zhuǎn)變?yōu)閷?shí)型變量,分別用Numl、Num2和StrNuml、StrNum2
進(jìn)行存放。
在Form_Load事件里給變量初賦值:
Numl=0
Num2=0
StrNuml=
StrNum2=""
FirstNum=True
因?yàn)?7個(gè)按鈕使用的是同一事件,所以我們用一個(gè)SelectCase語句
區(qū)分各個(gè)按鈕,雙擊任意按鈕輸入代碼:
PrivateSubCommandl_Click(IndexAsInteger)
SelectCaseIndex
Case0To9
IfFirstNumThen
StrNuml=Str(Index)J實(shí)型轉(zhuǎn)字符型
FirstNum=False,初賦值為假
Else,非初賦值
StrNuml=StrNuml+Str(Index)
EndIf
Textl.Text=StrNuml'顯示
〈還有其他語句,等待插入》
EndSelect
EndSub
運(yùn)行程序的話已經(jīng)可以輸入數(shù)據(jù),下面我們來處理小數(shù)點(diǎn)。
在General里聲明新的變量:
DimPointFlagAsBoolean'判斷是否已有小數(shù)點(diǎn)
我們知道小數(shù)點(diǎn)只能輸入一次,一個(gè)數(shù)據(jù)中不能有多個(gè)小數(shù)點(diǎn)存在,所以
需要一個(gè)布爾變量做判斷。
在Form_Load里進(jìn)行初賦值:
PointFlag=False
在Command的單擊事件里接著上面輸入新的代碼:
Case10
IfNotPointFlagThen'如果沒有小數(shù)點(diǎn)
IfFirstNumThen'如果是第一個(gè)字符
StrNuml="0."
FirstNum=False
Else
StrNuml=StrNuml+
EndIf
Else,已有小數(shù)點(diǎn)
ExitSub'則退出單擊事件
EndIf
PointFlag=True
Textl.Text=StrNuml
第四章按鈕(二)
下面會(huì)復(fù)雜一些,我們先跳過等號(hào),而來處理四則運(yùn)算:
先在General里聲明新變量:
DimRunsignAsInteger'儲(chǔ)存運(yùn)算符號(hào)
DimSignFlagAsBoolean'判斷是否已有運(yùn)算符號(hào)
然后在Form_Load中進(jìn)行初賦值:
Runsign=0
SignFlag=False
在接下的Commandl_Click中繼續(xù)輸入代碼:
Case12To15
FirstNum=True'使下一次可以輸入新數(shù)據(jù)
PointFlag=False
'還原標(biāo)記值
IfSignFlagThen'前面已有運(yùn)算符未運(yùn)算
CallRun
Else
SignFlag=True
StrNum2=StrNumf把字符串1復(fù)制給字符串2
StrNuml=字符串1清空
EndIf
Runsign=Index-11'儲(chǔ)存鍵入的運(yùn)算符
里面運(yùn)算的部分我用了一個(gè)過程,是因?yàn)樵诎聪碌忍?hào)時(shí)還會(huì)調(diào)用到運(yùn)
算過程,這樣可以減少代碼的輸入,也使程序便于瀏覽。建立過程
(Procedure),可以在General部分直接輸入,也可以通過菜單里的“Add
Procedure”添加。Run的代碼如下:
SubRun()
Numl=Vai(StrNum2)
Num2=Vai(StrNuml)
SelectCaseRunsign
Case1'力口
equal=Numl+Num2
Case2'減
equal=Numl-Num2
Case3'乘
equal=Numl*Num2
Case4'除
equal=Numl/Num2
EndSelect
StrNum2=Str(equal)
StrNuml=StrNum2
Textl.Text=StrNum2
EndSub
下面是其余的代碼:(在Commandl_Click事件里,接著寫)
Case11
IfNotSignFlagThen
Textl.Text=StrNuml
equal=Vai(StrNuml)
FirstNum=True
PointFlag=False
Else
CallRun
SignFlag=False
EndIf
CaseElse'清除按鈕
CallClearData
里面又用到了一個(gè)ClearData過程,實(shí)際上就是Form_Load里的變量初賦
值,代碼如下:
SubClearData()
Numl=0
Num2=0
StrNuml=
StrNum2=""
FirstNum=True
PointFlag=False
Runsign=0
SignFlag=False
Textl.Text="0."
EndSub
這樣完整的程序就完成了,本章介紹了VB的第一個(gè)控件一一按鈕,并且舉
例,希望你繼續(xù)看下一章一一菜單。
下面給出完整的程序代碼:
DimNuml,Num2AsSingle
DimStrNuml,StrNum2AsString
DimFirstNumAsBoolean'判斷是否是數(shù)字開頭
DimPointFlagAsBoolean'判斷是否已有小數(shù)點(diǎn)
DimRunsignAsInteger'儲(chǔ)存運(yùn)算符號(hào)
DimSignFlagAsBoolean'判斷是否已有運(yùn)算符號(hào)
SubClearData()
Numl=0
Num2=0
StrNuml=
StrNum2=""
FirstNum=True
PointFlag=False
Runsign=0
SignFlag=False
Textl.Text="0."
EndSub
SubRun()
Numl=Vai(StrNum2)
Num2=Vai(StrNuml)
SelectCaseRunsign
Case1
equal=Numl+Num2
Case2
equal=Numl-Num2
Case3
equal=Numl*Num2
Case4
equal=Numl/Num2
EndSelect
StrNum2=Str(equal)
StrNuml=StrNum2
Textl.Text=StrNum2
EndSub
PrivateSubabout_Click()
MsgBox"Createby周曉陽。1998/7/27",vbDefaultButtonl,“VB教程第
四章范例”
EndSub
PrivateSubCommandl_Click(IndexAsInteger)
SelectCaseIndex
Case0To9
IfFirstNumThen
StrNuml=Str(Index)
FirstNum=False
Else
StrNuml=StrNuml+Str(Index)
EndIf
Textl.Text=StrNuml
Case10
IfNotPointFlagThen
IfFirstNumThen
StrNuml="0."
FirstNum=False
Else
StrNuml=StrNuml+
EndIf
Else
ExitSub
EndIf
PointFlag=True
Textl.Text=StrNuml
Case12To15
FirstNum=True
PointFlag=False
'還原標(biāo)記值
IfSignFlagThen
CallRun
Else
SignFlag=True
StrNum2=StrNuml
StrNuml=
EndIf
Runsign=Index-11
Case11
IfNotSignFlagThen
Textl.Text=StrNuml
equal=Vai(StrNuml)
FirstNum=True
PointFlag=False
Else
CallRun
SignFlag=False
EndIf
CaseElse
CallClearData
EndSelect
EndSub
PrivateSubForm_Load()
CallClearData
EndSub
補(bǔ)充說明
按鈕還有兩個(gè)重要的屬性Default(默認(rèn)屬性)和Cancel(取消屬性),
兩個(gè)屬性都以布爾賦值,把Default設(shè)為True,則在按下回車鍵時(shí),不論
焦點(diǎn)處于何處,都會(huì)觸發(fā)該按鈕的Click事件,而當(dāng)Cancel屬性被設(shè)為
True,在按下ESC鍵時(shí),該按鈕的Click屬性發(fā)生。下面舉個(gè)例子:
建立一個(gè)新窗體和兩個(gè)按鈕,Name屬性分別為cmdOK和cmdCancel,把前
者的Default設(shè)為True,后者的Cancel設(shè)為True,Caption屬性分別為
0K和Cancel。如圖4—8。填寫代碼后運(yùn)行:
PrivateSubcmdCancel_Click()
MsgBox"Cancel按鈕被按下“,vbDefaultButtonl,"提示"
EndSub
PrivateSubcmdOK_Click()
MsgBox"OK按鈕被按下“,vbDefaultButtonl,"提示"
EndSub
結(jié)果如圖4—9、4-10:
提不E3[提不
。班鈕被按下C6S1按鈕被按下
|匚:喉一……喉耳
快捷鍵大家一定都知道,在VB如何實(shí)現(xiàn)呢。其實(shí)很簡(jiǎn)單,在剛才的例子里
在建立一個(gè)按鈕Commandl,把它的Caption屬性設(shè)為Click&ME,如圖4
-11,在M的下面有一條下劃線,運(yùn)行程序,當(dāng)你按下Alt+M的時(shí)候就觸
發(fā)了Commandl_Click事件:
ClickME
PrivateSubCommand1_C1ick()
MsgBox"ClickME按鈕被按下“,vbDefaultButtonl,"提示"
EndSub
據(jù)我所知,有許多用戶有使用快捷鍵的習(xí)慣,注意細(xì)節(jié)上的問題能夠使將
來你的程序得到更多人的欣賞,不是嗎?
第五章菜單
我們經(jīng)常在Windows操作里遇到各種各樣的菜單,菜單的操作把各種
命令結(jié)構(gòu)化、分分類化,也節(jié)省了命令所占的空間,從作用上來講,菜單
類似于按鈕,但它只有一個(gè)事件一一Clicko
VB作為Windows下的可視編程工具,菜單的設(shè)計(jì)當(dāng)然很容易實(shí)現(xiàn),VB3.0
按下Ctrl+M,VB4.0以上的版本請(qǐng)按下Ctrl+E,便可呼叫出菜設(shè)計(jì)的窗口,
無論VB的版本,這個(gè)窗口的樣式是大同小異的,請(qǐng)見圖5—1。
前面說過,菜單相當(dāng)于簡(jiǎn)單的按鈕,它有幾個(gè)屬性,其中的大部分我
們都曾經(jīng)見過,包括Name、Caption、Index、Checked、Enabled、Visible、
快捷鍵和熱鍵等等。其中Name是必須的。下面請(qǐng)跟我一起設(shè)計(jì)第一個(gè)菜單。
首先在Caption添入"文件",Name為"mnuFile”,按下Next按鈕,
這樣就建立了第一級(jí)菜單,注意菜單設(shè)計(jì)窗口的左中有四個(gè)箭頭,按下向
右的箭頭,出現(xiàn)了一排小點(diǎn),如圖5—2,在VB里這叫縮排,這樣就可以開
始建立第二級(jí)菜單。
小知識(shí):實(shí)際上我們?cè)谏罹椭薪?jīng)常用到縮排,寫文章時(shí)開頭要空兩格就
是一種縮排,在編寫程序時(shí)更需要縮排,這樣使程序結(jié)構(gòu)化,便于觀察,
當(dāng)然菜單設(shè)計(jì)里的縮排有更多的用處。
接著填寫下一菜單項(xiàng),Caption為"新文件",Name為“mnuFileNew”,
按下Next鍵。
小知識(shí):VB一共如許建立6級(jí)子菜單,如圖5—3,盡量不要建立這樣的菜
單,要知道藏在越深處的菜單項(xiàng)越難以被人發(fā)現(xiàn),一個(gè)友好的程序界面應(yīng)
該讓用戶馬上找到需要的命令。
接著重復(fù)以上步驟,創(chuàng)建以下三個(gè)菜單項(xiàng):
Caption保存
NamemnuFileSave
Level1
Caption另存為
Name
mnuFileSaveAs
Level1
Caption載入
NamemnuFileLoad
Level1
我們?cè)诓藛卫镞€經(jīng)??吹桨巡煌?xiàng)分開的分隔條,在VB里也很容易做
到,把Caption設(shè)為"-"(減號(hào)),Name為mnuBarl。最后增加這個(gè)菜單
條的最后一項(xiàng),Caption為"退出",Name為mnuFileExit?,F(xiàn)在可以退出
菜單設(shè)計(jì)窗口,菜單如圖5—4。
怎么樣,經(jīng)過幾章的學(xué)習(xí),是不是覺得Windows世界也不是那么神秘?
也對(duì),也不對(duì)。的確,我們很輕易的實(shí)現(xiàn)了這么多的功能,但如果你仔細(xì)
想想,我們的程序還什么也不會(huì)做呢!可以說是徒有其表,要實(shí)現(xiàn)強(qiáng)大的
功能,恐怕要學(xué)很長(zhǎng)很長(zhǎng)時(shí)間,而現(xiàn)在僅僅是個(gè)開頭,并不是想入非非的
時(shí)候,我們還要繼續(xù)努力!
現(xiàn)在再次按下Ctrl+E,重回菜單設(shè)計(jì)窗口,接著添加菜單。(按下向
左的箭頭,可以使菜單上升一級(jí),Level代表菜單的級(jí)別),根據(jù)下表添加
新的菜單項(xiàng):
Caption編輯
NamemnuEdit
Level0
Caption剪切
NamemnuEditCut
Level1
Short-CutCtrl+X
Caption復(fù)制
NamemnuEditCopy
Level1
Short-CutCtrl+C
Caption粘貼
NamemnuEditPaste
Level1
Short-CutCtrl+V
Caption關(guān)于
NamemnuAbout
Level0
其中Short-Cut就是平常我們說的熱鍵,你可以在菜單設(shè)計(jì)窗口中找
到,設(shè)置一個(gè)你需要的組合鍵,這樣不論窗口的焦點(diǎn)處于何處,菜單在第
幾層,只要按下熱鍵,就相當(dāng)于調(diào)用了該項(xiàng)的Click事件。結(jié)果如圖5—5。
從Win95以來程序里引入了鼠標(biāo)右鍵功能,使鼠標(biāo)有了更大的用處,
在VB里我們也很容易實(shí)現(xiàn)。
打開Form_MouseDown事件,該事件有兩個(gè)參數(shù):Button,當(dāng)按下左鍵
時(shí)Button返回1,當(dāng)按下右鍵時(shí)Button返回2,;Shift,是指在點(diǎn)擊鼠
標(biāo)時(shí)按下的鍵盤鍵,如Shift、Ctrl、Alt,這些我們將在以后討論,但很
難避免在一章中不涉及到不該涉及的內(nèi)容,學(xué)習(xí)時(shí)有個(gè)大概的理解即可。
下面在該事件里添加代碼(效果如圖5—6):
PrivateSubForm_MouseDown(ButtonAsInteger,ShiftAsInteger,X
AsSingle,YAsSingle)
IfButton=2Then
PopupMenumnuEdit,vbPopupMenuLeftAlign
Else
ExitSub
EndIf
EndSub
在上面的代碼中我們用到了PopupMenu方法,它的語法是:
object.PopupMenu菜單名,標(biāo)記,X坐標(biāo),Y坐標(biāo)
標(biāo)記是用來表明彈出菜單位于鼠標(biāo)指針位置的,它有三個(gè)值:
vbPopupMenuLeftAlign位于鼠標(biāo)左
vbPopupMenuRightAlign位于鼠標(biāo)右
VbPopupMenuCenterAlign位于鼠標(biāo)中
部
X、Y值可以用來制定菜單彈出的位置,可以省略。
關(guān)于菜單的Visible、Enabled等屬性請(qǐng)自己嘗試。
第六章輸入(一)
我們?yōu)槭裁匆O(shè)計(jì)計(jì)算機(jī)程序呢,當(dāng)然是為了計(jì)算機(jī)能為我們完成工
作,但是要完成不同的任務(wù),我們就必須對(duì)計(jì)算機(jī)下達(dá)命令,然后計(jì)算機(jī)
在把信息返饋回來一一任務(wù)是否完成。以上就是所謂的人機(jī)對(duì)話或交互功
能,尤其是在Windows操作里我們需要進(jìn)行更多的輸入工作,我們需要填
寫各種各樣的表格,設(shè)置程序的重要參數(shù),把數(shù)據(jù)輸入給計(jì)算機(jī),再又它
完成既定的工作就是今天我們本章要重點(diǎn)討論的問題一一在VB中如何建立
完整的輸入機(jī)制。
在VB中提供了一個(gè)函數(shù)InputBox能幫助我們建立一個(gè)最簡(jiǎn)單的輸入
窗體,語法如下:
InputBox
(prompt[,title][,default][,xpos][,ypos][,helpfile,context])
該函數(shù)返回一個(gè)字符串表達(dá)式,其參數(shù)含義為:(“□”表示可缺省)
prompt一一字符串表達(dá)式,最大長(zhǎng)度為1024字符,窗體上的提示部分。
Title一一字符串表達(dá)式,顯示標(biāo)題欄里的文本。
Default一一字符串表達(dá)式,窗體中文本框的缺省值。
xpos,ypos數(shù)值表達(dá)式,以Twips為單位指定窗體出現(xiàn)在屏幕上的位
置。
helpfile——字符串表達(dá)式,是幫助文件的完整路徑。
Context——數(shù)值表達(dá)式,指定適合的幫助主題。
可能你看了上面的說明并不明白,那么下面我們就用Input語句完成一個(gè)
最簡(jiǎn)單的程序。
小知識(shí):屏幕坐標(biāo)
在計(jì)算機(jī)的屏幕上也有一個(gè)類似于我們?cè)谥袑W(xué)里常用到的直角坐標(biāo)系,之
不過它的原點(diǎn)不在左下,而是在屏幕的右上角,屏幕的最右上方坐標(biāo)為(0,
0),它的橫坐標(biāo)和我們的習(xí)慣是一致的,而縱坐標(biāo)則是越向下越大,不僅
是屏幕,所有的對(duì)象里都是一樣,需要記清。見圖6—1
(0,0)X
新建一個(gè)項(xiàng)目(project),在Form_load里填寫一行代碼:
a$=InputBox(〃舉薦你最欣賞的網(wǎng)站〃,〃最佳網(wǎng)站投票“,〃VB小驛〃)'
按下F5運(yùn)行程序,在Forml出現(xiàn)之前先會(huì)彈出一個(gè)輸入對(duì)話框,如圖
6-2o這時(shí),無論你按下0K還是Cancel都是沒有區(qū)別的,因?yàn)槲覀儾]
有對(duì)輸入數(shù)據(jù)進(jìn)行處理,下面我們完成一個(gè)更加復(fù)雜些的程序。
新建一個(gè)項(xiàng)目文件,把窗口布局成類似于圖6—3的結(jié)構(gòu),各對(duì)象屬性如下
表:
FormlCaption"最佳網(wǎng)站投票
演示”
BorderStyle3'不可調(diào)
整大小
ControlBoxO'False
Frame1Caption"輸入框?qū)傩浴?/p>
Label1Autosize1'True
Index0至5
0至5Caption”提示語
句”
“標(biāo)題”
“缺省網(wǎng)站”
“X坐標(biāo)”
“Y坐標(biāo)”
a,,
Index4EnabledFalse
Index4EnabledFalse
TextlText'(空字符串)
Index0至4
Index3Text0
Index4Text0
ChecklCaption"指定輸入框位
置”
ButtonlIndex0,1
Index0Caption”顯示
輸入框”
1Caption“退出程序”
本例中出現(xiàn)了一個(gè)Framel控件,它是一種框架,可以用來把窗體分成
好幾個(gè)部分,首先應(yīng)該在窗體上畫出Framel控件,然后再選擇相應(yīng)的控件,
在Framel上描出輪廓,使其是出現(xiàn)在Framel之上,本例中除去兩個(gè)按鈕,
其余都在Framel上面。本例中用到了幾組控件數(shù)組,其創(chuàng)建方法是,在選
定的點(diǎn)右鍵,選擇Copy,再在窗體其他部位單擊右鍵,選擇Paste即可,
注意,若要使粘貼的對(duì)象在Framel上,請(qǐng)?jiān)贔ramel上單擊右鍵選擇Paste。
我們通過這個(gè)窗體,對(duì)輸入框進(jìn)行完整的控制,原理是這樣的:當(dāng)我
們把窗體中要填寫的對(duì)輸入框的參數(shù)完成后按下0K按鈕,就會(huì)出現(xiàn)我們?cè)O(shè)
計(jì)的那個(gè)輸入框,我們從輸入框退出時(shí)則返回我們投票的結(jié)果,代碼如下.
窗體初次被裝入時(shí),Labe11(3).Label(4)和Text1(3)、Textl(4)的
Enabled屬性都是False,我們需要通過改變Checkl的Value(1,被選中,
0,未選中)是他們有效或無效。
聲明全局變量(General):
DimPosChkAsBoolean檢查X、Y坐標(biāo)是否有效
Checkl_Click事件:
PrivateSubCheckl_Click()
IfCheckl.Value=1Then
Label1(3).Enabled=True
Label1(4).Enabled=True
Textl(3).Enabled=True
Textl(4).Enabled=True
PosChk=True
Else
Label1(3).Enabled=False
Label1(4).Enabled=False
Textl(3).Enabled=False
Textl(4).Enabled=False
PosChk=False
EndIf
EndSub
接著在按鈕中填寫代碼:
PrivateSubCommand1Click(IndexAsInteger)
DimPrompt,Title,DefaultAsString
DimxPos,yPosAsInteger
SelectCaseIndex
Case0
Prompt=Textl(0).Text
Title=Textl(1).Text
Default=Textl(2).Text
IfPosChkThen
xPos=Vai(Textl(3).Text)
yPos=Vai(Textl(4).Text)
a$=InputBox(Prompt,Title,Default,xPos,yPos)
Else
a$=InputBox(Prompt,Title,Default,xPos,yPos)
EndIf
Labell(5).Caption=〃謝謝您的投票,您的選擇是"&a$&”!"
Case1
UnloadMe
EndSelect
EndSub
按下F5運(yùn)行程序,你會(huì)看到這樣的結(jié)果。圖6—4,6—5。是不是有種受騙
的感覺,啊喲喲,可不是我的錯(cuò),就是這么容易嘛!
從剛才的例子里,我們接觸了一些VB中的輸入方法,其實(shí)數(shù)據(jù)輸入不
僅僅局限于向Text框中輸入數(shù)據(jù),數(shù)據(jù)的輸入還有許多其他的方法,譬如
前面的Checkl也是向程序發(fā)出一定的信息,只要是通過操作向計(jì)算機(jī)發(fā)布
命令就可以叫做輸入,下面我們來一一介紹。
首先要介紹的當(dāng)然是輸入用到最多的Text框。Text沒有Click事件,
它的缺省事件是Change,也就是當(dāng)Text框里的一旦內(nèi)容改變就會(huì)激發(fā)該事
件發(fā)生,還是讓我們用實(shí)例說話吧。
Text有幾個(gè)特殊的屬性,一是MultiLine(多行)屬性,MultiLine屬
性為False的時(shí)候,不論文本有多長(zhǎng),它都會(huì)在一行里顯示下去,換行符
無效,當(dāng)它為True的時(shí)候,字符串顯示到Text框邊緣的時(shí)候就會(huì)自動(dòng)換
行。另一個(gè)與之配合的屬性是ScrollBars屬性,它有4個(gè)值,。到3,分
別是沒有滾動(dòng)條,水平滾動(dòng)條,垂直滾動(dòng)條,和二者都有,它是一個(gè)只讀
屬性,也就是說只有在程序設(shè)計(jì)過程中才能改變,而不能在程序運(yùn)行中改
變,但是我們可以通過API解決運(yùn)行中改變的問題,我們放在以后再講。
Passwordchart屬性,我們經(jīng)常在程序操作中遇到要填寫密碼的部分,為了
保密起見,在屏幕上顯示的字符一般“*”表示,并且這時(shí)是無法用剪貼板
的,這在VB中非常容易做到,把Passwordchart中設(shè)一個(gè)用來代替字符串
的字符即可,并不一定是哦。
下面我們完成一個(gè)有趣的小程序,是我以前遇到過的一個(gè)程序,我對(duì)
其進(jìn)行了部分修改。程序的意思是這樣的,假設(shè)你是一個(gè)司機(jī)應(yīng)超速被警
察扣留,現(xiàn)在需要你向警察陳述你的理由,如果你的話能打動(dòng)他,就可以
免交罰金,如果你在規(guī)定的字?jǐn)?shù)里沒有說出什么有震撼力的話,那老兄你
可就慘了,交錢吧。J
這個(gè)程序比原來的英文程序有了幾點(diǎn)不同,第一,由于用到的是雙字
節(jié)中文的中文,所以對(duì)于檢測(cè)中文字符和英文有很大不同,第二,原來的
英文程序不管你說多少,警察依然是依法從事,本例中給了犯規(guī)者10%的免
罰機(jī)會(huì)(有點(diǎn)無聊……L,不過也是為了學(xué)一些東東嘛)。下面就跟我來
設(shè)計(jì)窗體吧。(如圖6—6)
FormlIconStop圖標(biāo)
Caption停車檢查
BorderStyle3
Label1Caption警官,我超速是有原因的,
請(qǐng)聽我說:
BackColor&H00808080&
ForeColor&H80000012&
Labe12Caption你必須在30字之內(nèi)完成你
理由的申訴,否則將受到罰款!
BackColor&H00808080&
ForeColor&H00FF0000&
TextlMultiLinkTrue
Text"”
PicturelAutosizeTrue
BackColor&H00808080&
VisibleTrue
Picture2AutosizeTrue
BackColor&H00808080&
VisibleFalse
PicturesAutosizeTrue
BackColor&H00808080&
VisibleFalse
Command1VisibleFalse
三個(gè)圖片框Picture1—3的Picture屬性分別為綠燈,黃燈和紅燈,
這些圖標(biāo)在VB目錄下的Graphics\Icons\Traffic下(VB5),或是VB目
錄下的Icons\Traffic下(VB4、VB3),你還可以為L(zhǎng)abel1在Font屬性
里選一個(gè)合適的字體和字重。下面我們來看代碼:
首先初始化程序:
PrivateSubForm_Load()
'把Command1放在水平的中央
Command1.Top=Label2.Top+200
Command1.Left=(Forml.Width-Command1.Width)/2
'重疊三個(gè)圖片框
Picture2.Left=Picturel.Left
Picture2.Top=Picturel.Top
Picture3.Left=Picturel.Left
Pictures.Top=Picturel.Top
EndSub
下面我來講一講程序是怎樣運(yùn)行的,我們將用到Text的Change事件,
每當(dāng)字符串改變一次就對(duì)它進(jìn)行一次檢查,算出已經(jīng)說的字?jǐn)?shù),當(dāng)字?jǐn)?shù)超
過10時(shí),下面的紅綠燈會(huì)變成黃色,并且在這時(shí)隨機(jī)抽取一個(gè)數(shù),它在一
個(gè)范圍內(nèi)出現(xiàn)的可能是10%,如果在這個(gè)范圍內(nèi)就可以免交罰金,如果不在
范圍則繼續(xù),當(dāng)文字超過20的時(shí)候,紅綠燈會(huì)變成紅色,再一次抽取隨機(jī)
數(shù)字,步驟同上,如果30個(gè)字已滿,再進(jìn)行一次檢查,如果你真的那么不
幸就該罰款了。
程序的步驟清楚了,我們?cè)趤砜纯闯绦虻囊c(diǎn)。由于中文是雙字節(jié)字
符,也就是說一個(gè)漢字占兩個(gè)ASC碼的位置,而VB顯然是為英語國(guó)家設(shè)計(jì)
的用Len函數(shù)無法返回漢字字節(jié),也就是說一個(gè)漢字和和一個(gè)ASC字符在
Len函數(shù)中得到的值是一樣的,這就需要特殊處理。用Asc()函數(shù),在括
號(hào)內(nèi)放入一個(gè)ASC字符或字符串,它會(huì)把第一個(gè)ASC碼轉(zhuǎn)化為0—255的數(shù)
值,而把一個(gè)漢字放入,它的值必然不在0—255,這也就可以作為判定漢
字的基礎(chǔ)。我們可以把英文算作半個(gè)漢字。
第六章輸入(二)
下面我們來看看代碼:
在General里聲明窗體級(jí)變量:
DimLevelAsInteger
PrivateSubCommand1Click()
UnloadMe
EndSub
PrivateSubTextlChange()
DimStrLengthAsInteger*字符串長(zhǎng)度
DimRandomNumAsSingle,隨機(jī)數(shù)
DimStrlAsString
DimaAsString
Dimi,Temp
StrLength=O'每次開始時(shí)把字符串長(zhǎng)度還原為0
a=Textl.Text
Fori=1ToLen(a)'Len(a)代表字符串的長(zhǎng)度
Temp=Asc(Mid$(a,i,1))'挨個(gè)取字符
IfTemp>255OrTemp<0Then,不是ASC碼
StrLength=StrLength+2
Else
StrLength=StrLength+1
EndIf
Nexti
StrLength=StrLength/2
SelectCaseStrLength
Case0To9
Picturel.Visible=True
Picture2.Visible=False
Pictures.Visible=False
Label2.Caption="慢慢說。你還有“&Str(30-StrLength)&”個(gè)字可
以說〃
Level=1
Case10To19
IfLevel=1Then
RandomNum=Rnd*10'得到隨機(jī)數(shù)
IfRandomNum<=10AndRandomNum>9Then
Textl.Enabl
溫馨提示
- 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. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國(guó)快速連接器數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025年中國(guó)溫度風(fēng)爐市場(chǎng)調(diào)查研究報(bào)告
- 2025年度草捆生物質(zhì)燃料供應(yīng)合同3篇
- 2025年度綠色生態(tài)農(nóng)資銷售合作合同范本2篇
- 2025年農(nóng)業(yè)觀光休閑果園生態(tài)農(nóng)業(yè)技術(shù)研發(fā)與應(yīng)用合同4篇
- 三方債務(wù)合同:2024年企業(yè)互保案例版
- 二零二五年度暖氣設(shè)備生產(chǎn)與市場(chǎng)拓展承包合同范本4篇
- 二零二五年度建筑渣土清運(yùn)及環(huán)保處理承包協(xié)議4篇
- 二零二五版女方出軌離婚時(shí)子女監(jiān)護(hù)權(quán)及贍養(yǎng)費(fèi)協(xié)議范本3篇
- 2025年槳扇發(fā)動(dòng)機(jī)項(xiàng)目風(fēng)險(xiǎn)分析和評(píng)估報(bào)告
- 鉗工考試題及參考答案
- 移動(dòng)商務(wù)內(nèi)容運(yùn)營(yíng)(吳洪貴)任務(wù)五 引發(fā)用戶共鳴外部條件的把控
- 工程造價(jià)專業(yè)職業(yè)能力分析
- 醫(yī)藥高等數(shù)學(xué)知到章節(jié)答案智慧樹2023年浙江中醫(yī)藥大學(xué)
- 沖渣池施工方案
- 人教版初中英語八年級(jí)下冊(cè) 單詞默寫表 漢譯英
- 學(xué)校網(wǎng)絡(luò)信息安全管理辦法
- 中國(guó)古代文學(xué)史 馬工程課件(下)21第九編晚清文學(xué) 緒論
- 2023年鐵嶺衛(wèi)生職業(yè)學(xué)院高職單招(語文)試題庫(kù)含答案解析
- 2205雙相不銹鋼的焊接工藝
- 2023年全國(guó)高中數(shù)學(xué)聯(lián)賽江西省預(yù)賽試題及答案
評(píng)論
0/150
提交評(píng)論