You are on page 1of 9

Chng Su - Dng d kin

Trong chng 5 ta hc qua cc im cn bn v vic dng variables. V cng vic chnh ca mt chng trnh l x l data cha trong variables, cho nn nu VB6 cho ta cng nhiu phng tin lm vic vi variables th cng tin li. Trong chng ny ta s hc:

Boolean variable, ti sao n hu dng Variant variable, cch lm vic vi n. Cch bin i (convert) t loi data type ny qua loi data khc Arrays ca variables v Arrays ca controls Cch to mt data type theo mnh

Boolean Variables Boolean l loi data ch c th ly mt trong hai values: True hay False. Khi hc v Statement IF...THEN trong chng 4, ta ni s qua v Boolean data type. Ci phn gia hai ch IF v THEN c gi l Logical Expression v kt qu ca mt Logical Expression l mt Boolean value. Nu iu kin uc tha mn th value l True, nu khng th l False. Bn hi nu mt variable ch c th c hai values, ti sao ta khng th dng Integer v gii hn cch dng trong vng hai values 1 v 0 thi, cn g phi t ra Boolean data type. Lm nh vy cng c, nhng ci khc bit chnh l khi ta operate trn 2 variables ta phi bit r rng lm vic vi Integer ta dng +, -, *, \ trong khi vi Boolean ta dng OR, AND, NOT, XOR. Th xem th d di y: ' Use Integer with values 1 or 0 Dim IAnumber As Integer Dim IBnumber As Integer Dim IAge As Integer Dim sPersonalWorth As Single If (IAge >= 18) Then IAnumber = 1 Else IAnumber = 0 End If If (sPersonalWorth > 1000000) Then IBnumber = 1 Else IBnumber = 0 End If If (IAnumber = 1) And (IBnumber = 1) Then StandForTheElection End If '================================== ' Use Boolean Dim bAdult As Boolean Dim bRich As Boolean Dim IAge As Integer
1

Dim sPersonalWorth As Single bAdult = (IAge >= 18) bRich = (sPersonalWorth > 1000000) If bAdult And bRich Then StandForTheElection End If Trong th d trn, ta lp trnh nu mt ngi tha mn hai iu kin: va trng thnh (18 tui tr ln) , va giu c (c trn 1 triu bc) th c th ra ng c Nu ta dng Integer, th nht chng trnh c kh hiu, th hai ci Logical Expression ca IF statement vn phi lm vic vi operator AND. Trong khi nu dng Boolean th chng trnh c v t nhin v d c nh ting Anh thng thng. Variant Variables Variant variable c th cha Text String, Number, Date, thm ch c mt Array (mt lot nhiu variables cng data type). Nhn thong qua n rt tin dng, nhng khi mt Variant variable c dng nhiu ch, trong nhiu tnh hung khc nhau, bn phi thn trng. L do l v variant variable c th cha nhng loi data types khc nhau, nn khi bn operate hai variable c data type khc nhau, Visual Basic 6 c gng bin i mt trong hai variable thnh data type ca variable kia lm vic, kt qu l thnh thong bn s b kt. Cc tay Software Engineers thun ty rt ght lp trnh vi data khng uc Declare r rng. H khng mun b h v v tnh. Th rng Language Compiler bt gp trc nhng trng hp bn v tnh operate trn hai variables c data type khc nhau. C khi ta bc mnh v Compiler kh tnh, nhng s trnh b nhng surprise (ngc nhin) tn km sau ny. Cc ngn ng lp trnh gt gao y uc gi l strongly typed languages, chng hn nh Pascal, C++, Java .v.v.. Sau ny nu ta dng .NET th cc ngn ng C#, VB.NET (VB7) u l strongly typed. Trong VB7, Microsoft cho lu i bit tch Variant variables ca VB6. Cng vic Declare mt Variant variable cng ging nh Declare mt data type khc. Ch c iu ta c th bit data type tht s ang c cha bn trong mt Varaint variable bng cch dng Function VarType nh di y: Private Sub cmdShowDataTypes_Click() Dim sMess As String Dim vVariant As Variant vVariant = "Nguoi Tinh khong chan dung" ' Assign a String to vVariant sMess = VarType(vVariant) & vbCrLf ' use vbCrLF to display the next string on a new line vVariant = 25 ' Assign an Integer to vVariant sMess = sMess & VarType(vVariant) & vbCrLf vVariant = True ' Assign an Boolean value to vVariant sMess = sMess & VarType(vVariant) & vbCrLf ' Assign an Date to vVariant vVariant = #1/1/2001# ' enclose a Date string with #, instead of " as for normal Text String sMess = sMess & VarType(vVariant) MsgBox sMess End Sub Khi ta click button ShowDataTypes chng trnh s display gi tr ca cc Data Types trong mi trng hp:
2

