BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 
 Trang 38
Ch−¬ng ii 
Sö dông c¸c ®iÒu khiÓn c¬ b¶n 
MỤC TIÊU: SAU KHI HOÀN THÀNH CÁC BÀI TẬP, NGƯỜI HỌC CÓ THỂ 
¾ Sử dụng được các điều khiển cơ bản của VB 
¾ Kết hợp sử dụng nhiều điều khiển cơ bản trong chương trình 
¾ Vận dụng các điều khiển để viết được một số chương trình tiện ích. 
A - ĐỀ BÀI TẬP 
Bài 1: Viết chương trình giải phương trình bậc 2. Hệ số a, b, c nhập từ các 
TextBox. Kết quả nghiệm được hiển thị trên 2 nhãn, hoặc thông báo là vô nghiệm 
bằng hàm MsgBox. Giao diện có dạng như sau: 
Hình 2.1 – Giao diện chương trình 
Bài 2: Một form nhập (ví dụ: hàng hoá, E-Mail, Web Hosting…) thường có rất nhiều 
textbox, combobox và mỗi khi thêm một bản ghi mới thì đều cần xoá trắng nội dung 
trong các textbox, combobox này. Hãy tạo một form như Hình 2 và viết lệnh cho nút 
Xoá thực hiện xoá trắng các điều khiển này một cách nhanh nhất !. 
Hình 2.2 – Form nhập hàng hoá 
BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 
 Trang 39
Bài 3: Viết chương trình nhập họ tên sinh viên của một lớp vào một ListBox, trong 
qua trình nhập có thể cho phép người dùng xoá một số mục của Listbox. Giao diện 
chương trình như hình 3. Lưu ý: Mục thêm sau được đặt lên đầu danh sách. 
Hình 2.3 – Thêm và xoá một mục khỏi Listbox 
Bài 4: Viết chương trình như bài số 3, nhưng khi “Xoá khỏi danh sách” thì có thể 
thực hiện chọn nhiều mục với các Checkbox. Giao diện giống như Hình 4. 
Hình 2.4 - Chọn các mục với Style là “Checkbox” 
Bài 5: Minh hoạ sử dụng điều khiển Listbox và thuộc tính đa lựa chọn. 
Xây dựng giao diện chương trình như hình 5 
Hình 2.5 - Chuyển các mục từ một Listbox sang một Listbox khác 
BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 
 Trang 40
Yêu cầu: 
• Khi người dùng click vào nút thì các mục đang được chọn trong “Danh 
sách người dùng” phía bên trái sẽ được chèn vào Listbox phía bên phải. 
• Khi người dùng click vào nút thì các mục đang được chọn trong Listbox 
bên phải sẽ bị xoá (Remove) khỏi Listbox đó. 
• Trong cả hai Listbox, đều cho phép người dùng lựa chọn nhiều mục đồng thời. 
• Click vào nút Thoát thì kết thúc chương trình. 
• Yêu cầu thêm: Sau khi đã chèn các mục đang chọn bên Listbox trái sang List 
bên phải thì cũng đồng thời xoá các mục đang chọn đó khỏi Listbox bên trái. 
Bài 6: Minh hoạ sử dụng điều khiển Listbox và hàm tách xâu Split. 
Hình 2.6 - Đảo tên lên trước họ đệm 
Yêu cầu: 
• Nạp sẵn một số mục vào trong Listbox phía trái trong thủ tục Form_load 
• Khi người dùng click vào nút thì thực hiện đảo tên lên trước 
họ trong listbox phía trái và chèn vào Listbox phía phải. 
Bài 7: Tách địa chỉ E-Mail sử dụng hàm Split 
Các trang gửi E-Mail như Yahoo hay phần mềm Outlook Express đều cho phép 
người dùng có thể gửi tới nhiều địa chỉ khác nhau và mỗi địa chỉ này cách nhau bởi 
dấu chấm phảy. 
Hãy xây dựng một Form như hình 7 
Yêu cầu: Khi người dùng click vào nút "Thực hiện tách" thì các địa chỉ trong hộp 
Textbox sẽ được tách ra, sau đó chèn vào Listbox phía bên phải. Ví dụ: nếu nhập 
vào là 
[email protected];
[email protected] thì tách thành 2 mục là 
[email protected] và 
[email protected]. 
BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 
 Trang 41
