Ch

ng Sáu - Dùng d ki n

ươ

ữ ệ

ươ ề ệ ể ả ọ ộ ng 5 ta h c qua các đi m căn b n v vi c dùng variables. Vì công vi c chính c a m t ủ ng ti n đ ệ ệ ề ươ ứ ế ể Trong ch ch ử ươ làm vi c v i variables thì càng ti n l ng n y ta s h c: i. Trong ch ng trình là x lý data ch a trong variables, cho nên n u VB6 cho ta càng nhi u ph ệ ớ ệ ợ ẽ ọ ươ ầ

• • • • •

ữ ụ ệ ớ lo i data type n y qua lo i data khác ừ ạ ạ ế ủ ủ i sao nó h u d ng Boolean variable, t ạ Variant variable, cách làm vi c v i nó. Cách bi n đ i (convert) t ầ ổ Arrays c a variables và Arrays c a controls Cách t o m t data type theo ý mình ạ ộ

Boolean Variables

True hay False. Khi h c v Statement ạ ể ấ ỉ ng 4, ta đã nói s qua v Boolean data type. Cái ph n ề ộ ơ ầ ở ữ ữ ọ ề gi a hai ch IF và ả ủ ế ộ

ỏ ỉ ể ạ ạ ộ i sao ta không th dùng Integer và gi ể ả ặ ầ c, nh ng cái khác bi t rõ r ng ằ ệ ế ả ta dùng +, -, *, \ trong khi v i Boolean ớ ạ i h n ư ậ ệ đ làm vi c ể ụ ta dùng OR, AND, NOT, XOR. Th xem thí d ử ớ Boolean là lo i data ch có th l y m t trong hai values: IF...THEN trong ch ươ Logical Expression và k t qu c a m t Logical Expression là m t Boolean c g i là THEN đ ộ ượ ọ value. N u đi u ki n đu c th a mãn thì value là True, n u không thì là False. ế ợ ệ ề ế B n h i n u m t variable ch có th có hai values, t ỏ ế cách dùng trong vòng hai values 1 và 0 thôi, c n gì ph i đ t ra Boolean data type. Làm nh v y cũng t chính là khi ta operate trên 2 variables ta ph i bi đ ư ượ v i Integer ớ i đây: d ướ

' 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

1

Dim IAge As Integer Dim sPersonalWorth As Single bAdult = (IAge >= 18) bRich = (sPersonalWorth > 1000000) If bAdult And bRich Then StandForTheElection End If

i th a mãn hai đi u ki n: v a tr ộ ườ ừ ề ệ ưở ổ ng thành (18 tu i ụ ừ ỏ ể ạ ng trình đ c khó hi u, th hai cái Logical Expression c a IF ở ế ể ế ệ ươ ứ ấ ứ ể ử ứ ủ ệ ớ ẫ ng trình có v t nhiên và d đ c nh ti ng Anh thông ẻ ự ươ ế ư ế ễ ọ Trong thí d trên, ta l p trình đ n u m t ng ậ tr lên) , v a giàu có (có trên 1 tri u b c) thì có th ra ng c N u ta dùng Integer, th nh t ch ọ statement v n phài làm vi c v i operator AND. Trong khi đó n u dùng Boolean thì ch th ng. ườ

Variant Variables

