Vn-Screen Forum
Bạn có muốn phản ứng với tin nhắn này? Vui lòng đăng ký diễn đàn trong một vài cú nhấp chuột hoặc đăng nhập để tiếp tục.



 
Trang ChínhTrang Chính  GalleryGallery  Latest imagesLatest images  Tìm kiếmTìm kiếm  Đăng kýĐăng ký  Đăng NhậpĐăng Nhập  
Bài Viết MớiTin NóngThống kê

Share | 
 

 Chương Sáu - Dùng dữ kiện (Học visual basic 6.0)

Xem chủ đề cũ hơn Xem chủ đề mới hơn Go down 
Tác giảThông điệp
TjaGoChangLj
Administrator
Administrator
TjaGoChangLj

Thanked : 14


Chương Sáu - Dùng dữ kiện (Học visual basic 6.0) _
Bài gửiTiêu đề: Chương Sáu - Dùng dữ kiện (Học visual basic 6.0)   Chương Sáu - Dùng dữ kiện (Học visual basic 6.0) Empty15/6/2011, 10:08 pm

Khóa Hàm Thụ Visual Basic 6.0


Chương Sáu - Dùng dữ kiện



<blockquote>

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


Boolean Variables


Boolean là loại data chỉ có thể lấy một trong hai values: True hay False. Khi học về Statement IF...THEN trong chương 4, ta đã nói sơ qua về Boolean data type. Cái phần ở giữa hai chữ IF và THEN được gọi là Logical Expression
và kết quả của một Logical Expression là một Boolean 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ại sao ta không thể
dùng Integer và giới hạn 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 được, nhưng cái
khác biệt chính là khi ta operate trên 2 variables ta phải biết rõ rằng để làm việc với Integer ta dùng +, -, *, \ trong khi với Boolean ta dùng OR, AND, NOT, XOR. Thử xem thí dụ dưới đây:
<blockquote><blockquote>
' 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
Dim sPersonalWorth As Single
bAdult = (IAge >= 18)
bRich = (sPersonalWorth > 1000000)
If bAdult And bRich Then
StandForTheElection
End If
</blockquote></blockquote>
Trong thí dụ trên, ta lập trình để nếu một người thỏa mãn hai điều kiện:
vừa trưởng thành (18 tuổi 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ương trình đọc khó hiểu, thứ hai cái
Logical Expression của IF statement vẫn phài làm việc với operator AND.
Trong khi đó nếu dùng Boolean thì chương trình có vẻ tự nhiên và dễ đọc như tiếng Anh thông thường.

Variant Variables


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ước những 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à strongly typed languages,
chẳng hạn như Pascal, C++, Java .v.v.. Sau nầy nếu ta 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ệt tích Variant variables của VB6.
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ết data type thật sự đang được chứa
bên trong một Varaint variable bằng cách dùng Function VarType như dưới đây:

<blockquote><blockquote>
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
</blockquote></blockquote>
Khi ta click button ShowDataTypes chương trình sẽ display giá trị của các Data Types trong mỗi trường hợp:
<blockquote><blockquote>Chương Sáu - Dùng dữ kiện (Học visual basic 6.0) Datatypes</blockquote></blockquote>
Sau đây là bảng liệt kê những VarTypes thông dụng:
<blockquote><blockquote>
Giá trị VarTypeChú thích
0-vbEmptyKhông có gì trong variant
1-vbNullKhông có valid (hợp lệ) data trong variant
2-vbIntegerVariant chứa Integer
4-vbSingleVariant chứa Single
7-vbDateVariant chứa Date/Time
8-vbStringVariant chứa String
9-vbObjectVariant chứa một Object
11-vbBooleanVariant chứa Boolean
</blockquote></blockquote>
Ðể làm việc với đủ loại VarTypes bạn có thể dùng Select Case như sau:
<blockquote><blockquote>
Private Sub Process_Click()
Select Case VarType(vVariant)
Case vbString
' ...
Case vbBoolean
' ...
Case vbInteger
' ...
Case vbDate
' ...
End Select
End Sub
</blockquote></blockquote>

Constants (Hằng số)


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 xử lý của
chương trình. Nhưng đôi khi chúng ta muốn có một loại variable mà value
không bao giờ thay đổi, VB6 cho ta Constant để dùng vào việc
nầy. Thí dụ như thay gì dùng trực tiếp môt con số hay một Text String ở
nhiều chỗ trong chương trình, ta đặt tên Constant và cho nó một value
tại một chỗ nhất định. Thí dụ ta viết chương trình cho 5 chiếc xe chạy
đua. Ðể khởi hành các chiếc xe ta dùng một FOR...LOOP đơn giản như:
<blockquote><blockquote>
For ICar = 1 To 5
Call StartCar (ICar)
Next
</blockquote></blockquote>
Tương tự như vậy ở 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ố 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ất cả các con số 5 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:
<blockquote><blockquote>
Const NUMBER_OF_CARS = 10
For ICar = 1 To NUMBER_OF_CARS
Call StartCar (ICar)
Next
</blockquote></blockquote>
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, nơi 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.
<blockquote><blockquote>
Conversion FunctionChú 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
</blockquote></blockquote>
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 ,.
(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:
<blockquote><blockquote>
Function CSingle(strNumber) As Single
If Trim(strNumber) = "" Then
CSingle = 0#
Else
CSingle = CSng(strNumber)
End If
End Function
</blockquote></blockquote>

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:
<blockquote><blockquote>
Dim myStudentMarks(10) as Integer
</blockquote></blockquote>
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:
<blockquote><blockquote>
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
</blockquote></blockquote>
<blockquote><blockquote>Chương Sáu - Dùng dữ kiện (Học visual basic 6.0) TotalMark</blockquote></blockquote>
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:
<blockquote><blockquote>
Dim myStudentMarks (1 To 10 ) As Integer
</blockquote></blockquote>
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:
<blockquote><blockquote>
' 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
</blockquote></blockquote>
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.
<blockquote><blockquote>
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
</blockquote></blockquote>
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.
<blockquote><blockquote>Chương Sáu - Dùng dữ kiện (Học visual basic 6.0) TxtClassMark</blockquote></blockquote>
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:
<blockquote><blockquote>
Private myStudentMarks() As Integer
</blockquote></blockquote>
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:
<blockquote><blockquote>
ReDim myStudentMarks(10)
ReDim Preserve myStudentMarks(10)
</blockquote></blockquote>
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 LBoundUBound.
<blockquote><blockquote>
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
</blockquote></blockquote>
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.
<blockquote>
MyArray = HisArray


</blockquote>
</blockquote>

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:
<blockquote><blockquote>
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#
</blockquote></blockquote>
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:
<blockquote><blockquote>
With MyEmployee
.Firstname = "David"
.Surname = "Smith"
.Salary = 25000
.DateOfBirth = #14/6/1963#
End With
</blockquote></blockquote>
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.
Chữ Ký Cá Nhân
Về Đầu Trang Go down
TjaGoChangLj
Administrator
Administrator
TjaGoChangLj

Thanked : 14


Chương Sáu - Dùng dữ kiện (Học visual basic 6.0) _
Bài gửiTiêu đề: Re: Chương Sáu - Dùng dữ kiện (Học visual basic 6.0)   Chương Sáu - Dùng dữ kiện (Học visual basic 6.0) Empty15/6/2011, 10:12 pm

Đuối quá Chương Sáu - Dùng dữ kiện (Học visual basic 6.0) 343189
Chữ Ký Cá Nhân
Về Đầu Trang Go down
 

Chương Sáu - Dùng dữ kiện (Học visual basic 6.0)

Xem chủ đề cũ hơn Xem chủ đề mới hơn Về Đầu Trang 
Trang 1 trong tổng số 1 trang

Permissions in this forum:Bạn không có quyền trả lời bài viết
Vn-Screen Forum :: Công Nghệ Thông Tin :: Khu Lập Trình :: Visual Basic-
VN-SCREEN.DARKBB.COM
Design by N.H.M - Developed by Vn-Screen Member
Free forum | ©phpBB | Free forum support | Báo cáo lạm dụng | Thảo luận mới nhất