Hình 2.7– Tách xâu sử dụng hàm Split 
Bài 8: Sắp xếp danh sách theo TÊN, áp dụng bài tập số 7 (Hàm Split). 
Hình 2.8 - Sắp xếp danh sách theo TÊN 
Yêu cầu: 
• Nạp sẵn (sử dụng phương thức AddItem) một số mục vào Listbox phía trái 
• Copy các mục trong Listbox phía trái sang Listbox phía phải. 
• Khi người dùng Click chọn nút “Sắp xếp theo tên” thì sắp xếp danh sách 
sinh viên trong Listbox phía phải theo thứ tự ưu tiên Tên, sau đó mới đến họ. 
Bài 9: Minh hoạ sử dụng điều khiển ComboBox. 
Yêu cầu sau: 
• Khi người dùng nhập một địa chỉ Web (URL) và nhấn Enter thì thực hiện thêm 
mục này vào trong ComboBox 
• Mở trang Web với địa chỉ tương ứng mà người dùng vừa nhập vào. 
• Mở trang Web tương ứng khi người dùng click chọn trong hộp ComboBox. 
BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 
 Trang 42
Hình 2.9 – Thao tác với ComboBox và WebBrowser để duyệt Web 
Bài 10: Minh hoạ thao tác với ComboBox và việc lấy tên font của hệ thống. 
Yêu cầu: 
• Nạp tất cả các Font chữ hiện có trong máy tính vào hộp Combo 
• Đặt font chữ cho textbox bằng với Font chữ khi người dùng chọn trong hộp 
Combox. Trong đó, hộp Combox hiển thị ở chế độ (style) là : Dropdown list. 
• Đặt cỡ chữ cho textbox bằng với cỡ chữ trong hộp Combox cỡ chữ 
• Hộp Textbox hiển thị ở chế độ MultiLine (Nhiều dòng). 
Hình 2.10 - Kết hợp sử dụng nhiều hộp ComboBox 
BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 
 Trang 43
Bài 11: Minh hoạ sử dụng điều khiển Option button và sử dụng hàm API-
Exitwindow 
Yêu cầu: 
• Khi người dùng click chọn các mục Logoff, Restart, Shutdown và chọn mục 
“Normal” thì thực hiện Logoff, Restart, shutdown ở chế độ “Normal” (Ở chế độ 
này thì khi Restart, Shutdown…nếu có một ứng dụng đang chạy–ví dụ 
Microsoft word-có dữ liệu chưa được lưu thì máy tính sẽ hỏi trước khi Restart) 
• Khi người dùng click chọn các mục Logoff, Restart, Shutdown và chọn mục 
“Bắt buộc” thì thực hiện Logoff, Restart, shutdown ở chế độ “Fore” (ở chế độ 
này thì máy tính thực hiện ngay và dữ liệu chưa lưu sẽ bị mất). 
• Giá trị chọn mặc định là Restart-Normal 
Hình 2.11 - Khởi động máy tính ở chế độ Normal (bình thường) 
Bài 12 – Minh hoạ sử dụng nhãn (Label) để giả lập thanh tiêu đề của cửa sổ. 
Font chữ hiển thị trên các thanh tiêu đề của cửa sổ là font chữ hệ thống, thường 
không phải là font tiếng việt. Do vậy khi chạy chương trình trên các máy tính khác 
nhau thì việc hiển thị có thể không còn đúng nữa. Để giải quyết vấn đề này, có một 
giải pháp là ẩn thanh tiêu đề của cửa sổ và thay vào đó là một Label và Font chữ 
của Label sẽ được đặt là font chữ tiếng Việt nên việc hiển thị luôn đảm bảo giữa các 
hệ thống khác nhau. 
Yêu cầu: 
• Xây dựng một Form như hình 10, trong đó tiêu đề là một Label với font chữ là 
.vnArialH, cỡ chữ là 12pt. 
• Khi người dùng di chuyển thanh tiêu đề thì form cũng di chuyển theo. 
• Khi người dùng click vào nút thì thoát khỏi ứng dụng. 
Hình 2.12 - Sử dụng Label thay cho thanh tiêu đề 
BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 
 Trang 44