ộ ạ ậ ả ộ ể ứ ộ ấ ệ ụ ọ ố ả ạ ề ư ậ ạ ỗ ữ ề ể ứ ủ ỉ ả ế ệ ạ ố ắ ả ế ộ ổ ạ ẽ ị ẹ ầ ấ ớ c nh ng tr ữ ợ ướ ị ố ườ ể ố ắ ặ ự ị ữ ữ ậ ạ ầ strongly typed languages, ch ng h n nh Pascal, C++, Java .v.v.. Sau n y n u ta ư ắ ế ẳ ầ ề ữ t tích Variant variables c a VB6. ủ ệ ư ề ộ ỉ c ch a bên trong m t Varaint variable b ng cách dùng ượ ứ ằ ộ ề Variant variable có th ch a Text String, Number, Date, th m chí c m t Array (m t lo t nhi u variables cùng data type). Nhìn thoáng qua nó r t ti n d ng, nh ng khi m t Variant variable đ ượ c dùng nhi u ch , trong nhi u tình hu ng khác nhau, b n ph i th n tr ng. Lý do là vì variant variable có th ch a nh ng lo i data types khác nhau, nên khi b n operate hai variable có data type khác nhau, Visual Basic 6 c g ng bi n đ i m t trong hai variable thành data type c a variable kia đ làm ể vi c, k t qu là th nh tho ng b n s b k t. ọ Các tay Software Engineers thu n túy r t ghét l p trình v i data không đu c Declare rõ ràng. H ậ ạ không mu n b h vì vô tình. Thà r ng đ Language Compiler b t g p tr ng h p b n ợ ằ vô tình operate trên hai variables có data type khác nhau. Có khi ta b c mình vì Compiler khó tánh, ấ nh ng s tránh b nh ng surprise (ng c nhiên) t n kém sau n y. Các ngôn ng l p trình g t gao y ố ẽ ư đu c g i là ạ ợ ọ dùng .NET thì các ngôn ng C#, VB.NET (VB7) đ u là strongly typed. Trong VB7, Microsoft cho l u đài bi ư Công vi c Declare m t Variant variable cũng gi ng nh Declare m t data type khác. Ch có đi u ta ố ệ có th bi ể ế Function VarType nh d ộ t data type th t s đang đ i đâ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

2

End Sub

ươ ỗ ng trình s display giá tr c a các Data Types trong m i ị ủ ẽ Khi ta click button ShowDataTypes ch tr ng h p: ợ ườ

Sau đây là b ng li t kê nh ng VarTypes thông d ng: ả ệ ụ ữ

Giá tr VarType

Chú thích

0-vbEmpty

Không có gì trong variant

1-vbNull

Không có valid (h p l ) data trong variant ợ ệ

2-vbInteger

Variant ch a Integer ứ

4-vbSingle

Variant ch a Single ứ

7-vbDate

Variant ch a Date/Time ứ

8-vbString

Variant ch a String

9-vbObject

Variant ch a m t Object

11-vbBoolean

Variant ch a Boolean ứ

Ð làm vi c v i đ lo i VarTypes b n có th dùng Select Case nh sau: ạ ệ ớ ủ ạ ư ể ể

Private Sub Process_Click() Select Case VarType(vVariant) Case vbString ' ... Case vbBoolean ' ... Case vbInteger ' ... Case vbDate

3

' ... End Select End Sub

Constants (H ng s ) ố ằ

ể ấ ệ ụ ứ ổ ố ươ ư ố ệ ầ ự ế ộ ươ ng trình, ta đ t tên Constant và cho nó m t value t ng trình cho 5 chi c xe ch y đua. Ð kh i hành các chi c xe ạ i ế ấ ị ề ụ ặ ế ể ạ ở ộ Variables r t ti n d ng đ chúng ta dùng ch a các data có th bi n đ i value trong su t quá trình ể ế ờ ng trình. Nh ng đôi khi chúng ta mu n có m t lo i variable mà value không bao gi x lý c a ch ộ ạ ủ ử Constant đ dùng vào vi c n y. Thí d nh thay gì dùng tr c ti p môt con s thay đ i, VB6 cho ta ố ể ụ ư ổ nhi u ch trong ch hay m t Text String ỗ ộ ở t ch m t ch nh t đ nh. Thí d ta vi ươ ế ỗ ta dùng m t FOR...LOOP đ n gi n nh : ư ả ơ ộ

For ICar = 1 To 5 Call StartCar (ICar) Next