Sau y l bng lit k nhng VarTypes thng dng:


Gi tr VarType 0-vbEmpty 1-vbNull 2-vbInteger 4-vbSingle 7-vbDate 8-vbString 9-vbObject 11-vbBoolean Ch thch Khng c g trong variant Khng c valid (hp l) data trong variant Variant cha Integer Variant cha Single Variant cha Date/Time Variant cha String Variant cha mt Object Variant cha Boolean

lm vic vi loi VarTypes bn c th dng Select Case nh sau: Private Sub Process_Click() Select Case VarType(vVariant) Case vbString ' ... Case vbBoolean ' ... Case vbInteger ' ... Case vbDate ' ... End Select End Sub
3

Constants (Hng s) Variables rt tin dng chng ta dng cha cc data c th bin i value trong sut qu trnh x l ca chng trnh. Nhng i khi chng ta mun c mt loi variable m value khng bao gi thay i, VB6 cho ta Constant dng vo vic ny. Th d nh thay g dng trc tip mt con s hay mt Text String nhiu ch trong chng trnh, ta t tn Constant v cho n mt value ti mt ch nht nh. Th d ta vit chng trnh cho 5 chic xe chy ua. khi hnh cc chic xe ta dng mt FOR...LOOP n gin nh: For ICar = 1 To 5 Call StartCar (ICar) Next Tng t nh vy nhiu ni khc trong chng trnh, mi ln ni n con s cc xe ta dng s 5. Nu sau ny mun thay i con s cc xe thnh ra 10, ta phi tm v thay i tt c cc con s 5 ny thnh ra 10. Nu khng thn trng ta c th thay i mt con s 5 dng cho chuyn g khc, ch khng phi cho con s cc xe, thnh ra 10 - nh vy ta v tnh to ra mt bug. trnh vn ny ta c th dng Constant nh sau: Const NUMBER_OF_CARS = 10 For ICar = 1 To NUMBER_OF_CARS Call StartCar (ICar) Next Sau ny mun thay i con s cc xe, ta ch cn edit value ca Constant. Trong khp chng trnh, ni no nhc n con s cc xe ta dng ch NUMBER_OF_CARS, va d hiu, va trnh lm ln. Bin i (convert) t loi data type ny qua loi data khc Nhiu lc ta cn phi convert data type ca mt variable t loi ny qua loi khc, VB6 cho ta mt s cc Functions di y. Xin lu rng khi call cc Functions ny, nu bn a mt data value bt hp l th c th b error.
Conversion Function CBool () Ch thch i parameter ra True hay False. Nu Integer value khc 0 th c i thnh True i parameter ra mt con s t 0 n 255 nu c th c, nu khng c th l 0. i parameter ra Date i parameter ra Double precision floating point number i parameter ra Integer i parameter ra Single precision floating point number i parameter ra String

CByte () CDate () CDbl () CInt () CSng () CStr ()