Bài 13 – Minh hoạ sử dụng Label kết hợp với Frame và Timer. 
a. Giao diện chương trình 
Hình 2.13 - Cuộn văn bản với Label + Frame + Timer 
b. Yêu cầu: 
• Dòng chữ trong Label sẽ cuộn từ dưới lên. 
• Khi Click vào nút thì thực hiện cuộn, còn khi click vào nút 
 thì dừng cuộn. 
• Khi nội dung đã cuộn hết thì đặt lại Label về vị trí cuộn ban đầu. 
Bài 14 : Yêu cầu như bài 13 nhưng tốc độ cuộn (Khoảng Interval của điều khiển 
Timer) có thể thay đổi trực quan bằng thanh điều chỉnh tốc độ (Vscrollbar). 
Hình 2.14 - Điều chỉnh tốc độ bằng thanh Vscroll. 
Bài 15 - Sử dụng Label, kết hợp với Line để giả lập nút nhấn (Command button). 
Khi chuột di chuyển ở ngoài “nút” 
Khi chuột di chuyển bên trong “nút” 
Hình 2.15 - Giả lập nút nhấn bằng điều khiển Label và Line 
Yêu cầu: Tạo một nút nhấn “THOÁT” chỉ sử dụng Label và Line. Để : 
• Khi người dùng click vào nút này thì thoát khỏi chương trình 
BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 
 Trang 45
• Di chuyển chuột vào Label thì Font chữ đổi thành ĐẬM, màu chữ trắng-nền 
đen và đường thẳng (bên trái và trên chuyển thành màu ĐEN). 
• Khi di chuyển ra khỏi Label (hay di chuyển chuột trong form) thì đặt lại về các 
thuộc tính ban đầu. 
Bài 16: Minh hoạ sử dụng điều khiển Timer tạo hiệu ứng chữ chạy. 
Hình 2.16 - Sử dụng Timer tạo hiệu ứng chữ chạy trên thanh Tiêu đề 
Yêu cầu: Dòng chữ “Trường Đại học Sư phạm Kỹ thuật Hưng Yên – Khoa Công 
nghệ thông tin” liên tục chạy trên thanh tiêu đề cho đến khi người dùng click nút 
“Dừng”. Tốc độ cuộn là 100 miligiây !. (Interval = 100). 
Bài 17: Sử dụng Timer, viết chương trình “đồng hồ báo thức”. 
Xây dựng chương trình để chơi một file nhạc (WAV, MP3) tại một thời điểm đã định. 
Trong đó, thời gian chỉ định (gồm giờ : phút) có thể thay đổi và tên file nhạc cũng có 
thể thay đổi. 
Hình 2.17 – Giao diện chương trình “Đồng hồ báo thức” 
Bài 18: Sử dụng điều khiển Timer kết hợp với điều khiển Line vẽ đồng hồ 
Digital trên form. (Đồng hồ này chỉ cần có một kim giây). 
Hình 2.18 - Đồng hồ điện tử 
BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 
 Trang 46
Bài 19: Sử dụng điều khiển Timer để ghi nhận các phím nhấn – KeyLogger 
a. Giao diện 
Hình 2.19 -Giao diện chương trình bắt phím từ các ứng dụng khác- KeyLogger 
b. Yêu cầu 
• Ghi nhận phím nhấn ở bất kỳ ứng dụng nào trong hệ thống. 
• Khi người dùng click chọn nút “Kết thúc” thì lưu các phím nhấn đã ghi nhận 
được vào trong tệp văn bản C:\Keys.txt 
Bài 20: Minh hoạ sử dụng các điều khiển thao tác Tệp, Thư mục và Ổ đĩa. 
a. Giao diện chương trình: 
Hình 2.20 – Giao diện chương trình và kết qủa khi click "Xem kích thước file" 
b. Yêu cầu: 
• Mở file hiện hành (đang được chọn) khi người dùng click nút "Mở file này" hoặc 
Click đúp một file. 
• Xem kích thước file đang được chọn khi chọn nút “Xem kích thước file” 
• Xoá file đang được chọn (cần hỏi người dùng xác nhận lại trước khi xoá). 
• Thoát khỏi chương trình khi người dùng click nút "Thoát" 
BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 
 Trang 47