nhi u n i khác trong ch ề ng trình, m i l n nói đ n con s các xe ta dùng s ế ươ ầ ng t ươ ế ỗ ầ ả ơ ổ nh v y ự ư ậ ở ố ế ố ọ ậ ộ ổ ổ ấ ả ệ ể ư ậ ố ạ ấ ả ộ ố ề ố T ố ố t c các con s 5 5. N u sau n y mu n thay đ i con s các xe thành ra 10, ta ph i tìm và thay đ i t n y thành ra 10. N u không th n tr ng ta có th thay đ i m t con s 5 dùng cho chuy n gì khác, ể ầ ch không ph i cho con s các xe, thành ra 10 - nh v y ta vô tình t o ra m t bug. Ð tránh v n đ ớ n y ta có th dùng Constant nh sau: ầ ư ể

Const NUMBER_OF_CARS = 10 For ICar = 1 To NUMBER_OF_CARS Call StartCar (ICar) Next

ầ ỉ ầ ươ ủ ố ng trình, Sau n y mu n thay đ i con s các xe, ta ch c n edit value c a Constant. Trong kh p ch ni nào nh c đ n con s các xe ta dùng ch NUMBER_OF_CARS, v a d hi u, v a tránh l m l n. ầ ố ắ ế ừ ễ ể ắ ừ ổ ố ữ ẫ

Bi n đ i (convert) t lo i data type n y qua lo i data khác ế ổ ừ ạ ạ ầ

ầ ề ừ ạ ầ ủ ộ ộ lo i n y qua lo i khác, VB6 cho ta m t ấ i đây. Xin l u r ng khi call các Functions n y, n u b n đ a m t data value b t ạ ạ ư ả ướ ư ằ ế ầ ộ thì có th b error. Nhi u lúc ta c n ph i convert data type c a m t variable t s các Functions d ố h p l ể ị ợ ệ

Conversion Function

Chú thích

ế

ượ c

CBool ()

Ð i parameter ra True hay False. N u Integer value khác 0 thì đ ổ đ i thành True ổ

0 đ n 255 n u có th đ

ố ừ

ể ượ

ế

ế

ế c, n u

CByte ()

Ð i parameter ra m t con s t ộ c thì là 0. không đ

ượ

CDate ()

Ð i parameter ra Date

CDbl ()

Ð i parameter ra Double precision floating point number

CInt ()

Ð i parameter ra Integer

4

CSng ()

Ð i parameter ra Single precision floating point number

CStr ()

Ð i parameter ra String

ạ ể ể ộ ặ ế ư ả ộ ế $ không ph i là m t digit. N u Input String là "62.4B" thì Val returns 62.4. ả ộ ể ấ , ấ ộ ế ữ ế ộ ơ ạ ở ể ứ ỹ ụ ư ế ớ ụ i (thí d nh Âu Châu hay M ). CSng cũng ệ ố ớ ể ị ư ư ệ ế ố ả ứ ự ấ ủ ạ ụ ể ắ ầ ạ ể Ngoài các Function nói trên b n cũng có th dùng Function Val đ convert m t String ra Number. L u ý là khi Function Val process m t String n u nó g p m t character nào không ph i là digit hay decimal point thì nó không process ti p n a. Do đó n u Input String là "$25.50" thì Val returns con s 0 vì ố CDbl là Function dùng đ convert m t String ra s an toàn nh t. Input String có th ch a các d u ố trên th gi và . (thí d : 1,234,567.89) tùy theo n i b n làm vi c gi ng nh CDbl nh ng n u con s l n h n 1 tri u nó có th b bug. ơ Cái bug b c mình nh t c a CSng là n u Input String không có gì c (t c là InputString="") thì ế Function CSng cho b n Type Mismatch Error. Do đó đ kh c ph c cái khuy t đi m n y b n có th vi ể t cho mình m t Function t m đ t tên là CSingle đ dùng 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

