1 Khái niệm cơ sở về lập trình• Cơ bản về chương trình hướng sự kiện • Các module mã lệnh trong Visual Basic • Cấu trúc điều khiển 1.1 Cơ bản về chương trình hướng sự kiện Một sự kiện là
Trang 11 Khái niệm cơ sở về lập trình
• Cơ bản về chương trình hướng sự kiện
• Các module mã lệnh trong Visual Basic
• Cấu trúc điều khiển
1.1 Cơ bản về chương trình hướng sự kiện
Một sự kiện là 1 hành động nhận biết được bởi form và control Chươngtrình hướng-sự kiện gọi đoạn mã lệnh Basic để đáp ứng 1 sự kiện Mỗiform và control trong Visual Basic có 1 tập xác định trước các sự kiện Nếumột trong số những sự kiện đó xảy đến và có mã lệnh gắn với thủ tục sựkiện, Visual Basic sẽ gọi đoạn lệnh đó
Mặc dù đối tượng trong Visual Basic tự động nhận ra tập định nghĩa trướccác sự kiện, lập trình viên mới là người quyết định các đối tượng có đápứng hay không và đáp ứng thế nào với 1 sự kiện cụ thể Mỗi sự kiện có 1phần mã lệnh tương ứng với nó dưới dạng 1 thủ tục đáp ứng sự kiện Đểđiều khiển các 1 đối tượng đáp ứng 1 sự kiện, chúng ta cần viết mã lệnhvới thủ tục sự kiện tương ứng
Trình tự hoạt động của 1 chương trình hướng-sự kiện thường như sau:
1. Chương trình khởi động, form được nạp và hiển thị
2. Form hay control trên form nhận được 1 sự kiện tác động Sự kiện đó
có thể gây ra bởi người dùng (nhấn 1 phím), bởi hệ thống (1 sự kiệngây ra bởi bộ định giờ timer), hay trực tiếp bởi mã lệnh của ta
3. Nếu có phần mã lệnh tương ứng với thủ tục sự kiện, nó sẽ được gọi
4. Chương trình chờ cho sự kiện kế tiếp
Chú ý: Nhiều sự kiện xảy ra liên quan tới những sự kiện khác Ví dụ, khi
sự kiện DblClick xảy ra, sự kiện MouseDown, MouseUp, và Click cũng xảyra
Trang 21.2 Các module mã lệnh trong Visual Basic
Mã lệnh trong Visual Basic được lưu trong các module Có 3 loại module:form, standard, và class
Chương trình đơn giản chỉ gồm 1 form và tất cả mã lệnh của chương trìnhnằm trong module form Khi chương trình phức tạp thêm, lớn hơn, sự cónhiều form hơn Sẽ có phần mã lệnh có thể dùng chung giữa các form Đểtránh trùng lặp, chúng có thể được đưa vào module tách riêng các form –gọi là module standard Dần dần, chúng ta có thể sẽ xây dựng 1 thư việncác module chứa các thủ tục dùng chung
Mỗi module standard, class và form có thể chứa:
• Phần khai báo – Declarations: Chứa khai báo Hằng số, kiểu, biến haythư viện kết nối động (dynamic-link library – DLL)
• Phần các thủ tục – Procedures: Chứa thủ tục, hàm số, thủ tục thuộctính có thể được gọi trong mỗi module
Trang 31.2.1 Module Form
Module form (trong các tệp *.FRM) chứa chứa các thủ tục đáp ứng sự kiệntrên form, các thủ tục dùng chung trong form, các khai báo ở mức form về:biến, hằng, kiểu, thủ tục bên ngoài Mã lệnh trong mỗi form được dùngriêng trong form đó và đôi khi mã lệnh trong 1 form có thể tham chiếu tớicác form khác
1.2.2 Module Standard
Module standard (trong các tệp *.BAS) chứa thủ tục và khai báo truy nhậpđược bởi các module khác trong chương trình, hay thậm chí bởi cácchương trình khác nhau
1.2.3 Module Class
Modules class (trong các tệp *.CLS) là cơ sở lập trình hướng đối tượngtrong Visual Basic Chúng ta viết mã lệnh trong module class để tạo nhữngđối tượng mới với những thuộc tính và phương thức riêng Thực ra, formchính là các module class, nơi có thể đặt các control và hiển thị các cửa sổform
Chú ý: ActiveX Documents, ActiveX Designers, và User Controls: là
những loại module mở rộng (với tên tệp có phần mở rộng khác) Có thểxem những module đó tương tự như module form
Trang 41.3 Sử dụng Code Editor
Code Editor của Visual Basic là một cửa sổ nơi ta viết phần lớn mã chươngtrình Nó giống một trình soạn thảo được chuyên hoá cao với nhiều tínhnăng tạo thuận lợi cho việc viết mã Visual Basic
Một cửa sổ riêng được mở cho mỗi module ta chọn từ Project Explorer Mãnằm trong mỗi module được chia thành các phần riêng cho từng đối tượngtrong module
Mỗi module form gồm:
- Phần general: chứa phần khai báo và các thủ tục dùng chung
- Phần thủ tục sự kiện cho từng đối tượng
Để truy nhập tới phần mã lệnh cần viết, nên sử dụng hộp combo box trái rồihộp combo box phải
Visual Basic có chức năng Auto Code Completion giúp viết mã lệnh trongCode Editor được dễ dàng
Trang 5Để chọn phần từ nào đó, chuyển thanh sáng tới đó, rồi nhấn TAB.
Ngoài ra, chức năng Bookmarks giúp đánh dấu 1 vị trí mã lệnh để có thểquay lại được nhanh chóng (Edit | Bookmarks)
Trang 61.4 Qui ước viết lệnh trong Visual Basic
1.4.1 Chia 1 lệnh thành nhiều dòng
Bằng cách sử dụng ký tự: [ _ ]
dtaTilesOfPublishers.RecordSource = _
"SELECT * FROM Titles, Publishers" _
& "WHERE Publishers.PubId = Titles.PubID" _
& "AND Publishers.State = 'CA'"
Trong một số trường hợp cách chia 1 câu lệnh này không thực hiện được:nối các dòng chú giải,
1.4.2 Nối nhiều lệnh vào 1 dòng
Trang 71.4.4 Hệ thống số
Cơ số 10
(Decimal)
Cơ số 8 (Octal)
Cơ số 16 (Hexadecimal )
Trang 81.4.5 Qui tắc đặt tên
Tên thủ tục, hàm, biến, hằng phải tuân theo qui tắc:
kí tự rỗng), ký tự khai báo kiểu
forms, class, và module không vượt quá 40
kí tự.
Trang 91.5 Biến số
Biến số là nơi lưu trữ tạm thời giá trị Biến thường được định nghĩa bởingười sử dụng Chúng ta có thể xem các thuộc tính của 1 đối tượng nhưbiến
ApplesSold = 10
ApplesSold = ApplesSold + 1
txtSales.txt = ApplePrice * ApplesSold
1.5.1 Khai báo biến
Dim variablename [As type]
Biến khai báo với Dim trong 1 thủ tục tồn tại khi thủ tục đó được chạy; Khithủ tục kết thúc, giá trị của biến đó được giải phóng; Tức biến này có phạm
vi địa phương (local) trong thủ tục mà nó được khai báo
Phạm vi cơ bản của biến:
• Biến khai báo trong phần Declarations của 1 module form, standard, hay class,chứ không phải bên trong 1 thủ tụccó thể được sử dụng bởi mọi thủtục trong module
• Biến khai báo với từ khoá Public sử dụng được trong toànchương trình
• Biến khai báo với từ khoá Static vẫn lưu tiếp giá trị của nó ngay cảkhi thủ tục chứa khai báo của nó đã kết thúc
Chú ý: Trong 1 phạm vi, không được có 2 biến khai báo trùng tên
1.5.2 Khai báo không tường minh
Trong Visual Basic, biến có thể không khai báo trước khi sử dụng:
1.5.3 Khai báo tường minh
Nên luôn khai báo biến trước khi sử dụng
Trang 10Để yêu cầu Visual Basic luôn kiểm tra biến phải được khai báo trước khi sửdụng:
- Đặt câu lệnh sau vào phần Declarations của 1 module class, form, hay standard:
Trang 111 module có phạm vi trong toàn module.
1 module với từ khoá Public có phạm vi
trong toàn chương trình.
Trang 121.7 Kiểu dữ liệu
1.7.1 Khai báo biến với kiểu dữ liệu
Biến thường được khai báo trước với kiểu dữ liệu định sẵnVí dụ:
Private I As Integer
Dim Amt As Double
Static YourName As String
Public BillsPaid As Currency
Private I As Integer, Amt As Double
Nếu kiểu biến không nêu rõ, biến sẽ có kiểu là Variant
Trang 131.7.4 Kiểu dữ liệu chuỗi
Dim EmpName As String * 50
Nếu biến EmpName được gán bằng 1 chuỗi ít hơn 50 kí tự, nó sẽ đượcchèn vào các kí tự trắng cho đủ 50 Còn nếu biến EmpName được gánbằng 1 chuỗi nhiều hơn 50 kí tự, Visual Basic sẽ cắt ngắn lại
Do chuỗi có độ dài cố định có thể được chèn thêm các kí tự trắng, chúng ta
có thể cần tới các hàm Trim, RTrim để loại bỏ các kí tự trắng
Chuỗi có độ dài cố định có thể được khai báo Public hay Private trong module standard. Trong
module form hay module class, chuỗi có độ dài
cố định chỉ có thể được khai báo Private
1.7.5 Trao đổi giữa chuỗi và số
Visual Basic có thể tự động chuyển đổi dữ liệu giữa kiểu số và chuỗi
Trang 14Ví dụ:
Private Sub Command1_Click()
Dim intX As Integer
Dim strY As String
strY = "100.23"
intX = strY ' Passes the string to a numeric
' variable.
lstNum.AddItem Cos(strY) ' Adds cosine of number in
' the string to the listbox.
strY = Cos(strY) ' Passes cosine to the
' string variable.
txtStr.Text = strY ' String variable prints in
' the text box.
End Sub
Tuy nhiên, chúng ta phải luôn cẩn thận, bởi khi trao đổi giữa chuỗi và số, lỗi
có thể nảy sinh khi chuỗi số chứa giá trị không ở khuôn dạng số
1.7.6 Kiểu dữ liệu logic
Boolean True/False
1.7.7 Kiểu dữ liệu thời gian
Giá trị về ngày tháng, hay thời gian có thể được lưu trữ trong kiểu dữ liệu
Date hay trong Variant
Trang 151.7.8 Kiểu dữ liệu đối tượng
Biến đối tượng được lưu trữ thành địa chỉ 32-bit Địa chỉ này tham trỏ tớiđối tượng trong chương trình, hay tới đối tượng trong chương trình khác
Dim objDb As Object
Set objDb = OpenDatabase("c:\Vb5\Biblio.mdb")
1.7.9 Kiểu dữ liệu Variant
Biến kiểu Variant có thể lưu trữ dữ liệu có kiểu bất kỳ Chúng ta không phảichuyển đổi giữa các kiểu dữ liệu nếu chúng ta gán chúng cho 1 biến kiểuVariant
1.7.10Kiểu dữ liệu do người dùng tự định nghĩa
Chúng ta có thể định nghĩa những kiểu dữ liệu mới, tương tự như kháiniệm Record trong Pascal
Trang 161.8 Mảng
Trong Visual Basic, có 2 kiểu mảng: mảng tĩnh với kích thước cố định vàmảng động với kích thước có thể thay đổi khi chạy
1.8.1 Khai báo mảng tĩnh
Dim Counters(14) As Integer
Public Sums(20) As Double
Khi đó, mảng Counters có 15 phần tử với chỉ số từ 0 tới 15, mảng Sums có
21 phần từ 0 tới 20
Để chỉ rõ phạm vi chỉ số, có thể khai báo:
Dim Counters(1 To 15) As Integer
Dim Sums(100 To 120) As String
1.8.2 Mảng chứa các mảng
Có thể tạo mảng các Variant, và sau đó gán giá trị cho nó với mảng củacác kiểu dữ liệu khác Ví dụ tạo 2 mảng, một chứa các số nguyên và mộtchứa các chuỗi Sau đó khai báo mảng thứ 3 chứa các Variant và gán giátrị với nó từ mảng số nguyên và mảng chuỗi
Private Sub Command1_Click()
Dim intX As Integer ' Declare counter variable.
' Declare and populate an integer array.
Dim countersA(5) As Integer
For intX = 0 To 4
countersA(intX) = 5
Next intX
' Declare and populate a string array.
Dim countersB(5) As String
Với Visual Basic, chúng ta có thể khai báo các mảng nhiều chiều:
Static MatrixA(9, 9) As Double
Dim MultiD(3, 1 To 10, 1 To 15)
Trang 171.9 Hàm và thủ tục
Phân chia chương trình thành hàm và thủ tục có 2 lợi ích chính:
• Chia chương trình thành các khối logic tách rời, mỗi khối dễ dàngđược viết và gỗi lỗi hơn nếu viết cả chương trình lớn
• Một hàm/thủ tục có thể được sử dụng nhiều lần
Trong Visual Basic có một số kiểu hàm/thủ tục sau:
• Thủ tục không trả về giá trị: thủ tục chung và thủ tục sự kiện
Trang 181.9.2 Tạo 1 hàm/thủ tục chung:
• Gõ vào phần đầu hàm/thủ tục vào cửa sổ Code, với dạng sau
Sub UpdateForm () Function GetCoord ()
• Visual Basic sẽ hoàn tất thủ tục theo khuôn mẫu
1.9.3 Gọi 1 thủ tục
Có 2 cách như sau:
' Both of these statements call a Sub named MyProc.
Call MyProc (FirstArgument, SecondArgument)
MyProc FirstArgument, SecondArgument
- trong module class
Dim DemoClass as New Class1 DemoClass.SomeSub
- trong module standard
Module2.CommonName(arguments)
1.9.6 Truyền tham số cho hàm/thủ tục:
Function WhatsForLunch(WeekDay As String, Hour _
As Integer) As String
' Returns a lunch menu based on the day and time.
If WeekDay = "Friday" then
Trang 191.10 Cấu trúc điều khiển
[Case Else
[statementblock-n]]
End Select
Ví dụ:
Private Sub mnuCut_Click (Index As Integer)
Select Case Index
Case 0 ' Cut command.
CopyActiveControl ' Call general procedures.
Trang 21Function CountStrings (longstring, target)
Dim position, count
position = 1
Do While InStr(position, longstring, target)
position = InStr(position, longstring, target)_
Trang 22For i = 0 To frmVCR.Controls.Count - 1
If TypeOf frmVCR.Controls(i) Is Shape Then
If frmVCR.Controls(i).Name = MyControl Then
For Each element In group
statements
Next element
Ví dụ:
Sub ListTableDefs()
Dim objDb As Database
Dim MyTableDef as TableDef
Set objDb = OpenDatabase("c:\vb\biblio.mdb", _
Chú ý rằng khi sử dụng For Each Next:
• Với collection, phần tử (element) chỉ có thể là: biến Variant, biến
Object, hay 1 object được liệt kê trong Object Browser
• Với mảng, phần tử (element) chỉ có thể là biến Variant.
• Không được sử dụng For Each Next với mảng các phần tử có kiểu
dữ liệu do người dùng tự định nghĩa bởi 1 biến Variant không thểchữa dữ liệu có kiểu này
Trang 231.10.3Làm việc với cấu trúc điều khiển
Các cấu trúc lồng nhau
Ví dụ:
Private Sub Form_Click()
Dim SFont, PFont
For Each SFont In Screen.Fonts()
For Each PFont In Printer.Fonts()
If SFont = PFont Then
Thoát khỏi 1 cấu trúc điều khiển lặp
Bằng cách sử dụng câu lệnh Exit: Exit For giúp thoát khỏi vòng lặp ForNext, và Exit Do giúp thoát khỏi vòng lặp Do While
For counter = start To end [Step increment]
[statementblock]
[Exit For]
[statementblock]
Next [counter[, counter] [, ]]
Do [{While | Until} condition]
Private Sub Form_Click()
Dim SFont, PFont
For Each SFont In Screen.Fonts()
For Each PFont In Printer.Fonts()
If SFont = PFont Then
Private Sub Form_Click()
Dim SFont, PFont
For Each SFont In Screen.Fonts()
For Each PFont In Printer.Fonts()
If SFont = PFont Then
Print Sfont
Exit Sub ' Exit the procedure.
End If
Trang 24Next PFont Next SFont End Sub