Bài 21: Minh hoạ khả năng kéo thả (Drag-Drop) file và thư mục. 
a. Giao diện 
Hình 2.21 – Thao tác với tệp, thư mục bằng Drag-Drop (Kéo - thả) 
b. Yêu cầu: 
Như bài 20 nhưng thêm khả năng “Kéo-Thả” (Drag-Drop): Khi người dùng kéo một 
tệp và thả vào nút “Mở” thì mở tệp đó. Còn khi người dùng kéo tệp vào nút “Xem 
kích thước file” thì thông báo kích thước file bằng hàm MsgBox. Khi người dùng kéo 
và thả vào nút "Xoá file này" thì thực hiện Xoá file đang được chọn. 
Bài 22: Thao tác với điều khiển FileListbox và khả năng đa lựa chọn. 
a. Giao diện chương trình 
Hình 2.22 - Chọn nhiều file trong FileListbox 
b. Yêu cầu: 
• Cho phép chọn nhiều file trong điều khiển FileListbox 
• Khi click vào nút thì thực hiện chèn đường dẫn và tên file của những file 
đang được chọn vào trong Listbox phía bên phải. Sau đó hiển thị tổng số file 
và tổng kích thước của các file có trong Listbox. 
BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 
 Trang 48
Bài 23: Sử dụng điều khiển Image làm ảnh nền cho form. 
a. Giao diện chương trình 
Hình 2.23 - Đặt ảnh nền cho Form bằng điều khiển Image 
b. Yêu cầu: 
• Khi người dùng Click nút “Chọn file ảnh cho Form” thì mở hộp thoại chọn file 
và nạp file đó vào điều khiển Image. 
• Khi người dùng Click nút “Huỷ bỏ ảnh nền” thì huỷ ảnh trong điều khiển Image 
Bài 24:Sử dụng điều khiển PictureBox tạo Icon tại khay hệ thống (SystemTray) 
a. Giao diện 
 (Picture1) 
Hình 2.24 - (Hiện menu khi click chuột phải) 
b. Yêu cầu 
• Đặt một biểu tượng (bất kỳ) dưới khay hệ thống như hình 24 
• Khi người dùng click chuột phải lên biểu tượng trên khay hệ thống thì hiển thị 
(Popup) menu như hình 24. 
• Khi người dùng click chọn mục "About" thì hiển thị một thông báo. 
• Khi người dùng click chọn mục Exit thì thoát khỏi chương trình. 
• Form phải được ẩn (Hide). 
• Yêu cầu thêm: Có thể tạo biểu tượng nhấp nháy (thay đổi liên tục biểu tượng) 
ở dưới khay hệ thống. (HD: Dùng một timer) 
BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 
 Trang 49
B- HƯỚNG DẪN - GIẢI MẪU 
Bài 1 
a. Thiết kế giao diện và thiết lập các thuộc tính cho các điều khiển (Lưu ý: Từ nay về 
sau, tên của các điều khiển được viết ở ngay cạnh điều khiển đó. Riêng với điều 
khiển Label nào mà không thực sự cần thiết thì tên có thể để mặc định - bỏ qua) 
Hình 2.25 - Đặt tên cho các điều khiển trên Form 
b. Hướng dẫn 
• Để lấy giá trị người dùng nhập trong Textbox, có thể truy cập thuộc tính Text, 
ví dụ: txtA.Text để lấy giá trị người dùng đã nhập trong hộp Textbox hệ số a. 
• Có thể sử dụng cấu trúc If…Then nhưng với VB thì cấu trúc Select Case là 
phù hợp hơn cả. 
c. Chương trình mẫu: 
Private Sub cmdThucHien_Click() 
 Dim Delta As Single 
 Delta = txtB.Text * txtB.Text - 4 * txtA.Text * txtC.Text 
 Select Case Delta 
 Case Is < 0 
 MsgBox "Ph−¬ng tr×nh v« nghiÖm" 
 Case 0 
 lblX1.Caption = "X1 = " & (-txtB.Text / 2 / txtA.Text) 
 lblX2.Caption = "X2 = " & (-txtB.Text / 2 / txtA.Text) 
 Case Is > 0 
 lblX1.Caption = "X1 = " & ((-txtB.Text + Sqr(Delta)) / 2 / txtA.Text) 
 lblX2.Caption = "X2 = " & ((-txtB.Text - Sqr(Delta)) / 2 / txtA.Text) 
 End Select 