nhau, thí d nh đi m thi c a 10 h c sinh, n u ph i đ t tên ạ ươ ụ ư ể ả ặ ủ ế ợ ọ ề ừ ả ậ ộ i m t b ng cách dùng m t con s g i là Array đ có m t tên chung cho c nhóm, ộ ng t ụ ấ ệ ườ ArrayIndex. B n sạ ẽ ự ọ ủ ừ ạ ộ ằ ể ố ọ Khi b n có nhi u variables t khác nhau cho t ng variable (thí d : HoaMark, TaiMark, SonMark, TamMark, NgaMark, HuongMark .v.v..) thì th t là c c nh c và b t ti n. B n có th dùng ể r i nói đ n đi m c a t ng ng ể ế ồ Declare nh sau: ư

Dim myStudentMarks(10) as Integer

t ạ ỗ ọ ế ằ ế myStudentMarks(i), mà i là ArrayIndex. d ta mu n tính t ng s đi m: K đó b n nói đ n đi m c a m i h c sinh b ng cách vi ủ ế Gi ố ể ả ụ ể ổ ố

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

5

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 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

ậ ớ ộ Array ụ ề ả ớ ắ ế ể ố Khi ta Declare Dim myStudentMarks(10) as Integer th t ra ra ta có m t Array v i 11 Elements ch không ph i 10, vì Array b t đ u v i ArrayIndex value=0. Có đi u trong thí d trên ta ắ ầ ớ c ý không nh c đ n ArrayElement 0. N u th t s mu n có chính xác 10 Elements thôi, ta có th ậ ự ế ố Declare nh sau: ư

Dim myStudentMarks (1 To 10 ) As Integer

ạ ừ ụ ế ể ố Lo i Array ta v a dùng qua là Single Dimention. N u trong thí d trên ta mu n tính đi m c a h c ủ ọ sinh trong 3 l p h c, 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

ể ề ộ ề ệ ế ệ ộ ữ ứ ộ ể ớ ư

ể ằ ồ ạ ả ờ ộ ộ ế ạ ố ớ ừ ượ ế ụ ẻ ồ ứ ấ ạ ẽ ế ầ ạ ọ ộ

lblClass và m t Array of Textboxes tên ụ ộ ộ ạ Nhân ti n nói chuy n v Array cho variables, ta cũng có th dùng Array cho controls cùng m t lo i trong m t Form. N u ta có nhi u Label controls (hay Textbox controls ) v i nh ng ch c năng gi ng ố nhau trong ch Property Index ng trình, ta có th dùng cùng m t tên cho các controls, nh ng khác ươ value c a chúng. ủ ẽ ỏ B n có th create m t Array of Labels b ng cách Copy cái Label r i Paste nó lên Form. VB6 s h i ạ ứ ấ đ ng cho Label th nh t i Yes, VB6 s t n u b n mu n có m t Array of controls. N u b n tr l ẽ ự ộ ế Index value=0 và Label m i v a đ c Pasted Index value=1. Sau đó n u b n ti p t c Paste cái ạ ế Label đã có Index r i thì VB6 không h i n a và vui v tăng Index value lên cho các Labels sau. Do ỏ ữ đó n u b n g i Label th nh t là lblClass r i Copy và Paste nó 2 l n b n s có m t Array of 3 ồ Labels tên lblClass và các Index values 0, 1, 2. Trong thí d sau đây, ta create m t Array of Labels tên txtClassMark. Trong Sub Form_Load ta generate Captions c a các Labels. ủ

Private Sub Form_Load() Dim i As Integer

6

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

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ú: N u b n có m t Array of Textboxes g m ch có 2 Textboxes, r i sau đó b n Delete m t ộ ồ Textbox và mu n dùng Textbox còn l i làm cái Textbox duy nh t, b n v n ph i refer (nh c đ n nó) ạ ắ ế ồ ẫ ạ ấ ả ố

7

