CHƯƠNG I Công cụ lập trình
I.2. Ngôn ngữ Visual Basic
I.2.1. Kiểu, biến & biểu thức
I.2.1.1. Biến
VB không bắt buộc bạn phải khai báo biến, tuy nhiên một lời khuyên là bạn hãy đặt chế độ
bắt buộc khai báo bi ến. Để thiết lập chế độ này, bạn vào menu Tools | Options, trên tab Editor, đánh dấu vào “Require Variable Declaration ”. Sau đó, bất kỳ một Form hay
Module nào được tạo mới đều có khai báo sau đây ở đầu tiên. Option Explicit
Với khai báo này, tất cả các biến trước khi sử dụng đều phải có khai báo với cú pháp sau. Dim <Tên biến> As <Kiểu biến>
Ví dụ
Dim i As Integer ' Biến kiểu số nguyên
Dim s As String ' Biến kiểu xâu ký tự Dim a As Double ' Biến kiểu số thực kép
Dim c, d, e As Double ' Khai báo thế này là sai, chỉ có e là Double ' Còn c, d là kiểu Variant (biến tùy ý)
Dim c As Double, d As Double, e As Double
' Khai báo thế này mới đúng
Quy ước đặt tên biến
- Bắt đầu bằng chữ cái, không bắt đầu bằng chữ số.
- Tên biến có thể chứa chữ cái, chữ số, ký tự “_”, nhưng không chứa các ký t ự đặc
biệt.
- Độ dài tối đa của tên biến là 255 ký tự.
I.2.1.2. Kiểu biến
Biến được sử dụng để lưu các giá trị, giá trị có thể là số (số thứ tự, số người...), có thể là
dạng văn bản (xâu ký tự). Ngồi ra biến có thể ở dạng phức tạp, ví dụ mảng: chuỗi các giá
Khi bạn đã biết lập trình trên một ngôn ngữ, việc hiểu kiểu biến của một ngôn ngữ khác là
tương đối đơn giản. Các kiểu biến trong VB được chia thành các loại sau
Biến kiểu số
Kiểu Mô tả Khoảng giá trị Ví dụ
Byte Số nguyên ngắn 0..255
Integer Số nguyên -32768.. 32767
Long Số nguyên dài -2147483648.. 2147483647
Single Số thực độ chính xác đơn
Double Số thực độ chính xác kép
' Thay gì viết
Dim Result As Long
Result = 30345 * 100 ' sẽ bị overflow error
' Hãy viết như sau:
Dim Result As Long Result = 30345
Result = Result * 100 ' không bị overflow error
Biến kiểu xâu ký tự
Mỗi ký tự trong máy tính tương ứng với một số hiệu (mã ASCII). Một chuỗi các ký tự ghép
với nhau tạo ra một xâu ký tự (String). String trong VB được ký hiện trong cặp ngoặc kép,
ví dụ:
Dim FirstWord As String
Dim SecondWord As String * 20 ' Xâu ký tự có độ dài tối đa 20 ký tự Dim Greeting As String
FirstWord = "Hello" SecondWord = "World"
Greeting = FirstWord & SecondWord ' Greeting bây giờ là "HelloWorld" Greeting = FirstWord & " " & SecondWord
Biến kiểu logic
Kiểu logic là kiểu biến cơ bản, có mặt trong hầu hết các ngôn ngữ. Biến logic (Boolean) chỉ
mang hai giá trị là True (đúng) và False (sai).
Biến kiểu Boolean thường được sử dụng với các toán tử logic (And, Or, Xor, Not). Các biểu thức điều kiện trả về giá trị kiểu Boolean.
Mảng là kiểu dữ liệu phức gồm nhiều giá trị cùng kiểu sắp xếp liên tiếp nhau. Các phần
tử này được truy xuất qua chỉ số. Mảng trong VB gồm mảng tĩnh và mảng động, mảng
tĩnh là mảng được xác định kích thước ngay từ khi dịch chương trình, mảng động có kích
thước chưa xác định và chỉ được cấp phát khi run-time.
Tốc độ truy xuất dữ liệu của mảng tĩnh và mảng động của VB là như nhau Dim N(3) As Long ' Không nên khai báo kiểu này, gây mập mờ
Dim M(1 To 3) As Long ' Khai báo với cả chỉ số đầu và cuối cho tường minh
Dim Q() As Long Dim i As Integer M(1) = 1 M(2) = 2 M(3) = 3 ReDim Q(1 To 100)
For i = LBound(Q) To UBound(Q) Q(i) = i
Next
Ki ểu do người dùng định nghĩa
Ngoài các kiểu dữ liệu chuẩn của VB, người dùng cịn có th ể tự định nghĩa kiểu biến của
riêng mình (giống với kiểu bản ghi – Record của Pascal). Private Type TDam
dai As Double ' cm rong As Double ' cm cao As Double ' cm ten As String * 4
End Type
Private Sub Form_Load()
Dim dam As TDam ' Biến [dam] thuộc kiểu TDam do người dùng đnghĩa dam.dai = 500 ' Truy xuất các trường bằng dấu chấm sau tên biến dam.rong = 22
dam.cao = 40 dam.ten = "D1"
With dam ' Truy xuất nhanh các trường bằng câu lệnh With MsgBox .ten & " " & .rong & "x" & .cao & "x" & .dai
End With ' Các trường trong With truy xuất không cần tên biến
End Sub
Các bạn lưu ý phân biệt kiểu và biến (rất nhiều người nhầm lẫn 2 khái niệm này với nhau). Trong ví dụ nêu trên TDam là kiểu (giống như kiểu Integer, kiểu String) chứ không phải là
một biến để gán giá trị.
Trong Sub Form_Load, dam là một biết kiểu TDam. Theo khai báo đã có, biến dam sẽ có các trường (fields) là dai, rong, cao, ten. Để truy nhập các trường của biến dam, sử dụng
Kiểu liệt kê (Enum)
Kiểu liệt kê là kiểu do người dùng định nghĩa, biến thuộc kiểu này có giá tr ị là một trong
các giá trị được liệt kê trong ki ểu. Sử dụng kiểu liệt kê vừa đơn giản vừa có tốc độ cao
(nhanh hơn rất nhiều so với thói quen sử dụng String để phân biệt các trường hợp). Để nắm
rõ cách sử dụng kiểu Enum, hãy quan sát hình minh họa bên dưới.
Kiểu Variant
Kiểu Variant là một kiểu dữ liệu khác lạ đối với những người mới chuyển từ Pascal sang
VB. Kiểu Variant chấp nhận mọi giá trị có thể: số nguyên, số thực, xâu ký tự, mảng, kiểu dữ liệu người dùng định nghĩa...
Sử dụng Variant cho phép người lập chình uyển chuyển, mềm dẻo hơn trong q trình lập
trình. Tuy nhiên, Variant có nh ược điểm là rất chậm, do đó bạn nên hạn chế dùng trong
trường hợp sử dụng tính tốn nhiều (nhất là đối với các ứng dụng tính tốn k ết cấu trong
ngành Tin học Xây dựng)
Kiểu Collection
Sử dụng mảng với chỉ số tuần tự cho tốc độ làm việc nhanh nhưng không thật sự mềm dẻo. Nếu chúng ta muốn truy cập một phần tử theo tên thành viên thì vi ệc sử dụng cấu trúc dữ
liệu kiểu mảng là không hiệu quả do thời gian tìm kiếm lâu.
Trong SAP2000, tên phần tử được đặt tùy ý (số hoặc chữ), nếu là số thì thường khơng theo
thứ tự hoặc khơng liên tiếp. Do đó sử dụng mảng để lưu các phần tử đọc được từ file kết quả của SAP là không khả thi.
VB hỗ trợ kiểu dữ liệu tập hợp (Collection) cho phép truy cập phần tử theo tên (cấu trúc dữ liệu này được tối ưu hóa nên tốc độ tìm kiếm rất nhanh).
Dim Ten As New Collection ' Tạo mới một Collection
Ten.Add "Cong nghe Thong tin" ' Thêm 1 phần tử vào Collection Ten.Add "Tin hoc Xay dung"
Ten.Add "Cong nghe phan mem" Ten.Add "Ky thuat He thong"
MsgBox Ten(1) ' Sử dụng tập hợp như mảng MsgBox Ten(3) ' Truy cập theo chỉ số
Dim TuDien As New Collection
TuDien.Add "Cong nghe Thong tin", "CNTT" ' Thêm 1 phần tử gồm giá trị, tên TuDien.Add "Tin hoc Xay dung", "THXD" ' Tên phần tử phải là duy nhất TuDien.Add "Cong nghe phan mem", "CNPM"
TuDien.Add "Ky thuat He thong", "KTHT"
MsgBox TuDien("CNTT") ' Truy cập phần tử theo tên MsgBox TuDien("CNPM")
Quy ước đặt tên biến theo kiểu
Bảng dưới đây liệt kê các kiểu biến thường sử dụng, để việc lập trình được thuận tiện, người ta thường đặt kiểu biến là tiếp đầu ngữ - prefix (với 3 ký tự). Việc đặt tên biến như vậy sẽ
giúp cho người lập trình khơng bị nhầm lẫn về kiểu biến, tránh được những sai sót đáng tiếc về sau.
Tiếp đầu ngữ Kiểu Ví dụ
bln Boolean blnButtonEnabled
byt Byte bytLength
cur Currency curSales98
dte Date dteOverdue
dbl Double dblScientificAmt
int Integer intYear1998
lng Long lngWeatherDistance
obj Object objWorksheetAcct99
sng Single sngSales1stQte
str String strFirstName
vnt Variant vntValue
I.2.1.3. Tốn tử
Tốn tử Giải thích Ví dụ Kết quả
^ Mũ 2 ^ 3 8
* Nhân 2 * 3 6
/ Chia 6 / 2 3
+ Cộng 2 + 3 5
- Trừ 6 – 3 3
\ chia nguyên 11 \ 3 3
& Nối xâu "Hi, " & "There" "Hi, There"
I.2.1.4. Biểu thức
Biểu thức là sự kết hợp của các giá trị, biến, toán tử với nhau. Biểu thức biểu diễn trên máy
tính có dạng gần giống với biểu thức toán học mà chúng ta th ường sử dụng: Các tốn tử
khơng được thực hiện theo thứ tự từ trái sang phải mà có sự ưu tiên giữa các toán tử, bảng
sau đây liệt kê thứ tự ưu tiên (từ cao đến thấp) của các toán tử trong cùng một biểu thức.
Thứ tự Tốn tử Ví dụ Kết quả 1 Ngoặc () (2 + 3) * 7 35 2 ^ 2 ^ 3 + 1 9 3 *, /, \, Mod 2 + 3 * 7 23 4 +, - 10 – 4 * 2 + 1 3 I.2.1.5. Phép gán
Phép gán làm nhiệm vụ đưa một giá trị mới vào trong biến, giá trị này được tính từ các giá
trị đã có bằng các biểu thức. Cú pháp của phép gán như sau <Tên biến> = <Biểu thức>
Chú ý, vế trái của phép gán bao giờ cũng là biến, vế phải là biểu thức. Vế trái của phép gán
không được là hằng số, biểu thức. Các ví dụ áp dụng.
Dim n As Integer n = 10
n = 2*n*(n+1) ' n = 2*10*11 = 220 n = n+1 ' n = 221
Dim s1 As String, s2 As String s1 = "Hello,"
s2 = "There"
s1 = s1 & " " & There ' s1 = "Hello, There"
I.2.1.6. Toán tử điều kiện
Các toán tử điều kiện dùng để so sánh các giá trị (biểu thức) với nhau, giá trị trả về là kiểu
Boolean (True – đúng hoặc False – sai)
Tốn tử Mơ tả Ví dụ Kết quả
= Bằng 7 = 2 False
> Lớn hơn 6 > 3 True
>= Lớn hơn hay bằng 23 >= 23 True
<= Nhỏ hơn hay bằng 4 <= 21 True
<> Khác 3 <> 3 False
I.2.1.7. Toán tử logic
Các điều kiện logic có thể được kết hợp với nhau bằng các toán tử logic
Toán tử Mơ tả Ví dụ Kết quả
And Cả hai toán hạng cùng đúng (2 < 3) And (4 < 5) True
Or Ít nhất một trong hai toán hạng đúng (2 > 3 ) Or (6 < 7) True
Xor Một toán hạng đúng, 1 toán hạng sai (2 < 3) Xor (7 > 4) False
Not Đảo Not (3 = 3) False
I.2.2. Các cấu trúc điều khiển
Chương trình muốn hoạt động theo sự điều khiển khơng chỉ có các lệnh gán mà còn ph ải
gồm các lệnh điều khiển (rẽ nhánh, lặp...). Các lệnh này cho phép chương trình hoạt động
theo một kịch bản xác định.
I.2.2.1. Cấu trúc If...Then... End If
If <Điều kiện> Then <Các lệnh> End If
Kiểm tra điều kiện (biểu thức logic)
- Nếu điều kiện là đúng (True) thì thực hiện các lệnh nằm trong cấu trúc (giữa If và
End If)
- Nếu điều kiện sai (False) thì bỏ qua, khơng thực hiện các lệnh này
I.2.2.2. Cấu trúc If...Then... Else... End If
If <Điều kiện> Then
<Các lệnh nếu điều kiện đúng> Else
<Các lệnh nếu điều kiện sai> End If
Kiểm tra điều kiện
- Nếu điều kiện đúng, thực hiện nhánh đúng (Giữa If và Else) - Nếu điều kiện sai, thực hiện nhánh sai (Giữa Else và End If)
I.2.2.3. Select Case
Select Case <Biểu thức> Case <Giá trị 1> <Các lệnh 1> Case <Giá trị 2> <Các lệnh 2>
Case <Giá trị 3>, <Giá trị 4>: <Các lệnh 3, 4>
Case Else
<Các lệnh còn lại> End Select
Kiểm tra giá trị của một <Biểu thức>, tùy theo giá trị của biểu thức là gì thì thực hiện các
lện tương ứng. Khác với lệnh If chỉ có tối đa 2 nhánh, lệnh Select Case có th ể chia nhiều
nhánh, rất thích hợp cho các lệnh điều kiện phức tạp.
' Kiểm tra kết quả của câu trắc nghiệm
Select Case txtGrade.Text Case "A"
lblAnnounce.Caption = "Perfect!” Case "B"
lblAnnounce.Caption = "Great!" Case "C"
lblAnnounce.Caption = "Study harder!" Case "D"
lblAnnounce.Caption = "Get help!" Case "F"
lblAnnounce.Caption = "Back to basics!" Case Else
lblAnnounce.Caption = "Error in grade" End Select
I.2.2.4. Vòng lặp Do While... Loop
Do While <Điều kiện> <Các lệnh>
Loop
Nếu điều kiện cịn đúng thì thực hiện tiếp các lệnh giữa Do... Loop. Đây là vòng lặp kiểm
tra điều kiện trước, có nghĩa là nếu <Điều kiện> sai ngay từ đầu thì <Các lệnh> sẽ khơng được thực hiện 1 lần nào.
intCtr = 0
Do While intCtr <= 10 lblOut.Caption = intCtr intCtr = intCtr + 1 Loop
I.2.2.5. Vòng lặp Do... Loop While
<Các lệnh>
Loop While <Điều kiện>
Thực hiện các lệnh giữa Do... Loop cho đến khi điều kiện sai. Đây là vịng lặp kiểm tra điều kiện sau, có nghĩa là <Các lệnh> sẽ được thực hiện ít nhất một lần (kể cả khi <Điều kiện>
sai ngay từ đầu)
I.2.2.6. Vòng lặp For... Next
For <biến Đếm> = <bắt Đầu> To <kết Thúc> [Step <khoảng Tăng>] <Các lệnh>
Next [biến Đếm]
- Lặp với <biến Đếm> bắt đầu từ giá trị <bắt Đầu>, mỗi lần tăng một lượng <khoảng
Tăng> cho đến bằng giá trị <kết Thúc>. Mỗi lần lặp thực hiện các lệnh giữa For...
Next
- Nếu không khai báo Step <khoảng Tăng>, giá trị tăng mặc định là 1
- Muốn lặp với <biến Đếm> giảm dần, đặt <khoảng Tăng> là giá trị âm (ví dụ -1) For intCtr = 1 To 10
lblOut.Caption = intCtr Next
For intCtr = 10 To 1 Step -1 lblOut.Caption = intCtr Next
I.2.2.7. Vòng lặp For Each... Next
For Each <phần tử> In <nhóm> <các lệnh>
Next
Biến <phần tử> (phải là kiểu Variant) lặp qua tất cả các phần tử con của <nhóm> (thường
là kiểu tập hợp – Collection), mỗi lần lặp thực hiện <các lệnh>. Đây là lệnh rất thuận tiện để làm việc với nhóm các phần tử (ví dụ nhóm các control của form). Đoạn chương trình ví dụ
dưới dây minh họa vòng lặp For Each với một tập hợp các xâu ký tự. Dim s As Variant
Dim Ten As New Collection Ten.Add "CNTT"
Ten.Add "THXD" Ten.Add "CNPM" Ten.Add "KTHT" For Each s In Ten MsgBox s Next
I.2.3. Chương trình con
Cũng như tất cả các ngơn ngữ lập trình khác, khi có nhi ều công việc được thực hiện lặp đi
lặp lại bởi cùng một đoạn code, cách tốt nhất là đưa đoạn code này vào một chương trình
con để có thể sử dụng lại nhiều lần. Chương trình con có thể là Sub – giống procedure hoặc Function – giống function trong Pascal.
I.2.3.1. Sub
Public | Private Sub <Tên sub> (danh sách tham số) <các lệnh>
End Sub Ví dụ
Private Sub TangGiaTri(a As Integer, b As Integer) a = a+b
End Sub
Trong đoạn chương trình ví dụ trên: - <Tên sub> là "TangGiaTri"
- Các tham số là a (kiểu Integer), b (kiểu Integer) - Thủ tục thực hiện nhiệm vụ tăng biến a lên 1 lượng b
I.2.3.2. Function
Public | Private Function <Tên function> (danh sách tham số) As <Kiểu function> <các lệnh>
<Tên function> = <giá trị trả về> <các lệnh>
End Function Ví dụ
Private Function Tong(a As Integer, b As Integer) As Integer Tong = a + b
End Function
Trong đoạn chương trình ví dụ trên: - <Tên function> là "Tong" - <Kiểu function> là Integer
- Các tham số là a (kiểu Integer), b (kiểu Integer) - Hàm trả về tổng của 2 số a và b
I.2.3.3. Tham biến & tham trị
Private Sub TangGiaTri(a As Integer, b As Integer) a = a+b
End Sub
Private Sub Command1_Click() Dim c As Integer
c = 10
TangGiaTri(c, 10) MsgBox c
End Sub
Kết quả của hộp thoại MsgBox là 20, có ngh ĩa là biến c đã được tăng lên 10 đơn vị. Vẫn đoạn chương trình này, b ạn bổ sung thêm t ừ khóa ByVal vào trước tham số a trong Sub
TangGiaTri để được đoạn chương trình sau. Ví dụ 2:
Private Sub TangGiaTri(ByVal a As Integer, b As Integer) a = a+b
End Sub
Private Sub Command1_Click() Dim c As Integer
c = 10
TangGiaTri(c, 10) MsgBox c
End Sub
Chạy đoạn chương trình này, hộp thoại MsgBox trả về giá trị 10. Tại sao vậy? Nguyên nhân
vì trong tr ường hợp này bi ến a trong Sub TangGiaTri không ph ải là bi ến c trong Sub
Command1_Click. a chỉ là bản sao của c (do được truyền giá trị - by value), khi đó ta gọi a là tham trị.
Trong trường hợp của ví dụ 1, khai báo đầy đủ là
Private Sub TangGiaTri(ByRef a As Integer, ByRef b As Integer)
Khi đó, biến a trong Sub TangGiaTri chính là bi ến c trong Sub Command1_Click, tăng giá
trị của a chính là tăng giá trị của c. a gọi là tham chiếu (reference) của c. Trường hợp này ta gọi a là tham biến.
Chú ý: Nếu khơng khai báo gì, VB mặc định là ByRef (quy ước này ngược với Pascal – mặc
định là tham trị)
I.2.4. Form
Windows là hệ điều hành cửa sổ, tất cả các giao ti ếp của người sử dụng với các chương
trình chủ yếu thơng qua cửa sổ. Cửa sổ chứa các control gọi là Form, trong VB có nhiều loại Form, tất cả đều có những thuộc tính chung.
I.2.4.1. Các thuộc tính của Form