End Sub 
d. Ghi chú: 
• Trong cấu trúc Select Case, nếu muốn thực hiện một công việc ứng với biểu 
thức cần kiểm tra nằm trong một miền giá trị thì có thể sử dụng từ khoá "IS" 
• Cấu trúc Select Case không chỉ làm việc với biểu thức ở dạng số 
mà còn cả dạng xâu ký tự (nhiều ngôn ngữ khác không có khả năng này). 
BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 
 Trang 50
• Giá trị trong textbox luôn được VB coi là một XÂU. Tuy nhiên, nếu các giá trị 
trong Textbox tham gia vào các phép tính +,-, *, /, với một số khác thì xâu tự 
động được chuyển thành số theo ngầm định. Do vậy, chúng ta không nhất 
thiết phải chuyển đổi chúng tường minh bằng hàm Val. Trong trường hợp, 
nếu phép toán là + (Cộng) mà 2 toán hạng tham gia đều là các Textbox thì bắt 
buộc phải chuyển đổi chúng về số bằng hàm Val trước khi cộng. 
Bài 2: 
a. Giao diện và thiết lập tham số cho các điều khiển: Tên của các điều khiển được 
đặt như trong hình 26. Trong đó có một điều khiển chuyên dùng cho nhập ngày 
tháng rất thuận tiện là Date Time Picker (nằm trong thư viện : Microsoft Windows 
Common Control-2 6.0) 
Hình 2.26 – Đặt tên cho các điều khiển trên Form 
b. Hướng dẫn 
Trong VB, tất cả các điều khiển đều nằm trong một tập hợp (Collection) là Controls. 
Ta có thể duyệt tất cả các điều khiển trong tập hợp này bằng cấu trúc lặp 
"For….Each…in Controls", tại mỗi vòng lặp ta có thể kiểm tra xem điều khiển hiện tại 
thuộc loại nào ?. Nếu là điều khiển Textbox hay ComboBox thì đặt thuộc tính Text 
bằng rỗng (tức là xoá). 
c. Chương trình nguồn 
Viết lệnh cho sự kiện Click của nút nhấn cmdXoa 
Private Sub cmdXoa_Click() 
 Dim obj As Object 
 For Each obj In Me.Controls 
BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 
 Trang 51
 If (TypeOf obj Is TextBox) Or (TypeOf obj Is ComboBox) Then 
 obj.Text = "" 
 End If 
 Next 
End Sub 
d. Ghi chú: 
• Để duyệt tất cả các phần tử trong một tập hợp thì bắt buộc phải dùng cấu trúc 
For Each … 
• Để kiểm tra xem một đối tượng X nào đó thuộc loại điều khiển nào, có thể 
dùng từ khoá TypeOf X Is…TextBox, ListBox, ComboBox, CheckBox, Frame, 
Label, Form, adodc,….. 
• Khi biến chạy X đang trỏ đến một loại điều khiển nào đó thì có thể sử dụng tất 
cả các thuộc tính, phương thức của đối tượng thông qua biến chạy X. Ví dụ 
nếu TypeOf X is ListBox là đúng (True) thì ta có thể truy cập đến thuộc tính 
Text và name của Listbox bằng cách viết X.Text, X.Name hay có thể truy cập 
đến phương thức AddItem bằng cách viết X.AddItem …. 
• Việc duyệt các phần tử trong một tập hợp rất hay được sử dụng và hữu ích, 
do vậy chúng ta cần sử dụng tốt cấu trúc duyệt này. 
• Việc xoá trắng các Textbox, ComboBox theo cách trên không phục thuộc vào 
số lượng và tên của các phần tử trong Form, do vậy không phải sửa đổi 
chương trình nguồn khi thay đổi các phần tử trên form. 
Bài 3 
a. Giao diện và thiết lập thông số cho các điều khiển. 
Hình 2.27 - Đặt tên cho các điều khiển. 
b. Hướng dẫn: Sử dụng phương thức AddItem để thêm và phương thức 
RemoveItem để loại bỏ một mục khỏi danh sách. Ngoài ra còn có thể dùng thuộc 
tính ListIndex để lấy về chỉ số của phần tử đang được chọn. 
c. Chương trình nguồn 
Form1.frm 
Private Sub cmdThem_Click() 
 lstDanhSach.AddItem txtHoTen.Text, 0 '/// 0 = Thªm vµo ®Çu danh s¸ch 