ụ txtClassMark(0) ), dù r ng bây gi ằ ấ ờ ố ạ ế ể ạ i sao ể ạ ẹ ế ạ ạ ẽ ứ ế ạ ư ấ ị ẫ nó là Textbox duy nh t mang tên b ng cách dùng Index (thí d : ằ y. N u b n mu n d p cái v Index thì b n ph i vào Properties Window đ Delete cái Index value ấ ả ụ c a ArrayTextbox. N u b n không l u ý đi m n y thì có khi b n s b t tóc không hi u t ầ ể ủ mình dùng đúng tên mà VB6 v n nh t đ nh r ng cái Textbox b n nói đ n không hi n h u, vì VB6 ệ ữ ằ c n Index value c a Textbox. ầ ủ

ỉ ẽ ầ ế Th nh tho ng, khi Declare Array b n không bi ả dimension. Trong tr Dynamic Arrays và Declare m t Array nh sau: ạ ng h p y b n có th dùng ạ ỗ t rõ mình s c n bao nhiêu Elements cho m i ư ợ ấ ườ ể ộ

Private myStudentMarks() As Integer

ạ ể ộ ố ở ữ ấ ế ố ặ ơ ươ ủ ủ ng lai. Khi nào mu n thay đ i dimension c a t là b n mu n dùng Dynamic ổ ạ ố Vì b n không đ m t con s Array và dimension c a nó có th s thay đ i trong t Dynamic Array b n dùng gi a hai d u ngo c đ n nên VB6 bi ổ ể ẽ ReDim keyword: ạ

ReDim myStudentMarks(10)

ReDim Preserve myStudentMarks(10)

ổ ả ủ ừ ư ữ Preserve gi ủ ữ ứ ế Element 0 đ n ủ nguyên values c a các Elements c a

ạ ầ ế ả t các Elements th p nh t và cao nh t b ng cách ấ ấ ằ ấ C hai statements trên đ u đ i dimension c a Array myStudentMarks thành 11 (t ề Element 10), nh ng trong statement th nhì ch Array. Khi làm vi c v i Array th nh tho ng b n c n bi ỉ ệ ớ dùng 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

ể ế ạ ầ ộ ộ Ngoài ra n u dùng Dynamic Array, b n có th assign m t Array n y cho m t Array khác, thay vì ph i dùng FOR ...LOOP đ copy t ng Array Element. ể ừ ả

MyArray = HisArray

Data Type c a b n ủ ạ

8

ạ ộ ậ ủ ể ạ ả ặ ộ B n có th gom các m nh Data c a cùng m t v t nào đó thành m t nhóm và đ t tên cho lo i Data Type y nh sau: ư ấ

Type EmployeeRec ' EmployeeRec as name of this new Data Type Firstname As String 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#

i ta g i lo i Data Type n y là ọ ườ ể ầ ạ ớ ạ ộ t nó v i các lo i Simple Data Type nh Integer, Boolean, Single .v.v.. B n đ ý cách nói đ n m t Structured Data Type đ phân ể ư ế ệ ả ạ ộ ư ủ ố

t khác đ tránh typing nhi u l n ch MyEmployee b ng cách dùng keyword With ề ầ ữ ế ể ằ Trong Software Engineering, ng bi m nh data, MyEmployee.Firstname, gi ng nh là Property Firstname c a m t control tên MyEmployee. Có m t cách vi ộ nh sau: ư

With MyEmployee .Firstname = "David" .Surname = "Smith" .Salary = 25000 .DateOfBirth = #14/6/1963# End With

ị ặ ầ ầ ấ ệ ợ ể ư ầ i, nh ng sau n y ta có th ữ ữ ệ ẳ M c d u đ nh nghĩa và dùng Structured Data Type cách n y r t ti n l dùng Class đ đ t đ ơ ữ ộ đ nh nghĩa nh ng m nh data mà còn đ ra cách x lý chúng n a. ả ị c cùng m t m c tiêu mà còn h u hi u h n n a. Trong Class ch ng nh ng ta ữ ể ạ ượ ữ ụ ề ử

9