Giáo trình VB6 - Chương 6: Dùng dữ kiện

Trong chươ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 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ương tiện để làm việc với variables thì càng tiện lợi. Trong chương nầy ta sẽ học:

• Boolean variable, tại sao nó hữu dụng

• Variant variable, cách làm việc với nó.

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

• Arrays của variables và Arrays của controls

• Cách tạo một data type theo ý mình

 

doc9 trang | Chuyên mục: Visual Basic 6.0 | Chia sẻ: dkS00TYs | Lượt xem: 1574 | Lượt tải: 3download
Tóm tắt nội dung Giáo trình VB6 - Chương 6: Dùng dữ kiện, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
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 
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ương trình, 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 
Nhiều lúc ta cần phải convert data type của một variable từ loại nầy qua loại khác, VB6 cho ta một số các Functions dướ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 hợp lệ thì có thể bị error.
Conversion Function
Chú thích
CBool ()
Ðổi parameter ra True hay False. Nếu Integer value khác 0 thì được đổi thành True
CByte ()
Ðổi parameter ra một con số từ 0 đến 255 nếu có thể được, nếu không được thì là 0.
CDate ()
Ðổi parameter ra Date
CDbl ()
Ðổi parameter ra Double precision floating point number
CInt ()
Ðổi parameter ra Integer 
CSng ()
Ðổi parameter ra Single precision floating point number
CStr ()
Ðổi parameter ra String
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ì $ không phải là một digit. Nếu Input String là "62.4B" thì Val returns 62.4.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 , và . (thí dụ: 1,234,567.89) tùy theo nơi bạn ở trên thế giới (thí dụ như Âu Châu hay Mỹ). CSng cũng 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 
Khi bạn có nhiều variables tương tợ nhau, thí dụ như điểm thi của 10 học sinh, nếu phải đặt tên 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 Array để có một tên chung cho cả nhóm, rồi nói đến điểm của từng người một bằng cách dùng một con số gọi là ArrayIndex. Bạn sẽ Declare như sau:
Dim myStudentMarks(10) as Integer 
Kế đó bạn nói đến điểm của mỗi học sinh bằng cách viết myStudentMarks(i), mà i là ArrayIndex. Giả dụ ta muốn tính tổng số điểm: 
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
 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 thật ra ra ta có một Array với 11 Array 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 
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ương trình, ta có thể dùng cùng một tên cho các controls, nhưng khác Property Index 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 nếu bạn muốn có một Array of controls. Nếu bạn trả lời Yes, VB6 sẽ tự động cho Label thứ nhất 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 lblClass và một Array of Textboxes tên txtClassMark. Trong Sub Form_Load ta generate Captions của các 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 
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ó) bằng cách dùng Index (thí dụ: txtClassMark(0) ), dù rằng bây giờ nó là Textbox duy nhất mang tên ấ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ại sao 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ết rõ mình sẽ cần bao nhiêu Elements cho mỗi dimension. Trong trường hợp ấy bạn có thể dùng Dynamic Arrays và Declare một Array như sau: 
Private myStudentMarks() As Integer 
Vì bạn không để một con số ở giữa hai dấu ngoặc đơn nên VB6 biết là bạn muốn dùng Dynamic Array và dimension của nó có thể sẽ thay đổi trong tương lai. Khi nào muốn thay đổi dimension của Dynamic Array bạn dùng ReDim keyword: 
ReDim myStudentMarks(10) 
ReDim Preserve myStudentMarks(10) 
Cả hai statements trên đều đổi dimension của Array myStudentMarks thành 11 (từ Element 0 đến Element 10), nhưng trong statement thứ nhì chữ Preserve giữ nguyên values của các Elements của Array. Khi làm việc với Array thỉnh thoảng bạn cần biết các Elements thấp nhất và cao nhất bằng cách 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 
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# 
Trong Software Engineering, người ta gọi loại Data Type nầy là Structured Data Type để phân biệ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 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ết khác để tránh typing nhiều lần chữ MyEmployee bằng cách dùng keyword With như sau:
With MyEmployee 
 .Firstname = "David" 
 .Surname = "Smith" 
 .Salary = 25000 
 .DateOfBirth = #14/6/1963# 
End With 
Mặc dầu định nghĩa và dùng Structured Data Type cách nầy rất tiện lợi, nhưng sau nầy ta có thể dùng Class để đạt đượ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 định nghĩa những mảnh data mà còn đề ra cách xử lý chúng nữa.

File đính kèm:

  • docGiáo trình VB6 - Chương 6_Dùng dữ kiện.doc
Tài liệu liên quan