End Sub 
'----------------------------------------------------------------------------------------------------------------------------- 
Private Sub cmdXoa_Click() 
 If lstDanhSach.ListIndex < 0 Then 
 lstDanhSach.RemoveItem lstDanhSach.ListIndex 
BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 
 Trang 52
 Else 
 MsgBox "B¹n ph¶i chän mét môc tr−íc khi xo¸ !" 
 End If 
End Sub 
Private Sub cmdThoat_Click() 
 End 
End Sub 
d. Ghi chú: 
• Trong điều khiển Listbox, mục đầu tiên có chỉ số là 0. Mục cuối cùng có chỉ số 
là ListCount – 1. 
• Thuộc tính Text cho ta giá trị của phần tử hiện hành (đang được chọn) 
• Thuộc tính List(i) sẽ cho ta giá trị của phần tử có chỉ số là i 
• Mặc định phương thức AddItem của điều khiển Listbox thêm mục mới vào 
cuối danh sách, do vậy nếu muốn thêm vào đầu danh sách thì cần truyền giá 
trị 0 (vị trí đầu tiên) vào phương thức AddItem. 
• Phương thức RemoveItem dùng để loại bỏ 1 mục khỏi danh sách. Phần tử 
hiện đang được chọn có chỉ số là ListIndex. 
• Khi danh sách rỗng thì thuộc tính ListCount = 0 và ListIndex = - 1 
• Có thể chèn một số mục vào trong Listbox hay ComboBox trong lúc thiết kế 
bằng cách nhập vào thuộc tính "List" (Xem hình 23). Tại đây nếu muốn nhiều 
mục thì sau mỗi lần nhập, nhấn tổ hợp phím Ctrl+Enter: 
Hình 2.28 - Nhập liệu cho Listbox trong lúc thiết kế (Nhấn Ctrl-Enter để xuống dòng) 
Bài 4 
a. Thiết kế giao diện và thiết lập thông số cho các điều khiển trên Form 
Hình 2.29 - Đặt tên và thuộc tính cho các điều khiển trên Form 
BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 
 Trang 53
b. Hướng dẫn: Sử dụng thuộc tính Selected(i) để kiểm tra liệu mục chỉ số i có được 
chọn (Check) hay không. Nếu có thì gọi phương thức RemoveItem để xóa. Lưu ý 
rằng, khi xoá đi thì số phần tử trong danh sách sẽ bị thay đổi, do vậy không nên sử 
dụng vòng lặp For mà nên sử dụng vòng lặp Do While. Đồng thời khi duyệt thì nên 
duyệt từ cuối danh sách (từ phần tử có chỉ số lớn nhất là ListCount – 1). 
c. Chương trình nguồn. 
Option Explicit 
Private Sub cmdThem_Click() 
 lstDanhSach.AddItem txtHoTen.Text, 0 
End Sub 
'----------------------------------------------------------------------------------------------------------------------------- 
Private Sub cmdXoa_Click() 
 Dim i As Integer 
 i = lstDanhSach.ListCount – 1 '/// Bắt đầu duyệt từ phần tử cuối cùng 
 Do While i >= 0 
 If lstDanhSach.Selected(i) = True Then lstDanhSach.RemoveItem i 
 i = i - 1 
 Loop 
End Sub 
'----------------------------------------------------------------------------------------------------------------------------- 
Private Sub cmdThoat_Click() 
 End 
