' Ham IsMissing kiem tra xem tham so nay co hay khong If IsMissinggiay Then giay = "" Dim hientai hientai = Now gio = Format$hientai, "hh" phut = Format$hientai, "nn" giay = Format
Trang 1' Ham IsMissing kiem tra xem tham so nay co hay khong
If IsMissing(giay) Then giay = ""
Dim hientai
hientai = Now
gio = Format$(hientai, "hh")
phut = Format$(hientai, "nn")
giay = Format$(hientai, "ss")
End Sub
Bước 4: Thêm thủ tục xử lý sự kiện cho Button cmdGiophutgiay, trong thủ tục này
chèn đoạn mã sau:
Private Sub cmdGiophutgiay_Click()
Dim gioht As String
Dim phutht As String
Dim giayht As String
Call Laythoigian(gioht, phutht, giayht)
lblTg.Caption = gioht & ":" & phutht & ":" & giayht
End Sub
Bước 5: Thêm thủ tục xử lý sự kiên cho Button cmdGiophut, trong thủ tục này chèn
đoạn mã sau:
Private Sub cmdGiophut_Click() Dim gioht As String
Dim phutht As String
' Khong su dung tham so thu ba
Call Laythoigian(gioht, phutht)
lblTg.Caption = gioht & ":" & phutht
End Sub
Bước 6: Lưu dự án lại và chạy chương trình Kiểm tra kết quả
Bài tập 1II-6 PARAM ARRAY
Bước 1: Tạo thư mục Basic\Bt1II-6 Tạo dự án mới trong thư mục này
Bước 2: Tạo Form như hình sau:
Hình I.14: Param Array
Trang 2Trong đó:
Button: Name: cmdds; Caption: Them vao danh sach
Bước 3: Chèn modul mới vào dự án tên Modul1 Sau đó, chọn Tool\Add Procedure để
chèn thủ tục sau:
Bước 3: Chèn đoạn mã sau vào thủ tục Diends
Public Sub Diends(ParamArray Ten() As Variant)
' Su dung ParamArray thi mang phai kieu Variant va
' mang nay la tham so cuoi cung cua thu tuc
Dim hten As Variant
For Each hten In Ten()
Form1.lstTen.AddItem hten
End Sub
Bước 4: ParamArray cho phép không cần xác định số lượng các đối số trong một
chương trình con Bây giờ, thêm hàm xử lý sự kiện cho nút cmdds: cmdds_Click: Private Sub cmdds_Click()
Call Diends("Huynh Xuan Hiep", "Nguyen Van Linh", "Lam Hoai Bao")
Call Diends
Call Diends("Phan Huy Cuong")
End Sub
Bước 5: Lưu dự án lại và chạy chương trình Kiểm tra kết quả (hình bên dưới) Lưu ý
đến lời gọi thủ tục trong sự kiện cmdds_Click (số lượng đối số khác nhau)
Hình I.15: Kết quả Param
Array
Trang 3Bài tập 1II-7
XỬ LÝ CHUỖI Bước 1: Tạo dự án mới trong thư mục Basic\Bt2-7 với giao diện như sau:
5
4
3
2
1
Hình I.16: Xử lý chuỗi
1: Form: Name: frmMain; MinButton: False; MaxButton: False; Font: VNI-Times 2: Label: Name: lblTen
3: TextBox: Name: txtTen
4: CommandButton: Name: cmdTen; Caption: Tách tên
5: CommandButton: Name: cmdCKT; Caption: Cắt khoảng trắng
Bước 2: Tạo một hàm cắt khoảng trắng như sau:
Private Function ATrim(ByVal Name As String) As String
Name = LTrim(RTrim(Name))
Do While InStr(Name, "99") <> 0
Name = Replace(Name, "99", "9")
Loop
ATrim = Name
End Function
Bước 3: Trong cửa sổ thiết kế Form; nhấp đúp vào Tách tên, ta xử lý đoạn mã cho sự
kiện này:
Private Sub cmdTen_Click()
Dim sName As String, Name As String
sName = ATrim(StrConv(txtTen.Text, vbProperCase))
Dim i As Long
i = InStrRev(sName, "9")
Name = Right(sName, Len(sName) - i)
MsgBox Name & ": " & Str(Len(Name))
End Sub
Bước 4: Sau đó, trở lại cửa sổ thiết kế, nhấp đúp vào Cắt khoảng trắng, ta xử lý:
Private Sub cmdCKT_Click()
Dim sName As String
sName = ATrim(StrConv(txtTen.Text, vbProperCase))
Trang 4MsgBox sName, , "Kieu du lieu chuoi"
End Sub
Bước 5: Lưu dự án và chạy chương trình.
Bài tập 1II-8
XỬ LÝ LỖI
Bước 1: Tạo một dự án mới Dùng Tools\Add Procedure thêm một thủ tục mới tên
GoiThuTuc vào Form1 với nội dung như sau:
Public Sub GoiThuTuc()
Dim bien As Integer
MsgBox "Truoc khi gan tri cho bien"
bien = "Bien nguyen khong nhan gia tri la chuoi"
MsgBox "Sau khi gan tri cho bien: " & "Bien = " & Format(bien)
End Sub
Bước 2: Thủ tục xử lý sự kiện Form_Load có nội dung như sau:
Private Sub Form_Load()
MsgBox "Truoc khi goi thu tuc"
Call GoiThuTuc
MsgBox "Sau khi goi thu tuc"
End Sub
Lưu dự án vào thư mục Basic\Bt1II-8:
Form: tên là form1
Project: Debug
Bước 3: Chạy chương trình VB đưa ra hộp thoại để bắt lỗi (debug) chương trình Ta
chọn End để trở về cửa sổ soạn thảo
Tạo tập tin thực thi tên Debug.exe bằng cách chọn File\Make Debug.exe Chạy tập tin Debug.exe từ Windows Explorer ta nhận được hộp thoại báo lỗi và chương trình tự động chấm dứt
Nhận xét kết quả khi thực hiện chương trình
Bước 4: Bây giờ ta thêm vào đoạn mã xử lý lỗi trong thủ tục của sự kiện Form_Load:
Private Sub Form_Load()
On Error GoTo Xulyloi
MsgBox "Truoc khi goi thu tuc"
Call GoiThuTuc
MsgBox "Sau khi goi thu tuc"
Thoat:
Exit Sub
Xulyloi:
Trang 5MsgBox "Su kien Form_Load - Loi xay ra: " & Err.Description
Resume Thoat
End Sub
Bước 5: Lưu dự án và chạy chương trình Nhận thấy, thay vì ta nhận được câu thông
báo lỗi từ VB, một hộp thoại báo lỗi do ta đưa vào xuất hiện Lưu ý, những lỗi được bắt trong thủ tục Form_Load (chứ không phải trong GoiThuTuc()) Nguyên nhân vì thủ tục GoiThuTuc() được gọi bởi thủ tục xử lý sự kiện Form_Load
Bước 6: Biên dịch lại thành tập tin Debug.exe, chạy nó Nhận xét kết quả
Bước 7: Các kết quả trên cho ta biết được các lỗi trong sự kiện Form_Load được xử lý
bởi các thao tác bắt lỗi trong thủ tục Form_Load Nhưng nếu thủ tục GoiThuTuc() cũng có các thao tác bắt lỗi chương trình thì sao? Đơn giản giả sử một lỗi xuất hiện trong GoiThuTuc() Bộ phận xử lý lỗi của GoiThuTuc (do ta thêm vào để bắt lỗi chương trình) sẽ thực thi thay vì đoạn lệnh bắt lỗi của sự kiện Form_Load được thực hiện Khi GoiThuTuc chấm dứt, quyền xử lý lỗi mới trao lại cho sự kiện Form_Load
Sửa lại thủ tục GoiThuTuc như sau:
Public Sub GoiThuTuc()
Dim bien As Integer
On Error GoTo Xulyloicucbo
MsgBox "Truoc khi gan tri cho bien"
bien = "Bien nguyen khong nhan gia tri la chuoi"
MsgBox "Sau khi gan tri cho bien: " & "Bien = " & Format(bien)
Thoatthutuc:
Exit Sub
Xulyloicucbo:
MsgBox "GoiThuTuc() - Loi xay ra: " & Err.Description
Resume Thoatthutuc
End Sub
Bước 8: Lưu dự án và chạy chương trình Thay đoạn mã Resume Thoatthutuc bằng
Resume và chạy chương trình Một vòng lặp vô tận xảy ra do chương trình sẽ quay lại đoạn mã bị lỗi và cố gắng thực thi nó; để thoát chương trình ta phải bấm tổ hợp phím Ctrl + Break
Bây giờ thay Resume bằng Resume Next và chạy lại chương trình Nhận xét kết quả Giải thích
II.2 Bài tập tự làm
1) Thiết kế chương trình cho phép nhập vào các hệ số a, b của phương trình bậc 1 dạng: ax+b=0; sau đó giải phương trình này Giao diện chương trình có thể như sau:
Trang 6Hình I.17: Phương trình
bậc 1
2) Thiết kế chương trình cho phép nhập vào các hệ số a, b, c của phương trình bậc 2 dạng: ax2 + bx + c=0; sau đó giải phương trình này
3) Thiết kế chương trình cho phép nhập vào một ký tự, sau đó kiểm tra xem ký tự đó thuộc tập hợp nào trong các tập ký tự sau:
Các ký tự chữ hoa: 'A' 'Z'
Các ký tự chữ thường: 'a' 'z'
Các ký tự chữ số : '0' '9'
Các ký tự khác
4) Giải phương trình bậc 1 bằng cách sử dụng cấu trúc Select Case
5) Tạo một chương trình hiển thị một danh sách chọn lựa cho người dùng trong một ListBox, sau đó xử lý với cấu trúc quyết định Select Case
Mục đích của điều khiển sự kiện này là hiển thi một danh sách các quốc gia, sau
đó hiển thị một thông điệp chào mừng bằng ngôn ngữ bản xứ khi người dùng chọn quốc gia của họ
Hình I.18: Lời chào các nước
Chẳng hạn: Tiếng Anh: Hello, programmer
Tiếng Đức: Hallo, programmierer Tiếng Tây Ban Nha: Hola, programador Tiếng Ý: Ciao, programmatori
6) Sử dụng vòng lặp For Next
Sử dụng For Next để thay đổi độ lớn ký tự trên một Form bằng cách thay đổi thuộc tính FontSize của Form
Thiết kế Form có giao diện:
Trang 7Sự kiện Command1_Click()
Dim i As Integer For i = 1 To 10
Form1.FontSize = 10 + i
Print "Line "; i
Next
Hình I.19: For…Next
Chạy chương trình
7) Thiết kế chương trình cho phép tính N! (N! = 1*2*3*…*N) Giao diện đề nghị:
Hình I.20: Tính N!
8) Thiết kế chương trình cho phép nhập vào một số nguyên N; sau đó tính các tổng
sau:
a S=1 + 2 + + n
b S=1/2 + 2/3 + +n/(n+1)
c S= - 1 +2 - 3 +4 - + (-1)nn
9) Thiết kế chương trình cho phép nhập vào số nguyên dương N; sau đó tìm số
+
− + + +
) 1 (
* ) 1 (
4
* 2
3 3
* 1
2
k k
k
N
10) Thiết kế chương trình cho phép nhập vào 2 số nguyên A, B; sau đó tìm UCLN và
BCNN của hai số a và b theo thuật toán sau ( Ký hiệu UCLN của a, b là (a,b) còn BCNN là [a,b])
- Nếu a chia hết cho b thì (a,b) = b
- Nếu a = b*q + r thì (a,b) = (b,r)
- [a,b] = a*b/(b,r)
Trang 811) Thiết kế chương trình cho phép nhập vào số nguyên N; sau đó viết 1 hàm tính N!; cuối cùng hiển thị kết quả giá trị N!
12) Thiết kế chương trình cho phép nhập vào 2 số nguyên N, K; sử dụng hàm tính N! ở trên, viết một hàm tính giá trị tổ hợp chập K của N phần tử theo công thức
)!
!*(
!
K N
K
N
C K
13) Thiết kế chương trình cho phép nhập vào số thực X và số nguyên N; sau đó viết các hàm tính các tổng sau rồi hiển thị kết quả:
- S= 1 + x +x2 + x3 + + xn
- S= 1 - x +x2 - x3 + (-1)n xn
- S= 1 + x/1! +x2/2! + x3/3! + + xn/n!
14) Sử dụng vòng lặp Do While … Loop thiết kế chương trình cho phép nhập vào một
số nguyên, sau đó thông báo kết quả xem số đó có phải là số nguyên tố hay không?
Đoạn chương trình kiểm tra số nguyên N có nguyên tố hay không:
i = 2
Do While (i < N) And (N Mod i <> 0)
i = i + 1 Loop
If i = N Then N là số nguyên tố Else N không là nguyên tố
15) Làm lại bài tập 11 (tính N!) nhưng sử dụng vòng lặp Do While … Loop
16) Làm lại bài tập 15 (kiểm tra số nguyên tố) nhưng bằng cách sử dụng Do Until … Loop
17) Làm lại bài tập 11 (tính N!) nhưng sử dụng vòng lặp Do Until … Loop
18) Thiết kế chương trình cho phép nhập vào một số nguyên N; sau đó phân tích số nguyên này ra thừa số nguyên tố Giao diện chương trình có thể như sau:
Hình I.21: Thừa số nguyên tố 19) Sử dụng điều khiển định thời (Timer)
Tạo một chương trình cho phép người dùng 15 giây để nhập mật khẩu trong một TextBox
Nếu người dùng không nhập mật khẩu đúng trong thời gian nói trên, chương
trình hiển thị thông báo “Time Expired” (Hết thời gian) và đóng chương trình
Thời gian làm bài tập: 30 phút
Giao diện đề nghị:
Trang 9- Nhập vào mật khẩu cần thiết (giả sử mật khẩu là: Secret)
Hình I.22: Giao diệ
- Nếu nhập đúng mật khẩu, rồi nhầp nút Nhập, một hộp thông báo xuất hiện với nội dụng: Ban dang nhap thanh cong
Hình I.23: Lỗi đăng nhập
- Nếu nhập mật khẩu sai, rồi nhấp nút Nhập, một thông báo xuất hiện với nội dung: Xin loi, chung toi khong biet ban!
Sau đó nhấp nút OK trên hộp thông báo này thì chương trình cho bạn nhập lại mật khẩu
Hình I.24: Lỗi đăng nhập
- Nếu thời gian quá 15 giây mà người dùng chưa nhập đúng mật khẩu thì một
thông báo sẽ hiện lên Xin loi, thoi gian da het; sau đó chương trình sẽ kết
thúc
Hình I.25: Báo hết giờ
20) Thiết kế chương trình tương tự như ứng dụng Canculator của Windows
Trang 10Chương 2 LẬP TRÌNH SỰ KIỆN NÂNG CAO
& ĐỒ HỌA TRONG VISUAL BASIC
Mục tiêu:
Chương này gồm các bài tập nhằm mục đích rèn luyện sinh viên các kỹ năng lập trình sự kiện nâng cao như các thao tác xử lý chuột, bàn phím… cũng như giúp cho sinh viên có cái nhìn sơ lược về cách thức xử lý đồ họa trong Visual Basic
Học xong chương này, sinh viên phải nắm bắt được các vấn đề sau:
- Cách thức sử dụng menu trong thiết kế giao diện
- Cách xử lý các sự kiện chuột và bàn phím
- Các phương thức đồ họa cơ bản
Kiến thức có liên quan:
Giáo trình Visual Basic, Chương 6
Tài liệu tham khảo:
Visual Basic 6 Certification Exam Guide - Chapter 3, Page 69 - Dan Mezick & Scot Hillier - McGraw-Hill - 1998
http://www.vovisoft.com/VisualBasic/VB6Chapter12C.htm
Trang 11I HƯỚNG DẪN
Bài tập 2-1 XÂY DỰNG MENU VÀ HỘP THOẠI CƠ BẢN
Bước 1: Tạo dự án mới tên Bt2-1 trong thư mục Basic\Bt2-1 Chú ý thường xuyên lưu
dự án lại
Bước 2: Bắt đầu với Menu Editor Nhấp chuột phải lên Form1 Chọn Menu Editor
Lúc này cửa sổ Menu Editor sẽ hiện ra
Hình II.1: Tạo menu
Trang 12Caption: &File
Bước 4: Định nghĩa các phần tử của menu File, các phần tử này sẽ xuất hiện khi ta
nhấp vào File Ta nhấp nút Next, vệt sáng sẽ di chuyển xuống 1 hàng, ta sẽ điền các thông tin vào
Bước 5: Các phần tử của menu File phải được đặt trong cùng một cấp: Bằng cách
nhấp chọn mũi tên phải, ta đã xác định các phần tử này thuộc menu File
Bước 6: Định nghĩa các thuộc tính sau cho phần tử của menu sau:
Caption: &New Project
Bước 7: Chọn nút OK của Menu Editor, sau đó thực thi dự án Khi nhấp chuột vào
menu File ta sẽ thấy xổ xuống phần tử New Project của Menu File Bây giờ trở lại màn hình soạn thảo
Bước 8: Trở lại cửa sổ Menu Editor và thêm các phần tử tiếp theo; nhớ kiểm tra thứ tự
của cấp mà phần tử cần thêm vào (phải nằm trong menu File) Mỗi lần thêm một phần
tử của menu (sau khi điền Caption và Name), cần chọn nút Next để định nghĩa một phần tử mới Cần lưu ý các phần tử của menu File phải cùng một cấp
Bước 9: Định nghĩa các phần tử sau:
Caption: &Open Project… Name: mnuFileOpen
Caption: A&dd Project… Name: mnuFileAdd
Caption: Sa&ve Project Name: mnuFileSave
Caption: Sav&e Project As… Name: mnuFileSaveAs
Bước 10: Phần tử kế tiếp của menu sẽ là đường phân cách, đường phân cách này cũng
phải có một tên, ta không thể nhấp chuột trên nó để thực thi công việc Đường phân cách có Caption là dấu “-“ Bây giờ ta thêm đường phân cách và sau đó thêm mục Exit
là hoàn tất
Bước 11: Nhấp nút Next, thêm đường phân cách:
Caption: - Name: mnuSeparator1
Bước 12: Nhấp Next, thêm mục Exit
Caption: E&xit Name: mnuFileExit
Bước 13: Cấu trúc của hệ thống menu của ta như sau:
&File
…&Open Project…
…Sa&ve Project
…Sav&e Project As…
…-
…E&xit
Từ đây ta có thể chèn phần tử bất kỳ vào menu (ở các bước trên ta chỉ chèn sau)
Bước 14: Muốn chèn thêm một phần tử, nhấp vào phần tử dưới vị trí mà phần tử mới
muốn đặt tại đó Chẳng hạn, muốn chèn một phần tử trước mục Save Project, nhấp vào Save Project sau đó chọn nút Insert Một phần tử trắng mới sẽ xuất hiện và ta điền thông tin vào
Bước 15: Định nghĩa mục mới:
Caption: &Remove Project Name: mnuFileRemove
Trang 13Nếu mục Name là khoảng trắng thì ta sẽ nhận được một thông báo lỗi: “Menu Control must have a name” Ta phải nhập Name vào
Bước 16: Gán phím tắt Phím tắt cho phép ta sử dụng bàn phím để truy xuất đến các
mục của Menu Chẳng hạn muốn cho mục Open Project có phím tắt là Ctrl + O, ta chọn mục Open Project trong hộp thoại Menu Editor
Bước 17: Nhấp OK Lưu dự án và thực thi chương trình Nhấp chọn mục bất kỳ trong
menu, ta thấy không tác dụng Do đó ta phải cung cấp hàm xử lý sự kiện khi nhấp vào các mục của menu
Bước 18: Đóng cửa sổ Menu Editor, nhấp File\Exit; cửa sổ Code xuất hiện Thêm
đoạn mã sau cho sự kiện Click của mnuFileExit:
MsgBox “Dong ung dung…”
End
Bước 19: Chạy ứng dụng, chọn File\Exit Điều gì xảy ra?
Bước 20: Trở về cửa sổ soạn thảo; nhấp chuột vào File\Open Project để mở cửa sổ
soạn thảo mã lệnh cho hàm xử lý sự kiện mnuFileOpen_Click Thêm đoạn mã sau:
MsgBox “Ban da nhap vao muc File\Open Project”
Bước 21: Chạy ứng dụng Nhấp vào File, rồi Open Project; một thông báo hiện ra
Đóng thông báo lại
Bước 22: Ta có thể dùng phím tắt để chọn Open Project; giữ phím Alt, bấm phím f rồi
o
Bước 23: Một cách khác để chọn File\Open Project là bấm phím Ctrl + O Như vậy, ta
thấy có 3 cách để chọn File\Open Project
Bước 24: Trong nhiều ứng dụng có sử dụng menu, sau khi chọn 1 mục trên menu, ta
thấy xuất hiện một hộp hội thoại gồm các nút OK và Cancel, trên đó có nhiều tùy chọn hay yêu cầu mà người sử dụng có thể chấp nhận hay hủy bỏ Ở đây cũng vậy, ta sẽ mở một hộp thoại tương tự như trên
Bước 25: Nhấp chuột vào Project\Components Một danh sách các điều khiển mà ta
có thể thêm vào dự án của mình Chọn Microsoft Common Dialog 6.0 bằng cách
đánh dấu vào checkbox và chọn OK Lúc này VB sẽ tự động thêm điều khiển mới này vào ToolBox
Bước 26: Điều khiển Common Dialog sẽ xuất hiện trên ToolBox, nhấp đúp trên nó và
đặt nó vào vị trí bất kỳ trên Form1
Bước 27: Nhấp chuột vào mục File\Open Project, cửa sổ soạn thảo mã lệnh hiện ra,
thêm vào đoạn mã sau trong hàm xử lý sự kiện mnuFileOpen_Click:
Form1.CommonDialog1.ShowOpen
MsgBox “Bạn da chon tap tin: ” & Form1.CommonDialog1.FileName
Bước 28: Trong lệnh MsgBox ở trên ta có sử dụng phép toán nối 2 chuỗi lại với nhau:
chuối “Ban da chon tap tin: ” và chuỗi Form1.CommonDialog1.FileName Lưu ý, ta phải sử dụng phép toán “&” để nối chuỗi lại
Bước 29: Để mở hộp hội thoại (Common Dialog) ta phải có một lời gọi hàm:
ShowOpen chẳng hạn Lúc này hộp thoại mới hiện ra
Bước 30: Lưu dự án và chạy chương trình Chọn File\Open Project, hộp thoại hiện ra
Chọn tập tin nào đó, điều gì xảy ra tiếp theo?
Bước 31: Tìm hiểu các lệnh ShowOpen, ShowSave, ShowPrinter, ShowColor Ta có
thể gọi chúng bằng cách thêm hàm xử lý sự kiện cho một mục của menu, chẳng hạn cho mnuFileSave_Click:
Form1.CommonDialog1.ShowSave