Ngoi cc Function ni trn bn cng c th dng Function Val convert mt String ra Number. Lu l khi Function Val process mt String nu n gp mt character no khng phi l digit hay decimal point th n khng process tip na. Do nu Input String l "$25.50" th Val returns con s 0 v $ khng phi l mt digit. Nu Input String l "62.4B" th Val returns 62.4. CDbl l Function dng convert mt String ra s an ton nht. Input String c th cha cc du , v . (th d: 1,234,567.89) ty theo ni bn trn th gii (th d nh u Chu hay M). CSng cng lm vic ging nh CDbl nhng nu con s ln hn 1 triu n c th b bug. Ci bug bc mnh nht ca CSng l nu Input String khng c g c (tc l InputString="") th Function CSng cho bn Type Mismatch Error. Do khc phc ci khuyt im ny bn c th vit cho mnh mt Function tm t tn l CSingle dng th cho CSng nh sau: Function CSingle(strNumber) As Single If Trim(strNumber) = "" Then CSingle = 0# Else CSingle = CSng(strNumber) End If End Function Arrays Khi bn c nhiu variables tng t nhau, th d nh im thi ca 10 hc sinh, nu phi t tn khc nhau cho tng variable (th d: HoaMark, TaiMark, SonMark, TamMark, NgaMark, HuongMark .v.v..) th tht l cc nhc v bt tin. Bn c th dng Array c mt tn chung cho c nhm, ri ni n im ca tng ngi mt bng cch dng mt con s gi l ArrayIndex. Bn s Declare nh sau: Dim myStudentMarks(10) as Integer K bn ni n im ca mi hc sinh bng cch vit myStudentMarks(i), m i l ArrayIndex. Gi d ta mun tnh tng s im: Sub CmdCalculateTotal_Click() Dim myStudentMarks(10) As Integer ' Declare array, assuming students' marks are Integers Dim TotalMark As Integer ' Use this variable to accumulate the marks Dim i As Integer ' Use i as ArrayIndex myStudentMarks(1) = 6 ' First student's mark myStudentMarks(2) = 7 ' Second student's mark myStudentMarks(3) = 5 myStudentMarks(4) = 9 myStudentMarks(5) = 6 myStudentMarks(6) = 8 myStudentMarks(7) = 9 myStudentMarks(8) = 10 myStudentMarks(9) = 6 myStudentMarks(10) = 7 TotalMark = 0 ' This statement is not required as VB6 initialises TotalMark to 0 ' Go through all students and add each student's mark to the Total
5

For i = 1 To 10 TotalMark = TotalMark + myStudentMarks(i) Next txtTotal.Text = CStr(TotalMark) ' Convert to String for display by assigning to Textbox txtTotal End Sub

Khi ta Declare Dim myStudentMarks(10) as Integer tht ra ra ta c mt Array vi 11 Array Elements ch khng phi 10, v Array bt u vi ArrayIndex value=0. C iu trong th d trn ta c khng nhc n ArrayElement 0. Nu tht s mun c chnh xc 10 Elements thi, ta c th Declare nh sau: Dim myStudentMarks (1 To 10 ) As Integer Loi Array ta va dng qua l Single Dimention. Nu trong th d trn ta mun tnh im ca hc sinh trong 3 lp hc, ta c th Declare Double Dimention Array nh sau: ' Four classes, each has up to 6 students Dim myStudentMarks(3, 5) As Integer ' Note that each dimension starts at 0 ' or ' Three classes, each has up to 5 students Dim myStudentMarks(1 To 3, 1 To 5) As Integer Nhn tin ni chuyn v Array cho variables, ta cng c th dng Array cho controls cng mt loi trong mt Form. Nu ta c nhiu Label controls (hay Textbox controls ) vi nhng chc nng ging nhau trong chng trnh, ta c th dng cng mt tn cho cc controls, nhng khc Property Index value ca chng. Bn c th create mt Array of Labels bng cch Copy ci Label ri Paste n ln Form. VB6 s hi nu bn mun c mt Array of controls. Nu bn tr li Yes, VB6 s t ng cho Label th nht Index value=0 v Label mi va c Pasted Index value=1. Sau nu bn tip tc Paste ci Label c Index ri th VB6 khng hi na v vui v tng Index value ln cho cc Labels sau. Do nu bn gi Label th nht l lblClass ri Copy v Paste n 2 ln bn s c mt Array of 3 Labels tn lblClass v cc Index values 0, 1, 2. Trong th d sau y, ta create mt Array of Labels tn lblClass v mt Array of Textboxes tn txtClassMark. Trong Sub Form_Load ta generate Captions ca cc Labels. Private Sub Form_Load() Dim i As Integer For i = 0 To 2 ' Label Index starts at 0, but Class number starts at 1 lblClass(i) = "Mark of Class " & CStr(i + 1) Next End Sub
6