End Sub 
c. Chú ý: Với cấu trúc If…Then, nếu sau Then chỉ có một lệnh thì có thể viết câu 
lệnh đó cùng dòng với lệnh If…Then mà không cần phải có lệnh kết thúc End If. 
Bài 5 
a. Giao diện và thiết lập thuộc tính cho các điều khiển trên Form 
Hình 2.30 - Đặt thuộc tính cho các điều khiển 
b. Hướng dẫn: Sử dụng vòng lặp và kiểm tra từng mục xem có được chọn hay 
không, nếu được chọn thì thêm vào danh sách lstNguoiNhan. ở đây vì nội dung 
trong lstDanhSach không bị thay đổi nên có thể sử dụng bất kỳ cấu trúc lặp nào. 
BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 
 Trang 54
c. Chương trình nguồn 
Option Explicit 
Private Sub cmdCC_Click() 
 Dim i As Integer 
 For i = 0 To lstDanhSach.ListCount - 1 
 If lstDanhSach.Selected(i) = True Then '/// NÕu mục i ®−îc chän th× thªm. 
 lstNguoiNhan.AddItem lstDanhSach.List(i) 
 End If 
 Next 
End Sub 
'----------------------------------------------------------------------------------------------------------------------------- 
Private Sub cmdXoa_Click() 
 If lstNguoiNhan.ListIndex >= 0 Then 
 lstNguoiNhan.RemoveItem lstNguoiNhan.ListIndex 
 End If 
End Sub 
d. Ghi chú: 
• lstDanhSach.List(i) : lấy nội dung của mục i trong lstDanhSach 
• If lstNguoiNhan.ListIndex >= 0 Then…để đảm bảo chỉ xoá khi một mục được chọn 
• Khi đặt thuộc tính MultiSelect là 2 – Extended thì người dùng có thể chọn 
nhiều mục liền hoặc rời nhau của ListBox bằng chuột và bàn phím. 
Bài 6 
a. Giao diện và đặt thuộc tính cho các điều khiển trên Form 
Hình 2.31 – Giao diện và đặt tên cho điều khiển 
b. Hướng dẫn Có rất nhiều phương pháp để đưa phần tên lên trước họ đệm, tuy 
nhiên trong bài này xin giới thiệu một cách khác thông qua hàm xử lý xâu ký tự 
SPLIT. Việc tách Tên lên trước của một xâu S có thể mô tả như ví dụ sau: 
"Nguyen Van An" Nguyen Van An 
 An Nguyen Van 
Mảng Xâu vào cần đảo tên 
BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 
 Trang 55
- Trước tiên xâu vào sẽ được phân tách và lấy từng từ bên trong nó nhờ hàm Split 
- Tiếp theo là đảo phần tử cuối cùng trong mảng lên đầu danh sách. 
c. Chương trình nguồn 
Option Explicit 
Function DaoTen(HoTen As String) As String 
 Dim i As Integer, KetQua As String 
 Dim S 
 KetQua = "" 
 S = Split(HoTen, Chr(32)) 
 KetQua = S(UBound(S)) 
 For i = 0 To UBound(S) - 1 
 KetQua = KetQua & Chr(32) & S(i) '/// Chr(32) là ký tự trắng 
 Next 
 DaoTen = KetQua 
End Function 
'----------------------------------------------------------------------------------------------------------------------------- 
Private Sub cmdDao_Click() 
 Dim i As Integer 
 lstMoi.Clear 
 For i = 0 To lstNguoiDung.ListCount - 1 
 lstMoi.AddItem DaoTen(lstNguoiDung.List(i)) 
 Next 
End Sub 
Bài 7 
a. Đặt thuộc tính cho các điều khiển trên form 
Hình 2.32 – Giao diện và đặt tên cho các điều khiển 
b. Hướng dẫn 
Khi một xâu chứa nhiều phần tử được cách nhau bởi một ký tự hay một xâu con 
khác, ta có thể dễ dàng tách chúng ra thành các phần tử riêng biệt nhờ hàm Split 
trong VB. Cú pháp của hàm Split như sau: Split (Xâu cần tách S, Xâu phân cách các 
phần tử trong S). Kết quả trả về của hàm là một mảng. Để lưu mảng này, ta cần sử 
dụng một biến kiểu Variant như trong chương trình mẫu sau đây. 
BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 
 Trang 56
c.Chương trình mẫu 
Option Explicit 
'// Viết lệnh cho thủ tục sự kiện click chuột lên nút Tách 
Private Sub cmdTach_Click() 
 Dim i As Integer, S As Variant 
 S = Split(txtDiaChi.Text, ";") '/// Tách xâu trong Textbox được ngăn cách bởi ";" 
 lstKetQua.Clear '/// Xoá Listbox để lưu kết quả 
 For i = 0 To UBound(S) '/// Chèn các phần tử trong mảng S vào Listbox 
 lstKetQua.AddItem S(i) 
 Next 
End Sub 
d. Ghi chú: 
• Xâu phân cách (Tham số thứ 2 của hàm Split) không nhất thiết là 1 ký tự mà 
có thể là một xâu lớn hơn 1 ký tự. 
• Hàm Ubound(S) trả về số phần tử hiện có trong mảng S. 
• Trong thực tế cần phải xử lý thêm khi nhận các kết quả từ việc tách xâu S. 
Chẳng hạn như có thể người dùng gõ dấu cách sau dấu chấm phảy hoặc có 2 
dấu chấm phảy liền nhau v.v… thì khi đó cần phải cắt các dấu trắng bằng hàm 
TRIM trước, sau đó kiểm tra xem không rỗng thì mới nhận kết quả. 
Bài 8. 
a. Giao diện và đặt tên cho các điều khiển trên form 
Hình 2.33 – Giao diện chương trình và đặt tên cho các điều khiển 
b. Hướng dẫn 
Theo mặc định, VB so sánh hai chuỗi ký tự từ trái qua phải - tức là sắp xếp Họ sau 
đó mới đến tên- do vậy để sắp xếp theo thứ tự ưu tiên Tên trước thì cần phải cắt 
phần tên và ghép lên đầu. Việc cắt tên có rất nhiều cách, nhưng ở đây ta hoàn toàn 
có thể áp dụng hàm Split như trong các bài tập trước đây. Để cho thuận tiện, ở đây 
ta xây dựng một hàm DaoTen, có nhiệm vụ đảo phần "Tên" lên trước Họ. 
BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 
 Trang 57
c. Chương trình mẫu 
Option Explicit 
'/// Hàm này có chức năng cắt phần tên (ở cuối) đưa lên đầu (tên lên trước họ) 
Function DaoTen(HoTen As String) As String 
 Dim S As Variant, i As Integer, KetQua As String 
 S = Split(HoTen, Chr(32)) 
 KetQua = S(UBound(S)) '///Lấy phần tử cuối ⇔ Tên 
 For i = 0 To UBound(S) – 1 '/// Ghép thêm phần "Họ" và "Đệm" 
 KetQua = KetQua & Chr(32) & S(i) 
 Next 
 DaoTen = KetQua '/// Trả kết quả về cho hàm 
End Function 
'----------------------------------------------------------------------------------------------------------------------------- 
'///Thực hiện sắp xếp danh sách trong lstDSSV_SapXep khi người dùng click "Sắp xếp theo TÊN" 
Private Sub cmdSapXep_Click() 
 Dim i As Integer, j As Integer, TG As String 
 lstDSSV_SapXep.Clear 
'/// Copy các mục trong lstDSSV sang listbox l stDSSV_SapXep 
 For i = 0 To lstDSSV.ListCount - 1 
 lstDSSV_SapXep.AddItem Trim(lstDSSV.List(i)) 
 Next 
'/// Thực hiện sắp xếp danh sách trong lstDSSV_SapXep sử dụng hàm DaoXau. 
 For i = 0 To lstDSSV_SapXep.ListCount - 2 
 For j = i + 1 To lstDSSV_SapXep.ListCount - 1 
 If DaoTen(lstDSSV_SapXep.List(i)) > DaoTen(lstDSSV_SapXep.List(j)) Then 
 TG = lstDSSV_SapXep.List(i) 
 lstDSSV_SapXep.List(i) = lstDSSV_SapXep.List(j) 
 lstDSSV_SapXep.List(j) =