Sub CmdCalculateTotal_Click() ' Three classes, each has up to 5 students Dim myStudentMarks(1 To 3, 1 To 5) As Integer Dim TotalMark As Integer Dim ClassMark As Integer Dim i As Integer ' Use as ArrayIndex for Class Dim j As Integer ' Use as ArrayIndex for StudentMark ' Students' marks of first class myStudentMarks(1, 1) = 6 myStudentMarks(1, 2) = 7 myStudentMarks(1, 3) = 5 myStudentMarks(1, 4) = 9 myStudentMarks(1, 5) = 6 ' Students' marks of second class myStudentMarks(2, 1) = 8 myStudentMarks(2, 2) = 8 myStudentMarks(2, 3) = 6 ' Students' marks third class myStudentMarks(3, 1) = 5 myStudentMarks(3, 2) = 7 myStudentMarks(3, 3) = 8 myStudentMarks(3, 4) = 6 For i = 1 To 3 ClassMark = 0 ' Intialise ClassMark of class i to 0 ' Now go through each Student in Class i For j = 1 To 5 ClassMark = ClassMark + myStudentMarks(i, j) ' Accumulate ClassMark of class i TotalMark = TotalMark + myStudentMarks(i, j) Next ' Display ClassMark of class i. Note that txtClassMark Index starts at 0, NOT 1 txtClassMark(i - 1).Text = CStr(ClassMark) Next txtTotal.Text = CStr(TotalMark) ' Display TotalMark End Sub Ghi ch: Nu bn c mt Array of Textboxes gm ch c 2 Textboxes, ri sau bn Delete mt Textbox v mun dng Textbox cn li lm ci Textbox duy nht, bn vn phi refer (nhc n n) bng cch dng Index (th d: txtClassMark(0) ), d rng by gi n l Textbox duy nht mang tn y. Nu bn mun dp ci v Index th bn phi vo Properties Window Delete ci Index value ca ArrayTextbox. Nu bn khng lu im ny th c khi bn s bt tc khng hiu ti sao mnh dng ng tn m VB6 vn nht nh rng ci Textbox bn ni n khng hin hu, v VB6 cn Index value ca Textbox.
7

Thnh thong, khi Declare Array bn khng bit r mnh s cn bao nhiu Elements cho mi dimension. Trong trng hp y bn c th dng Dynamic Arrays v Declare mt Array nh sau: Private myStudentMarks() As Integer V bn khng mt con s gia hai du ngoc n nn VB6 bit l bn mun dng Dynamic Array v dimension ca n c th s thay i trong tng lai. Khi no mun thay i dimension ca Dynamic Array bn dng ReDim keyword: ReDim myStudentMarks(10) ReDim Preserve myStudentMarks(10) C hai statements trn u i dimension ca Array myStudentMarks thnh 11 (t Element 0 n Element 10), nhng trong statement th nh ch Preserve gi nguyn values ca cc Elements ca Array. Khi lm vic vi Array thnh thong bn cn bit cc Elements thp nht v cao nht bng cch dng LBound v UBound. Private MyArray(10 to 20) As String LowestNum = LBound(MyArray) ' LBound returns 10 HighestNum = UBound(MyArray) ' UBound returns 20 Private YourArray( 2 to 5, 10 to 15) As Integer LowestNumOfFirstDimension = LBound(YourArray,1) ' LBound returns 2 HighestNumOfSecondDimension = UBound(YourArray,2) ' UBound returns 15 Ngoi ra nu dng Dynamic Array, bn c th assign mt Array ny cho mt Array khc, thay v phi dng FOR ...LOOP copy tng Array Element. MyArray = HisArray

Data Type ca bn Bn c th gom cc mnh Data ca cng mt vt no thnh mt nhm v t tn cho loi Data Type y nh sau: Type EmployeeRec ' EmployeeRec as name of this new Data Type Firstname As String
8

Surname As String Salary As Single DateOfBirth As Date End Type ' Now declare a variable of the new data type Dim MyEmployee As EmployeeRec MyEmployee.Firstname = "David" MyEmployee.Surname = "Smith" MyEmployee.Salary = 25000 MyEmployee.DateOfBirth = #14/6/1963# Trong Software Engineering, ngi ta gi loi Data Type ny l Structured Data Type phn bit n vi cc loi Simple Data Type nh Integer, Boolean, Single .v.v.. Bn cch ni n mt mnh data, MyEmployee.Firstname, ging nh l Property Firstname ca mt control tn MyEmployee. C mt cch vit khc trnh typing nhiu ln ch MyEmployee bng cch dng keyword With nh sau: With MyEmployee .Firstname = "David" .Surname = "Smith" .Salary = 25000 .DateOfBirth = #14/6/1963# End With Mc du nh ngha v dng Structured Data Type cch ny rt tin li, nhng sau ny ta c th dng Class t c cng mt mc tiu m cn hu hiu hn na. Trong Class chng nhng ta nh ngha nhng mnh data m cn ra cch x l chng na.

You might also like