173
BÀI TP LP TRÌNH HƯỚNG SKIN Biên son: Bmôn CNPM–ĐHSPKT HY 2005 Trang 1 Bμi tËp ch¬ng 1 NG¤N NG÷ LËP TR×NH VISUAL BASIC MC TIÊU: SAU KHI HOÀN THÀNH CÁC BÀI TP, NGƯỜI HC CÓ TH¾ Khai báo các biến thuc các kiu dliu cơ bn (byte, integer, long, string, boolean, single) và kiu mng, kiu bn ghi trong Visual Basic. ¾ Sdng các hàm nhp xut dliu (MsgBox và InputBox) ca VB. ¾ Sdng và vn dng được các cu trúc rnhánh (If...Then If...Then...Else), cu trúc đa rnhánh (Select Case) và các loi vòng lp : For; Do While...Loop; Do...Loop để viết chương trình. ¾ Sdng được mt shàm xlý xâu thường dùng. A - ĐỀ BÀI TP Bài tp 1: Sdng hàm MsgBox và InputBox Viết chương trình gii phương trình bc 2. Hsa, b, c nhp tbàn phím bng hàm InputBox (Gii sa 0). Bài tp 2: Minh hocu trúc If … Then. Viết chương trình tính lương như sau: Cho người dùng nhp vào lương cơ bn LCB, Hslương HSL và chc vCV. Nếu chc vlà "giam doc" thì cng thêm 500000 vào lương thc lĩnh (LTL), nếu là "truong phong" thì cng thêm 300000, nếu là "to truong" thì cng thêm 200000, nếu là "nhan vien" thì không cng. Sau đó hin thtng slương thc lĩnh. Bài tp 3-Select Case: Yêu cu như bài 2, nhưng sdng cu trúc Select Case Bài tp 4: Hin thcác loi thông báo sdng hàm MsgBox. Viết chương trình hin th4 loi hp thoi MsgBox như mô tdưới đây khi người dùng nhp vào các stương ng 1,2,3,4 bng hàm InputBox: 1 3 2 4 Bài tp 5: Sdng cu trúc Select Case. Viết chương trình cho phép người dùng nhp vào 2 sthc a và b và mt trong các phép toán gm +, -, *, /, \ (Chia ly phn nguyên), mod (chia ly phn dư) hoc ^ (Lutha). Sau đó hin thkết qutương ng. Ví dnếu nhp 2 s10, 20 và phép toán là + thì thông báo "Kết qulà 30" v.v.

Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

Embed Size (px)

Citation preview

Page 1: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 1

Bμi tËp ch−¬ng 1

NG¤N NG÷ LËP TR×NH VISUAL BASIC

MỤC TIÊU: SAU KHI HOÀN THÀNH CÁC BÀI TẬP, NGƯỜI HỌC CÓ THỂ

Khai báo các biến thuộc các kiểu dữ liệu cơ bản (byte, integer, long, string, boolean, single) và kiểu mảng, kiểu bản ghi trong Visual Basic.

Sử dụng các hàm nhập xuất dữ liệu (MsgBox và InputBox) của VB. Sử dụng và vận dụng được các cấu trúc rẽ nhánh (If...Then và

If...Then...Else), cấu trúc đa rẽ nhánh (Select Case) và các loại vòng lặp : For; Do While...Loop; Do...Loop để viết chương trình.

Sử dụng được một số hàm xử lý xâu thường dùng.

A - ĐỀ BÀI TẬP Bài tập 1: Sử dụng hàm MsgBox và InputBox Viết chương trình giải phương trình bậc 2. Hệ số a, b, c nhập từ bàn phím bằng hàm InputBox (Giải sử a ≠ 0). Bài tập 2: Minh hoạ cấu trúc If … Then. Viết chương trình tính lương như sau: Cho người dùng nhập vào lương cơ bản LCB, Hệ số lương HSL và chức vụ CV. Nếu chức vụ là "giam doc" thì cộng thêm 500000 vào lương thực lĩnh (LTL), nếu là "truong phong" thì cộng thêm 300000, nếu là "to truong" thì cộng thêm 200000, nếu là "nhan vien" thì không cộng. Sau đó hiển thị tổng số lương thực lĩnh. Bài tập 3-Select Case: Yêu cầu như bài 2, nhưng sử dụng cấu trúc Select Case

Bài tập 4: Hiển thị các loại thông báo sử dụng hàm MsgBox. Viết chương trình hiển thị 4 loại hộp thoại MsgBox như mô tả dưới đây khi người dùng nhập vào các số tương ứng 1,2,3,4 bằng hàm InputBox:

1 3

2 4 Bài tập 5: Sử dụng cấu trúc Select Case. Viết chương trình cho phép người dùng nhập vào 2 số thực a và b và một trong các phép toán gồm +, -, *, /, \ (Chia lấy phần nguyên), mod (chia lấy phần dư) hoặc ^ (Luỹ thừa). Sau đó hiển thị kết quả tương ứng. Ví dụ nếu nhập 2 số 10, 20 và phép toán là + thì thông báo "Kết quả là 30" v.v.

Page 2: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 2

Bài tập 6: Sử dụng vòng lặp FOR. Viết chương trình tính tổng của dãy số sau và hiển thị kết quả ra màn hình: S = 1 + 2 + 3 + ... + N , Với N nhập từ bàn phím. Bài tập 7: Sử dụng vòng lặp For với điều khoản Step. Hãy viết chương trình tính tổng các số chẵn từ 1 đến 100. Bài tập 8: Sử dụng vòng lặp For đếm ngược “FOR … DOWNTO…”. Hãy sử dụng vòng lặp For in ra các số từ 100 đến 1 bằng lệnh Debug.Print. Bài tập 9: Sử dụng vòng lặp Do…Loop Until Cho người dùng nhập vào một dãy các số nguyên (âm và dương) và tính tổng các số âm, tổng các số dương. Việc nhập kết thúc nếu số nhập vào là 0. Bài tập 10: Sử dụng cấu trúc Do While … Loop. Hãy cho biết cần gửi số tiền tiết kiệm 1 triệu đồng vào ngân hàng trong thời gian mấy năm để có 2 triệu đồng. Biết rằng lãi suất hàng năm là 8%. Bài tập 11: Thoát khỏi vòng lặp với Exit For, Exit Do. Viết chương trình nhập số nguyên n và kiểm tra xem có phải là số nguyên tố hay không ?. Bài tập 12: Sự tương đương giữa các cấu trúc lặp. Tính n! sử dụng các cấu trúc lặp khác nhau. Bài tập 13: Sử dụng vòng lặp FOR Lập trình tính tổng của dãy số sau và hiển thị kết quả ra màn hình :

S = ∑∑∑===

++310

300

2200

100

28

1

2

nnnnnn

Bài tập 14 – Tính N !: Viết chương trình nhập số nguyên N (0<N<20) và tính N!. Bài tập 15- Tính tổng 1 dãy số: Tính tổng của dãy sau, với n nhập từ bàn phím:

)1(....)1(....4.33.22.1 +++++++++++++= nnnininnnS

Bài tập 16- Tính dãy Fibonasi: Tính tổng của day số Fibonasi theo 2 cách: bằng đệ qui và không đệ qui, với N nhập từ bàn phím. Biết rằng dãy số Fibonasi được định nghĩa như sau:

F (n) = 1 nếu n = 0, n = 1 F (n) = Fn-2 + Fn-1 nếu n ≥ 2

Bài tập 17- Tìm Ứơc số chung lớn nhất : Tìm ước số chung lớn nhất của 2 số a và b (a,b nhập từ bàn phím). Bài tập 18-Tối giản phân số : Kiểm tra xem phân số a/b (a, b nhập từ bàn phím) đã tối giản hay chưa? Nếu chưa tối giản thì hãy thực hiện rút gọn phân số đó và in ra màn hình.

Page 3: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 3

Bài tập 19- Tìm số nguyên tố: Nhập vào một dãy số nguyên dương bằng hàm InputBox. Sau đó in ra các giá trị là số nguyên tố. Bài tập 20-Đếm ký tự: Lập trình cho người dùng nhập vào một xâu ký tự S. Sau đó đếm xem trong xâu nhập vào có bao nhiêu ký tự là a và A.

Biết rằng : - Hàm Mid(S, i, 1) cho ta ký tự thứ i trong xâu S - Hàm Len(S) cho ta độ dài của xâu S

Bài tập 21-Tính tổng dãy số: Viết chương trình nhập x và n rồi tính tổng

S = 1

...432

132

++++++

nxxxx n

(Hay có thể viết dưới dạng S = 1

...4321

3210

++++++

nxxxxx n

)

Bài tập 22 : Bài toán tìm phần tử lớn nhất (nhỏ nhất) trong một danh sách Viết chương trình nhập n số nguyên vào một mảng nguyên A, sau đó tìm số lớn nhất trong mảng nguyên đó. Bài tập 23: Liệt kê các phần tử lớn nhất (nhỏ nhất) trong danh sách. Nhập danh sách gồm n số nguyên, sau đó hiển thị các phần tử có giá trị lớn nhất. Bài tập 24: Sắp xếp một dãy số nguyên. Viết chương trình cho phép nhập vào N số nguyên. Sau đó sắp xếp dãy số này theo chiều tăng dần và hiển thị dãy đã sắp xếp ra màn hình bằng lệnh Debug.Print. Bài tập 25 – Quick Sort: Nhập vào một dãy N số nguyên dương, sau đó sắp xếp dãy này tăng dần theo giải thuật Quick-Sort. Kết quả in ra bằng hàm Debug.Print. Bài tập 26- Heap Sort: Nhập vào một dãy N số nguyên dương, sau đó sắp xếp dãy này tăng dần theo giải thuật Heap-Sort. Kết quả in ra bằng hàm Debug.Print. Bài tập 27: Sắp xếp một dãy các phần tử, trong đó mỗi phần tử là một xâu ký tự theo vần Alphabet (Theo thứ tự từ điển) bằng thuật toán sắp xếp đơn giản. Viết chương trình nhập vào danh sách tên của một lớp, sau đó sắp xếp theo vần Alphabet và hiển thị kết quả sắp xếp ra màn hình bằng hàm Debug.Print Bài tập 28-Chuẩn hoá xâu: Nhập vào một xâu ký tự bất kỳ sau đó chuẩn hoá và in ra màn hình. Xâu chuẩn hoá ở đây là xâu không có 2 dấu trắng liền nhau, không có dấu trắng ở hai đầu và sau dấu chấm hoặc dấu phảy phải có một dấu trắng. Bài tập 29-Chuẩn hoá xâu: Yêu cầu như bài 28 và mỗi ký tự đầu câu là chữ HOA. Bài tập 30-Tách số khỏi xâu: Nhập vào một xâu ký tự có chứa cả chữ số và chữ cái ví dụ: “Ngày mồng 2 tháng 9 năm 1945 Bác Hồ đã đọc tuyên ngôn độc lập tại Quảng trường Ba Đình lịch sử !”. Giả sử các số là nguyên dương. Hãy tách các số đó ra khỏi xâu và in ra màn hình (Ở đây sẽ tách được 3 số là 2, 9 và 1945).

Page 4: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 4

Bài tập 31-Tách Câu: Nhập vào một xâu ký tự bất kỳ, kết thúc mỗi câu là một dấu chấm. Hãy in mỗi câu trong xâu đó trên một dòng bằng hàm Debug.print. Bài tập 32-Chuyển đổi Font chữ: Giả sử một tệp văn bản có nội dung được định dạng với font chữ .vntime, Hãy chuyển nội dung của tệp này sang font chữ VIQR và lưu vào một tệp khác. Tên tệp nguồn và tệp đích tương ứng là : c:\FontVNTime.txt và c:\FontVIQR.txt. Bài tập 33-Thống kê ký tự trong xâu: Nhập một xâu ký tự bất kỳ, sau đó in ra màn hình số lượng từng loại ký tự đã nhập. Bài tập 34-Thay thế ký tự: Nhập vào một xâu, sau đó thay thế tất cả các ký tự trắng (chr(32)) bằng ký tự “_”. Kết quả in ra màn hình bằng hàm MsgBox. Bài tập 35-Cộng số nguyên lớn: Viết chương trình cộng 2 số nguyên dương lớn bất kỳ và in kết quả ra màn hình. Bài tập 36-Ma trận số: Viết chương trình nhập vào một ma trận gồm m hàng và n cột. Sau đó tính tổng các phần tử dương, tổng các phần tử trên 2 đường chéo chính. Bài tập 37- Kiểm tra "đường thẳng" trong ma trận: Nhập một ma trận vuông kích thước N x N. Ma trận này chỉ chứa các số 0 và 1. Hãy lập trình để cho biết ma trận đó có ít nhất 5 phần tử thẳng hàng (ngang, dọc, chéo xuôi, chéo ngược) có cùng giá trị là 1 hay không ? Bài tập 38- Mảng bản ghi: Viết chương trình nhập vào một danh sách cán bộ, sau đó sắp xếp danh sách cán bộ theo tuổi và lưu vào một tệp tên là Canbo.txt. Thông tin về cán bộ gồm: Họ và tên, Năm sinh, Quê quán, Hệ số lương.

PHỤ LỤC 1

Dưới đây là mô tả một số hàm rất hay dùng trong VB để bạn tham khảo trong khi lập trình và cho các bài tập sau này . Tên hàm Mô tả Ví dụ Abs (x) Hàm tính giá trị tuyệt đối của một số. Abs(-5) 5 Sqr(x) Tính căn bậc hai của một số x (x>=0) Sqr(4) 2 Round(x) Làm tròn số x Round(3.2) 3 Asc(Ch) Trả về mã của ký tự Ch Asc("A") 65 Chr(n) Trả về ký tự có mã Ascii là n Chr(65) "A"

UCase(S) Trả về xâu chữ hoa (Nhưng không làm thay đổi đến xâu S) UCase("aBc") "ABC"

LCase(S) Trả về xâu chữ thường (Nhưng không làm thay đổi đến xâu S) UCase("aBc") "abc"

Len(S) Trả về độ dài của xâu S Len("abc123") 6

Mid(S,i,n) Lấy một xâu con trong S từ vị trí thứ i, n ký tự. Nếu bỏ qua tham số n thì mặc định là lấy từ vị trí i đến hết xâu.

Mid("ABCDE", 2,3) "BCD"

Left(S, n) Lấy ra n ký tự trong xâu S tính từ bên trái Left(S,"ABCD",3) "ABC" Right(S,n) Lấy ra n ký tự trong xâu S tính từ bên phải Right(S,"ABCD",3) "BCD"

Trim(S) Trả về một xâu S nhưng bỏ các dấu trắng hai đầu (Xâu S không bị thay đổi). Trim(" ABC ") "ABC"

LTrim(S) Giống như Trim(S) nhưng chỉ cắt phía trái LTrim(" ABC ") "ABC " RTrim(S) Giống như Trim(S) nhưng chỉ cắt phía phải RTrim(" ABC ") " ABC" StrReverse(S) Đảo ngược xâu S (S không bị thay đổi) StrReverse("AB") "BA" Str(x) Chuyển số x sang dạng xâu Str(10) "10" Val(S) Chuyển một xâu sang dạng số Val("10") 10

Instr(n,S1,S2) Kiểm tra xâu S2 có năm trong xâu S1 hay không. Hàm trả về giá trị > 0 nếu có. Instr(1,"ABC", "BC") 2

Split(S, C) Tách xâu S thành các phần tử, với ký hiệu phân Dim S As string, R As

Page 5: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 5

tách là C. Variant Dim I As integer S = “ha,noi,viet,nam” R = Split(S,”,”) For i=0 to Ubound(R) Msgbox R(i) Next

Replace (S, S1, S2) Thay thế các xâu con S1 trong S bằng xâu S2 Dim S As string

S = Replace(“A!!”,”!!”,”!”) FileLen(F) Cho biết kích thước của file F tính theo bytes MsgBox FileLen("C:\io.sys") CurDir Trả về đường dẫn của thư mục hiện hành Msgbox CurDir

Year(D) Trả về năm của biến kiểu Date D Dim D As Date D = Now Msgbox Year(D)

Month(D) Trả về tháng của biến kiểu Date D MsgBox Month(Now) Day(D) Trả về ngày của biểu thức kiểu Date D Day(#21/2/2004#) 21 Hour(T) Trả về giờ của biểu thức kiểu Time T Hour(Time) Now Hàm trả về ngày tháng hiện hành Msgbox now Time Trả về giờ phút giây hiện hành Msgbox Time

Rnd Hàm trả về một số ngẫu nhiên trong khoảng [0, 1) Lưu ý: trước đó phải gọi thủ tục Randomize. Msgbox Rnd

B. HƯỚNG DẪN - GIẢI MẪU Bài tập 1

a. Hướng dẫn: Cần tính giá trị của Δ, Sau đó sử dụng cấu trúc lệnh If...Then...Else (Hoặc cấu trúc Select Case) để kiểm tra Δ và tính nghiệm. b. Chương trình mẫu:

Cách 1: Sử dụng cấu trúc If..Then … Else Cách 2: Sử dụng cấu trúc Select Case

Private Sub Form_Load() Dim a As Single, b As Single Dim c As Single Dim Delta As Single Dim x1 As Single, x2 As Single a = InputBox("Nhập hệ số a (a <> 0) :") b = InputBox("Nhập hệ số b : ") c = InputBox("Nhập hệ số c : ") Delta = b ^ 2 - 4 * a * c If Delta < 0 Then MsgBox "Vô nghiệm ", vbInformation Else If Delta = 0 Then x1 = -b / (2 * a) MsgBox "Có nghiệm kép:" & x1 Else x1 = (-b + Sqr(Delta)) / (2 * a) x2 = (-b - Sqr(Delta)) / (2 * a) MsgBox "x1=" &x1 & " x2=" &x2 End If '//// Của If Delta = 0 End If '//// Của If Delta < 0 End Sub

Private Sub Form_Load() Dim a As Single, b As Single Dim c As Single Dim Delta As Single Dim x1 As Single, x2 As Single a = InputBox("Nhập hệ số a (a<>0):") b = InputBox("Nhập hệ số b : ") c = InputBox("Nhập hệ số c : ") Delta = b ^ 2 - 4 * a * c Select Case Delta Case Is < 0 MsgBox "Vô nghiệm " Case 0 x1 = -b / (2 * a) MsgBox "Nghiệm kép:" & x1 Case Is > 0 x1 = (-b + Sqr(Delta)) / (2 * a) x2 = (-b - Sqr(Delta)) / (2 * a) MsgBox "x1=" &x1 &" x2=" &x2 End Select End Sub

c. Ghi chú: Cấu trúc Select Case của VB rất mạnh, nó không những kiểm tra biểu thức ở dạng số nguyên mà còn có thể kiểm tra cả dạng số thực, xâu ký tự, đồng thời với mối loại giá trị có thể kiểm tra một khoảng giá trị (sử dụng từ khoá Case is …)

Page 6: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 6

Bài tập 2 a. Hướng dẫn: Lương thực lĩnh (LTL) = HSL * LCB + Phụ cấp chức vụ. Để tính Phụ cấp chức vụ, cần sử dụng câu lệnh If ... Then để kiểm tra xem chức vụ nhập vào có là "giam doc", "truong phong" hay "to truong" hay không để cộng thêm. b. Chương trình mẫu:

Chương trình nhập và tính lương Private Sub Form_Load() Dim HSL As Long, LCB As Long, PCCV As Long, LTL As Long Dim CV As String LCB = InputBox("nhập vào lương cơ bản : ", "Tính lương", 290000) HSL = InputBox("nhập vào hệ số lương", "Tính lương", 1.92) CV = InputBox("Chức vụ ") If CV = "giam doc" Then LTL = HSL * LCB + 500000 If CV = "truong phong" Then LTL = HSL * LCB + 300000 If CV = "to truong" Then LTL = HSL * LCB + 20000 If CV = "nhan vien" Then LTL = HSL * LCB End Sub

c. Ghi chú: Có thể thay thế cấu trúc If...Then ở trên bằng cấu trúc If....Then...ElseIf hoặc bằng cấu trúc đa rẽ nhánh Select Case (Đây là cấu trúc phù hợp nhất) Bài tập 3 a. Hướng dẫn: Cấu trúc Case trong VB cho phép kiểm tra cả biểu thức dạng Xâu, Số nên có thể áp dụng vào giải quyết bài toán này. b. Chương trình mẫu:

Tính lương đơn giản minh hoạ cấu trúc Select Case Private Sub Form_Load() Dim HSL As Long, LCB As Long, PCCV As Long, LTL As Long Dim CV As String LCB = InputBox("nhập vào lương cơ bản : ", "Tính lương", 290000) HSL = InputBox("nhập vào hệ số lương", "Tính lương", 1.92) CV = InputBox("Chức vụ ") Select Case CV Case "giam doc" LTL = HSL * LCB + 500000 Case "truong phong" LTL = HSL * LCB + 300000 Case "to truong" LTL = HSL * LCB + 20000 Case Else LTL = HSL * LCB End Select MsgBox "Lương của bạn là : " & LTL End Sub

C. Ghi chú: Để chương trình vẫn tính đúng cho dù người dùng có thể nhập chức vụ ở dạng chữ thường hay chữ HOA thì nên UCase các xâu trước tiên. (Xem phụ lục 1)

Page 7: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 7

Bài tập 4 a. Hướng dẫn: Để hiển thị hộp thoại Msgbox với các nút và biểu tượng khác nhau, ta chỉ cần thêm các hằng vào tham số thứ 2 của hàm MsgBox, ví dụ : vbQuestion, vbYesNo, vbOKCancel, vbInformation, vbAbortRetryIgnore.... Ngoài ra, để biết người dùng muốn hiển thị loại hộp thoại nào (nhập vào số mấy) cần sử dụng cấu trúc Select Case để kiểm tra và ra quyết định. b. Chương trình mẫu:

Private Sub Form_Load() Dim Kieu As Byte Kieu = InputBox("B¹n h·y nhËp vµo mét sè (1-4) ®Ó chän kiÓu MsgBox : ") Select Case Kieu Case 1: MsgBox "KiÓu ®¬n gi¶n chØ cã nót OK" '///ViÕt nhiÒu lÖnh cÇn c¸ch nhau dÊu ":" Case 2: MsgBox "Cã 2 nót Yes vµ No", vbYesNo Case 3: MsgBox "Cã nót OK, Cancel vµ dÊu hái chÊm", vbOKCancel Or vbQuestion Case 4: MsgBox "Cã 3 nót vµ dÊu c¶nh b¸o mµu ®á", vbAbortRetryIgnore Or vbCritical Case Else: MsgBox "B¹n ph¶i nhËp 1,2,3 hoÆc 4", vbExclamation, "nhËp sai" End Select End Sub

c. Ghi chú:

• Có thể kết hợp hiển thị các nút, các biểu tượng bằng cách tổ hợp OR giữa các hằng số: Ví dụ vbOKCancel Or vbExclamation để hiển thị 2 nút OK/Cancel kèm thêm biểu tượng khuyến cáo ….

• Hàm MsgBox luôn trả về một số để cho biết là người dùng vừa click chọn nút nào của hộp thông báo MsgBox. Ví dụ: giá trị trả về là vbOK, vbCancel….

Bài tập 5 a. Hướng dẫn: Việc cộng, trừ, nhân hay chia a với b v.v... còn phụ thuộc vào phép toán (toán tử) mà người dùng nhập vào là gì. Do vậy, để ra quyết định là thực hiện phép toán nào lên 2 toán hạng a và b đó, cần sử dụng cấu trúc Select Case để kiểm tra toán tử nhập vào. b. Chương trình mẫu:

Private Sub Form_Load() Dim a As Single, b As Single, KetQua As Single Dim PhepToan As String a = InputBox("NhËp sè h¹ng thø nhÊt: ") PhepToan = InputBox("NhËp vµo phÐp to¸n (+,-,*,/,mod,div,^)") b = InputBox("NhËp sè h¹ng thø hai: ") Select Case PhepToan Case "+": KetQua = a + b Case "-" KetQua = a - b Case "*": KetQua = a * b Case "/": KetQua = a / b Case "div": KetQua = a \ b Case "mod": KetQua = a Mod b Case "^": KetQua = a ^ b

Page 8: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 8

Case Else: MsgBox "T«i kh«ng hiÓu phÐp to¸n nµy !", vbExclamation, "NhËp sai" End Select MsgBox "KÕt qu¶ cña " & a & PhepToan & b & " lµ : " & KetQua End Sub

Thực hiện các phép toán cơ bản dùng cấu trúc Select Case

C. Ghi chú : các phép chia nguyên và chia dư trong VB:

• Phép chia \ là phép chia lấy phần nguyên: Ví dụ 10 \ 3 = 3. Phép chia / là phép chia thông thường (lấy cả phần nguyên và phần dư), ví dụ: 5 / 2 = 2.5.

• Phép mod là chia lấy phần dư, ví dụ 10 mod 3 = 1, 6 mod 4 = 2 v.v… Bài tập 6 a. Hướng dẫn: S là tổng các số hạng thứ i, với i chạy từ 1 đến N, Số hạng tổng quát là i. Do vậy để tính tổng của dãy số S, có thể sử dụng một trong 3 loại vòng lặp đã biết. b. Chương trình mẫu (Gõ đoạn mã trong thủ tục Form_Load)

Cách 1: Sử dụng vòng lặp For Dim i As Integer Dim N As Integer Dim S As Long N=Inputbox("Nhập số N (N>0) : ") S = 0 For i=1 To N S = S + i ‘///S = S + <Số hạng tổng quát> Next

Msgbox "Tổng = " & S

Cách 2: Sử dụng vòng lặp Do...Loop Until Dim i As Integer Dim N As Integer Dim S As Long N=Inputbox("Nhập số N (N>0) : ") S = 0 i = 1 Do S = S + i i = i + 1 Loop UNTIL i > N

Msgbox "Tổng = " & S

Cách 3 : Dùng vòng lặp Do While ... Loop Dim i As Integer Dim N As Integer Dim S As Long N=Inputbox("Nhập số N (N>0) : ") S = 0 i = 1 Do While i <= N

Page 9: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 9

S = S + i i = i + 1 Loop

Msgbox "Tổng = " & S Bài tập 7 a. Hướng dẫn: Có nhiều cách tính nhưng trong trường hợp này có thể sử dụng vòng lặp For kết hợp với điều khoản Step: b. Chương trình mẫu:

Private Sub Form_Load() Dim i As Integer, S As Long S = 0 For i = 2 To 100 Step 2 S = S + i Next MsgBox "Tæng c¸c sè ch½n tõ 1->100 lµ : " & S End Sub

c. Ghi chú:

• Nếu không có điều khoản Step thì sau mỗi lần lặp biến chạy i tự động được tăng lên 1 đơn vị. Còn nếu có điều khoản Step 2 thì sau mỗi lần lặp, biến chạy i được tăng lên 2 đơn vị. Tổng quát, nếu Step N (N nguyên âm hoặc dương) thì sau mỗi lần lặp, biến chạy được tăng (nếu N > 0) hay giảm đi (Nếu N<0) n đơn vị.

• Nếu cho i chạy từ 1 (For i = 1 TO 100…) thì kết quả cho ta là tổng các số lẻ . Bài tập 8 a. Hướng dẫn: Thông thường trong VB, với vòng lặp For thì cứ sau mỗi lần lặp biến chạy tự động được tăng lên 1 đơn vị. Tuy nhiên, trong một số trường hợp ta muốn biến chạy thay đổi theo chiều giảm dần (Tương tự như For… Downto … của Pascal), tức là sau mỗi lần lặp thì biến chạy lại bị giảm đi một đơn vị thì cần phải sử dụng đến điều khoản Step N với N là một số âm. Nếu muốn sau mỗi vòng lặp biến chạy i giảm đi một đơn vị thì ta cần viết : For i = N to 1 Step -1 b. Chương trình mẫu:

Private Sub Form_Load() Dim i As Integer

For i = 100 To 1 Step -1 Debug.Print i

Next End Sub

Bài tập 9 a. Hướng dẫn: Vì không biết người dùng nhập bao nhiêu số do vậy ta có thể dùng vòng lặp không xác định để tiến hành công việc nhập. Ngoài ra, cũng cần có 2 biến để lưu tổng các số âm và dương. Điều kiện kết thúc vòng lặp sẽ là n=0.

Page 10: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 10

b.Giải mẫu:

Private Sub Form_load() Dim n As Long, i As Long Dim TongAm As Long Dim TongDuong As Long TongAm = 0 '/// Khëi t¹o tr−íc khi tÝnh tæng TongDuong = 0 '/// Khëi t¹o tr−íc khi tÝnh tæng Do n = InputBox("NhËp vµo mét sè nguyªn : ") If n > 0 Then TongDuong = TongDuong + n Else TongAm = TongAm + n End If Loop Until n = 0 '/// Lặp cho đến khi nào nhập n = 0 thì dừng. MsgBox "Tæng c¸c sè ©m = " & TongAm & ". Tong c¸c sè d−¬ng = " & TongDuong End Sub

c. Ghi chú:

• Vòng lặp Do …. Loop Until <ĐK> sẽ kết thúc khi điều kiện <ĐK> bằng true • Vòng lặp Do…Loop Until khác với vòng lặp dạng Do….Loop While <ĐK> ở

chỗ vòng lặp Do…Loop While <ĐK> kết thúc khi <ĐK> vẫn là False. • Thực chất, cấu trúc lặp Do…Loop Until và Do … Loop While là tương

đương nhau, do vậy để tránh nhầm lẫn chúng ta chỉ nên nhớ một loại khi thực hành.

• Có thể thoát khỏi vòng lặp dạng Do… Loop bằng câu lệnh Exit Do Bài tập 10 a. Hướng dẫn: Vì không thể biết được là sau bao nhiêu năm thì tổng số tiền sẽ là 2.000.000, mà chỉ biết rằng mỗi năm sẽ tăng thêm một lượng nào đó. Do vậy, ở đây ta sẽ sử dụng vòng lặp không xác định và mỗi lần lặp ta sẽ kiểm tra xem đã được số tiền cần thiết hay chưa? Nếu đủ rồi thì thoát và số lần thử chính là số năm cần tìm. Nhưng ở đây tại sao ta lại sử dụng vòng lặp Do While…Loop mà không là Do …Loop ?. Sở dĩ sử dụng vòng lặp Do While … Loop là vì rằng số tiền gửi vào ban đầu đã rất có thể lớn hơn số tiền kỳ vọng ! b. Chương trình mẫu:

Private Sub Form_Load() Dim SoNam As Integer, TongTien As Long SoNam = 0 TongTien = 1000000 Do While TongTien < 2000000 SoNam = SoNam + 1 TongTien = (1 + 0.05) ^ SoNam * TongTien ‘/// C«ng thøc cÇn nhí Loop MsgBox "CÇn ph¶i göi trong " & SoNam & " n¨m !" End Sub

c. Ghi chú: Đây là bài toán tính tiền gửi tiết kiệm, GDP có thể áp dụng trong cuộc sống

Page 11: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 11

Bài tập 11 a. Hướng dẫn: Một số N được gọi là số nguyên tố nếu như nó chỉ chia hết cho 1 và chính nó. Hay nói cách khác là số N không là nguyên tố nếu như nó chia hết cho ít nhất một số nằm trong khoảng [2…N-1]. Như vậy, để kiểm tra ta chỉ cần duyệt tất cả các số i trong phạm vi từ [2…N-1] xem N mod i = 0 ?, nếu xảy ra thì kết luận ngay rằng N không là nguyên tố, trái lại nếu sau khi đã duyệt hết mà không thấy trường hợp đó xảy ra thì kết luận N là nguyên tố. Người ta đã chứng minh được rằng không cần phải duyệt từ [2…N-1] mà chỉ cần duyệt trong phạm vi hẹp hơn là từ ]..2[ N .

b. Chương trình mẫu:

Private Sub Form_Load()

Dim n As Integer, i As Integer, KetQua As Boolean

n = InputBox("NhËp vµo mét sè nguyªn ")

KetQua = True

For i = 2 To Sqr(n)

If n Mod i = 0 Then

KetQua = False

Exit For ‘/// Tho¸t ngay khái vßng lÆp For

End If

Next

If KetQua = True Then MsgBox n & “ lµ sè nguyªn tè !”

If KetQua = False Then MsgBox n & “ kh«ng ph¶i lµ sè nguyªn tè !”

End Sub

c. Ghi chú:

• Để thoát vô điều kiện khỏi vòng lặp Do While…, Do…Loop While hay Do … Loop Until thì cần gọi lệnh Exit Do

• Hàm Sqr(n) trong VB dùng để tính n (không phải là tính bình phương như trong một số ngôn ngữ lập trình khác – như Pascal).

• Nếu công việc gì chỉ làm một lần (ví dụ thông báo kết quả như trên) thì “KHÔNG BAO GIỜ” được đặt trong vòng lặp mà phải đặt ở ngoài vòng lặp. Vì đặc điểm của vòng lặp là “lặp đi lặp lại” nhiều lần một công việc !

Bài tập 12 a. Hướng dẫn: Giai thừa của số N được tính theo công thức N!=1.2.3…N-1.N. Để tính toán ta thực hiện nhân dồn các số i ( i = 1 ÷ N) vào kết quả. b. Chương trình mẫu:

Private Sub Form_Load() Dim n As Integer, i As Integer, KetQua As Long

Page 12: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 12

'/// NhËp sè n, ®¶m b¶o 0<n<10 Do n = InputBox("CÇn tÝnh giai thõa cña mÊy : ") Loop Until (0 < n And n < 10) '/// Sö dông vßng lÆp For KetQua = 1 For i = 1 To n KetQua = KetQua * i Next Debug.Print "KÕt qu¶ cña " & n & "! = " & KetQua '/// Sö dông vßng lÆp Do While KetQua = 1 i = 1 Do While i <= n KetQua = KetQua * i i = i + 1 Loop Debug.Print "KÕt qu¶ cña " & n & "! = " & KetQua '/// Sö dông vßng lÆp Do Until KetQua = 1 i = 1 Do Until i > n KetQua = KetQua * i i = i + 1 Loop Debug.Print "KÕt qu¶ cña " & n & "! = " & KetQua '/// Sö dông vßng lÆp Do ... Loop While i = 1 KetQua = 1 Do KetQua = KetQua * i i = i + 1 Loop While i <= n Debug.Print "KÕt qu¶ cña " & n & "! = " & KetQua '/// Sö dông vßng lÆp Do ... Loop Until i = 1 KetQua = 1 Do KetQua = KetQua * i i = i + 1 Loop Until i > n Debug.Print "KÕt qu¶ cña " & n & "! = " & KetQua End Sub

c. Ghi chú:

• Có thể tính N! bằng phương pháp đệ qui : GiaiThua = GiaiThua (n-1) * N. • Người ta đã chứng minh được rằng tất các cấu trúc lặp đều có thể viết tương

đương theo các cấu trúc khác. • Trong VB có rất nhiều cấu trúc lặp, tuy nhiên chỉ cần thuộc 3 cấu trúc sau là đủ:

o For …

Page 13: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 13

o Do ……… Loop Until <ĐK>

o Do While <ĐK> …….. Loop

• Cấu trúc Do While <ĐK> … Loop và Do Until <ĐK>…. Loop cùng có điểm giống nhau là kiểm tra điều kiện trước khi lặp (giống như cấu trúc While …do trong Pascal hay While trong C/C++) nhưng cấu trúc Do While <ĐK> … Loop chỉ lặp khi điều kiện <ĐK> vẫn đúng, còn cấu trúc Do Until <ĐK>…. Loop chỉ lặp khi điều kiện <ĐK> vẫn sai (Hay thoát nếu <ĐK> là đúng).

• Cấu trúc Do … Loop While <ĐK> và cấu trúc Do … Loop Until <ĐK> cùng giống nhau là thực hiện lặp sau đó mới kiểm tra điều kiện (Giống cấu trúc Repeat … Until trong pascal hay do … While trong C/C++), nhưng cấu trúc Do … Loop While <ĐK> chỉ lặp nếu điều kiện vẫn còn đúng, trong khi đó cấu trúc Do … Loop Until <ĐK> chỉ lặp nếu biểu thức điều kiện vẫn còn sai (Hay nói cách khác là kết thúc lặp nếu điều kiện lặp là đúng)

• Khi thực hành, không nhất thiết phải nhớ cả 4 kiểu lặp đã nêu ở trên mà bạn nên vận dụng thành thạo 3 cấu trúc lặp được khuyến cáo dùng là For, Do While và Do … Loop Until, vì 3 cấu trúc này tương tự như các cấu trúc lặp trong một số ngôn ngữ lập trình phổ biến khác (For,While…do,Repeat ..Until).

Bài tập 13 a. Hướng dẫn: Ta có thổng S = S1 + S2 + S3, với S1, S2, S3 tương ứng với 3 tổng trên. Sử dụng vòng lặp để tính tổng của mỗi Si, sau đó cộng lại để được kết quả. b. Chương trình mẫu:

Private Sub form_load() Dim i As Integer Dim Tong As Long Dim S1 As Long, S2 As Long, S3 As Long Tong = 0 ' §Çu tiªn do ch−a tÝnh nªn Tong b»ng 0

S1 = 0 S2 = 0 S3 = 0 '/// TÝnh tæng S1 For i = 1 To 8 S1 = S1 + i ^ 2 Next '/// TÝnh tæng S2 For i = 100 To 200 S2 = S2 + i ^ 2 Next '/// TÝnh tæng S3 For i = 300 To 310 S3 = S3 + i ^ 2 Next S = S1 + S2 + S3 MsgBox "Tæng lµ : " & Tong, vbInformation, "Th«ng b¸o ..."

End Sub

Page 14: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 14

Bài tập 14: a. Hướng dẫn: Công thức tính giai thừa của số N là: N! = 1.2.3…N-1.N, như vậy ở đây ta cần nhân liên tiếp các số i (i chạy từ 1 đến n) vào kết quả. Trong đó, giá trị khởi tạo cho kết quả là 1. Bài này có thể giải theo cách đệ qui hoặc không đệ qui. b. Chương trình mẫu

Cách 1: Dùng vòng lặp (Không dùng đệ qui)

Private Sub Form_Load() Dim i As Integer, n As Integer Dim KetQua As Long

'/// NhËp sè n (0<n<20) Do n = InputBox("NhËp sè N : ", "TÝnh giai thõa") Loop Until (0 < n And n < 20)

KetQua = 1 For i = 1 To n KetQua = KetQua * i Next

MsgBox n & " ! bằng " & KetQua End Sub

Cách 2: Dùng đệ qui '/// Hμm ®Ö qui tÝnh N ! Function GiaiThua(ByVal N As Integer) As Long If N = 1 Then GiaiThua = 1 Else GiaiThua = GiaiThua(N - 1) * N End If End Function Private Sub Form_Load() Dim i As Integer, N As Integer Dim KetQua As Long '/// NhËp sè n (0<n<20) Do N = InputBox("NhËp sè N : ", "TÝnh giai thõa") Loop Until (0 < N And N < 20) MsgBox N & " ! bằng " & GiaiThua(N) End Sub

Page 15: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 15

Bài tập 15: a. Hướng dẫn: Với bài toán dạng tính tổng của một chuỗi số khi biết số hạng tổng quát Si, nói chung là đơn giản. Có thể thực hiện theo giải thuậ như sau: S = 0 For i = i0 TO in S = S + Si Next Với mỗi dãy khác nhau thì giá trị i0, N, Si có thể khác nhau và cần phải xác định.

- Giá trị i0 và N thường xác định bởi giải phương trình Si = S0 và Si = Sn - Số hạng tổng quát Si thường có thể nhìn thấy ngay trong đề bài.

Trong bài này:

- )1(* ++= iniSi

- Xác định i0: Cho S0 = Si ⇔ 2*1 +n = )1(* ++ ini ⇒ i0=1

- Xác định in: Cho Sn = Si ⇔ )1(* ++ nnn = )1(* ++ ini ⇒ in=n

b. Chương trình mẫu:

Private Sub Form_Load() Dim S As Single, i As Integer, N As Integer N = InputBox("NhËp sè N : ") S = 0 For i = 1 To N S = S + i * Sqr(N + (i + 1)) Next MsgBox "Tæng cña d·y ®· cho lµ : " & S End Sub

Bài tập 16 a. Hướng dẫn: Với các bài toán được định nghĩa theo kiểu đệ qui thì cách giải phù hợp và dễ nhất là theo giải thuật qui. Tuy nhiên, tốc độ bị chậm đáng kể khi số N lớn, ngoài ra còn có thể bị tràn Stack. b. Chương trình mẫu:

'/// TÝnh d·y Fibonasi dïng §Ö qui Function Fib_Dequi(ByVal N As Integer) As Long If N = 0 Or N = 1 Then Fib_Dequi = 1 If N > 1 Then Fib_Dequi = Fib_Dequi(N - 2) + Fib_Dequi(N - 1) End Function '/// TÝnh d·y Fibonasi KH¤NG dïng §Ö qui Function Fib_KhongDequi(ByVal N As Integer) As Long Dim i As Integer Dim F1 As Long, F2 As Long, KetQua As Long F1 = 1 F2 = 1 KetQua = 1

Page 16: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 16

i = 2 Do While i <= N KetQua = F1 + F2 F1 = F2 F2 = KetQua i = i + 1 Loop Fib_KhongDequi = KetQua End Function '--------------------------------------------------------------------------------------------------------------------------- '/// Ch−¬ng tr×nh chÝnh Private Sub Form_Load() MsgBox "Fib (30) = " & Fib_Deq ui(30) MsgBox "Fib (30) = " & Fib_KhongDequi(30) End Sub

Chú ý: Riêng với bài toán này, người ta còn có thể giải bằng phương pháp qui hoạch động (Dynamic Programming) rất đơn giản như sau:

Function Fib_DynamicPrgramming(ByVal N As Integer) As Long Dim i As Integer Dim F(1000) As Long '/// B¶ng chøa gi¸ trÞ ®· tÝnh to¸n ®−îc ë b−íc trung gian '/// §iÓm xuÊt ph¸t F(0) = 1 F(1) = 1 For i = 2 To N F(i) = F(i - 2) + F(i - 1) Next Fib_DynamicPrgramming = F(N) End Function

Bài tập 17: a. Hướng dẫn: Để tìm ước số chung lớn nhất của 2 số nguyên a và b, người ta có thể dựa vào công thức Ơ-Le và cài đặt bằng vòng lặp hoặc đệ qui. Việc tìm ước số chung được ứng dụng vào tối giản phân số. b. Chương trình mẫu:

'/// T×m USCLN kh«ng dïng ®Ö qui Function USCLN(a As Integer, b As Integer) As Integer Dim Du As Integer

Du = a Mod b

Do While Du <> 0 a = b b = Du Du = a Mod b Loop

USCLN = b

End Function

Page 17: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 17

'/// T×m USCLN b»ng §Ö qui Function USCLN_Dequi(a As Integer, b As Integer) As Integer If a Mod b = 0 Then USCLN_Dequi = b Else USCLN_Dequi = USCLN_Dequi(b, a Mod b) End If End Function '----------------------------------------------------------------------------------------------------------------------------- '/// Ch−¬ng tr×nh chÝnh Private Sub Form_Load()

MsgBox "−íc sè chung lín nhÊt cña 20 vµ 30 lµ : " & USCLN(20, 30)

MsgBox "−íc sè chung lín nhÊt cña 20 vµ 30 lµ : " & USCLN_Dequi(20, 30)

End Sub

Bài tập 18: a. Hướng dẫn: Phân số dạng a/b được gọi là tối giản nếu Ước số chung lớn nhất của a và b là 1. Ví dụ: phân số 5/7 và 9/7 là tối giản; 4/6 và 6/4 là chưa tối giản. b. Chương trình mẫu:

'/// T×m −íc sè chung lín nhÊt cña 2 sè a vμ b Function USCLN(a As Integer, b As Integer) As Integer If a Mod b = 0 Then USCLN = b Else USCLN = USCLN(b, a Mod b) End If End Function '----------------------------------------------------------------------------------------------------------------------------- '/// Ch−¬ng tr×nh chÝnh Private Sub Form_Load()

Dim a As Integer, b As Integer, TuMoi As Integer, MauMoi As Integer

a = InputBox("NhËp tö sè : ")

b = InputBox("NhËp mÉu sè : ")

If USCLN(a, b) = 1 Then

MsgBox "Ph©n sè " & a & "/" & b & " ®· tèi gi¶n", vbInformation

Else TuMoi = a / USCLN(a, b) ‘/// TÝnh l¹i tö sè míi MauMoi = b / USCLN(a, b) ‘/// TÝnh l¹i mÉu sè míi MsgBox "Ph©n sè sau khi tèi gi¶n lµ : " & TuMoi & "/" & MauMoi End If End Sub

Bài tập 19: a. Hướng dẫn: Trước hết cần xây dựng hàm kiểm tra xem số N có phải là nguyên tố hay không ? Sau đó sử dụng kết quả này vào giải quyết yêu cầu bài toán. b. Chương trình mẫu:

Page 18: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 18

'/// Hμm kiÓm tra xem sè N cã ph¶i lμ sè nguyªn tè hay kh«ng ? Function LaSoNguyenTo(ByVal n As Integer) As Boolean Dim i As Integer LaSoNguyenTo = True For i = 2 To Round(Sqr(n)) If n Mod i = 0 Then LaSoNguyenTo = False Exit Function End If Next End Function '----------------------------------------------------------------------------------------------------------------------------- '/// Ch−¬ng tr×nh chÝnh Private Sub Form_Load() Dim i As Integer, n As Integer, DaySo(100) As Integer n = InputBox("Sè phÇn tö cÇn nhËp : ", , 10) For i = 1 To n DaySo(i) = InputBox("NhËp sè thø " & i) Next For i = 1 To n If LaSoNguyenTo(DaySo(i)) Then Debug.Print DaySo(i) Next End Sub

Bài tập 20 a. Hướng dẫn:

Để đếm số ký tự a và A trong một xâu S, chúng ta cần duyệt và kiểm tra lần lượt từng ký tự nằm trong xâu S và so sánh với ký tự a và A. Để duyệt (lấy từng ký tự trong xâu S) chúng ta có thể sử dụng một trong 3 loại vòng lặp. Hàm Mid(S,i,1) cho ta ký tự tại vị trí thứ i trong xâu S. b. Chương trình mẫu (Sử dụng vòng lặp Do While):

Form_load() Dim S As String Dim TongAa As Integer Dim i As Integer

S = InputBox("B¹n h·y nhËp mét x©u : ")

i = 1 'B¾t ®Çu tõ ký tù thø nhÊt TongAa = 0 'Khëi t¹o sè ký tù A hoa vμ a th−êng ban ®Çu b»ng 0. Do While i <= Len(S) If Mid(S, i, 1) = "A" Or Mid(S, i, 1) = "a" Then TongAa = TongAa + 1 End If i = i + 1 ‘/// Chuyển đến vị trí của ký tự tiếp theo Loop MsgBox "Tæng sè ký tù a vµ A trong x©u lµ " & TongAa & " ký tù" End Sub

Page 19: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 19

C. Ghi chú: Trong vòng lặp For thì biến chạy sẽ được tự động tăng lên 1 đơn vị, còn trong vòng lặp Do While ... Loop và Do...Loop biến chạy không tự động tăng lên 1, do vậy ta phải tự thực hiện tăng biến chạy lên 1 đơn vị bằng câu lệnh i = i + 1 như bài tập ở trên. Bài tập 21:

a. Hướng dẫn: Tổng S chính là tổng của các số hạng thứ i, với Si = nixi

+ (Đây là số

hạng tổng quát) và i chạy từ 0 đến N. Do vậy để tính tổng chúng ta cần sử dụng một trong 3 loại vòng lặp đã học. b. Chương trình mẫu: (Sử dụng vòng lặp For, bạn hãy thực hiện với vòng lặp

do...While và do...Loop)

Private Sub Form_Load() Dim i As Integer, N As Integer, x As Single Dim S As Single '///////// NhËp x vμ n //////////////////////// x = InputBox("NhËp vµo sè x : ") N = InputBox("NhËp vµo sè n : ") S = 0 '// Khëi t¹o tæng S = 0 For i = 0 To N S = S + x ^ i / (i + 1) ‘/// Nói chung là : S = S + <Số hạng tổng quát> Next MsgBox "Tæng S = " & S, vbInformation, "TÝnh tæng chuçi" End Sub

Chú ý: Khi tính tổng của một dãy số bất kỳ, việc khó khăn nhất là phải xác định được số hạng tổng quát Si, sau đó là cận dưới và cận trên của vòng lặp. Còn tổng thì thường tính theo công thức : S = S + Si Bài tập 22 a. Hướng dẫn: Trước hết cần khai báo một mảng nguyên, sau đó hỏi người dùng xem muốn nhập bao nhiêu số và sử dụng vòng lặp để tiến hành nhập dữ liệu cho mảng. Để tìm số lớn nhất, thông thường ta giả định là phần tử đầu tiên. Sau đó dùng vòng lặp để duyệt qua các phần tử còn lại và so sánh, nếu số đang xét lớn hơn số giả định thì ta lại thay đổi giá trị của số giả định bằng phần tử đang xét. b. Chương trình mẫu:

Private Sub Form_Load() Dim i As Integer, N As Integer Dim MAX As Integer Dim A(100) As Integer 'Khai b¸o m¶ng A cã 101 phÇn tö '///////// NhËp sè phÇn tö n N = InputBox("B¹n cÇn nhËp bao nhiªu sè: ")

Page 20: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 20

For i = 1 To N A(i) = InputBox("NhËp vµo sè thø " & i) Next '/////// T×m sè lín nhÊt trong N sè võa nhËp /////////////////////// MAX = A(1) '///Gi¶ ®Þnh phÇn tö lín nhÊt lμ phÇn tö A(1) For i = 1 To N If A(i) > MAX Then MAX = A(i) Next MsgBox "PhÇn tö lín nhÊt lµ : " & MAX End Sub

C. Ghi chú: ở trên chúng ta đã khai báo mảng A(100) và như vậy phần tử đầu tiên là A(0), nhưng khi nhập ta lại cho i chạy từ 1, tức là không sử dụng phần tử A(0). Đây là thói quen sử dụng của mỗi người. Bạn có thể sử dụng A(0) hay không là tuỳ, còn nếu sử dụng A(0) thì vòng lặp trên sẽ có dạng : For i= 0 to N - 1 ....

Bài tập 23 a. Hướng dẫn: Cần phải tìm ra số lớn nhất, kí hiệu là MAX, sau đó hiển thị những phần tử có giá trị bằng với MAX vừa tìm được. b. Chương trình mẫu:

Private Sub Form_Load() Dim i As Integer, MAX As Integer Dim DS(100) As Integer, N As Integer '/// NhËp c¸c sè N = InputBox("NhËp sè phÇn tö : ") For i = 1 To N DS(i) = InputBox("NhËp sè thø " & i) Next '/// T×m sè lín nhÊt c¸c sè võa nhËp MAX = DS(1) For i = 1 To N If MAX < DS(i) Then MAX = DS(i) Next '/// HiÓn thÞ nh÷ng phÇn tö b»ng víi MAX (chÝnh lµ nh÷ng ptö lín nhÊt) For i = 1 To N If DS(i) = MAX Then Debug.Print DS(i) Next End Sub

C. Ghi chú:

• Có thể áp dụng để giải bài toán tìm số nhỏ nhất, in ra các số nhỏ nhất v.v… • Trong danh sách không phải chỉ có duy nhất một phần tử lớn nhất (nhỏ nhất)

Bài tập 24 a. Hướng dẫn: Để sắp xếp một dãy số A có N phần tử ta tiến hành như sau:

• Bắt đầu từ phần tử đầu tiên

Page 21: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 21

• Tại vị trí (phần tử) thứ i trong mảng A, Ta xét tất cả các số từ thứ i+1 đến N xem có số nào nhỏ hơn phần tử thứ i đang xét hay không. Nếu có phần tử A(j) nào đó nhỏ hơn A(i) thì hoán đổi giá trị của A(i) Cho A(j). Để hoán đổi A(i) với A(j) ta thực hiện như sau:

o TrungGian = A(i) o A(i) = A(j) o A(j) = TrungGian

• Lặp lại đối với các phần tử A(i) cho đến khi nào i >= N thì dừng.

b. Chương trình mẫu:

Private Sub Form_Load() Dim i As Integer, N As Integer, TrungGian As Integer Dim A(100) As Integer 'Khai b¸o m¶ng A cã 101 phÇn tö '///////// NhËp sè phÇn tö N vμ nhËp d÷ liÖu cho m¶ng A N = InputBox("B¹n cÇn nhËp bao nhiªu sè: ") For i = 1 To N A(i) = InputBox("NhËp vµo sè thø " & i) Next '/////// S¾p xÕp m¶ng A theo chiÒu t¨ng dÇn /////////////////////// For i = 1 To N - 1 '///DuyÖt tõng phÇn tö tõ 1 ®Õn N-1 For j = i + 1 To N '///KiÓm tra c¸c phÇn tö cßn l¹i ®øng sau phÇn tö thø i If A(j) < A(i) Then '///Nếu nhỏ hơn số i thi` Ho¸n ®æi A(i) víi A(j) TrungGian = A(i) A(i) = A(j) A(j) = TrungGian End If Next Next Debug.Print "D·y sau khi s¾p xÕp " For i = 1 To N Debug.Print A(i) Next End Sub

Chú ý: • Thuật toán sắp xếp ở trên thường xuyên được sử dụng trong các bài toán

không đòi hỏi nhiều về tốc độ và nó có thể áp dụng để sắp xếp một danh sách tổng quát (cả số và xâu), do vậy chúng ta cần nắm vững thuật toán này.

• Nếu muốn sắp xếp danh sách theo chiều giảm dần thì chỉ việc thay câu lệnh If A(j) < A(i) Then … Thành If A(j) > A(i) Then ….

Bài tập 25 a. Hướng dẫn: Về bản chất, giải thuật Quick_Sort sử dụng phương pháp “Chia để trị” (Deive and Conquer). Có thể mô tả thô thuật toán này như sau:

- Chọn một vị trí K ở giữa (Không nhất thiết là chính giữa) của danh sách L. - Duyệt từng phần tử và xét: Nếu phần tử L[i] < L[k] thì cho vào danh sách con

L1, còn nếu L[i] >= L[k] thì cho vào danh sách L2. Kết quả ta được: L = L1 ∪ L[k] ∪ L2, Trong đó L[k] ở vị trí đúng. Tiếp tục thực hiện đệ qui với L1 và L2… Do L hữu hạn nên thuật toán sẽ dừng. Độ phức tạp của thuật toán này trung bình vào cỡ O(n) = n.Log2n.

Page 22: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 22

b. Chương trình mẫu:

'/// Thñ tôc t¸ch danh s¸ch thμnh 2 danh s¸ch con vμ 1 vÞ trÝ ®óng (Chèt-K) Sub TachDanhSach(DS() As Integer, ByVal L As Integer, ByVal R As Integer, K As Integer) Dim i As Integer, j As Integer, Tam As Integer i = L j = R Do While i < j Do While DS(j) > DS(i) j = j - 1 Loop Do While (DS(i) <= DS(L)) And (i < j) i = i + 1 Loop If (j > i) Then Tam = DS(i) DS(i) = DS(j) DS(j) = Tam End If Loop K = j Tam = DS(L) DS(L) = DS(j) DS(j) = Tam End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Thùc hiÖn s¾p xÕp Quick_Sort Private Sub Quick_Sort(ByRef DS() As Integer, ByVal L As Integer, ByVal R As Integer) Dim K As Integer If R > L Then TachDanhSach DS, L, R, K Quick_Sort DS, L, K - 1 Quick_Sort DS, K + 1, R End If End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Ch−¬ng tr×nh chÝnh Private Sub Form_Load() Dim i As Integer, n As Integer, DaySo(100) As Integer

n = InputBox("Sè phÇn tö cÇn nhËp : ", , 10)

For i = 1 To n DaySo(i) = InputBox("NhËp sè thø " & i) Next Debug.Print "D·y sè sau khi s¾p xÕp lµ : " & vbCrLf Quick_Sort DaySo, 1, n For i = 1 To n Debug.Print DaySo(i) Next End Sub

Page 23: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 23

c. Ghi chú:

• Trong phần khai báo hàm và thủ tục, nếu trước tham số hình thức không có từ khoá byref đứng trước thì VB hiểu đó là tham biến (tham chiếu).

• Tham số hình thức trong phần khai báo chương trình con là một mảng thì phải viết dưới dạng như sau: <Tên> () As <Kiểu cơ bản>, Cách viết: A (10) As integer hay A (1 to 10) As String v.v… là sai !.

• Giải thuật Quick_Sort thực hiện tương đối nhanh khi n lớn. Người ta gọi giải thuật sắp xếp Quick_Sort và một số giải thuật sắp xếp nhanh khác (như Merge sort, Heap sort…) thuộc phương pháp sắp “Công nghiệp”, do vậy cần phải nhớ và vận dụng thành thạo giải thuật này.

Bài tập 26 a. Hướng dẫn: Ý tưởng của giải thuật này là dùng mảng một chiều để biểu diễn cây nhị phân. Sau đó tinh chỉnh dần các cây con đã được sắp xếp để cho kết quả cuối cùng. b. Chương trình mẫu '/// Thñ tôc ho¸n ®æi gi¸ trÞ cña 2 biÕn a vμ b cho nhau (sÏ sử dông trong ch−¬ng tr×nh) Sub Swap(a As Integer, b As Integer) Dim Tam As Integer Tam = a a = b b = Tam End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Thñ tôc ®iÒu chØnh l¹i c©y con b¾t ®Çu tõ nót i ®Ó nã trë thμnh mét ®èng (Heap) '/// §iÒu chØnh t¹i nót i cña c©y DS, cã N phÇn tö Sub DieuChinhNut(i As Integer, N As Integer, DS() As Integer) Dim R As Integer If i > (N \ 2) Then Exit Sub '/// So s¸nh con tr¸i vμ con ph¶i cña nót i, nÕu con nμo lín h¬n th× '/// R sÏ l−u vÞ trÝ cña con ®ã R = 2 * i '/// Gi¶ sö con tr¸i lín h¬n If (R + 1 <= N) And (DS(R) < DS(R + 1)) Then R = R + 1 If DS(i) < DS(R) Then '//NÕu nót cha i nhá h¬n th× tr¸o ®æi l¹i gi¸ trÞ ®Ó tho¶ m·n lμ Heap Call Swap(DS(i), DS(R)) Call DieuChinhNut(R, N, DS) '/// cÇn ph¶i ®iÒu chØnh l¹i nót R sau khi ho¸n ®æi End If End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// ®iÒu chØnh toμn bé N nót cña c©y (Danh s¸ch) ®Ó toμn bé c©y tho¶ m·n lμ Khèi Heap Sub DieuChinhToanBo(N As Integer, DS() As Integer) Dim i As Integer For i = N \ 2 To 1 Step -1

Call DieuChinhNut(i, N, DS)

Next End Sub

Page 24: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 24

'/// Thùc hiÖn HeapSort Sub Heap_Sort(N As Integer, DS() As Integer) Dim i As Integer DieuChinhToanBo N, DS For i = N To 2 Step -1 Swap DS(1), DS(i) DieuChinhNut 1, i - 1, DS Next End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Ch−¬ng tr×nh chÝnh Private Sub Form_Load() Dim i As Integer, N As Integer, DaySo(100) As Integer N = InputBox("Sè phÇn tö cÇn nhËp : ", , 10) For i = 1 To N DaySo(i) = InputBox("NhËp sè thø " & i) Next Debug.Print "D·y sè sau khi s¾p xÕp lµ : " & vbCrLf Heap_Sort N, DaySo For i = 1 To N Debug.Print DaySo(i) Next End Sub

c. Ghi chú:

• Toán tử “\” để thực hiện phép chia lấy phần nguyên. • Khi gọi hàm hay thủ tục có thể thêm từ khoá Call hoặc không, nhưng khi có từ

khoá Call thì các tham số phải được đặt trong ngoặc đơn như trên. • Một cây nhị phân có thể biểu diễn bằng mảng một chiều, trong đó nút con trái

của nút i có chỉ số là i*2 và nút con phải là i*2 + 1. Nút cha của nút i có chỉ số là i \ 2.

Bài tập 27 a. Hướng dẫn: Việc sắp xếp có thể thực hiện thông qua giải thuật sắp xếp đơn giản có độ phức tạp tính toán n2. (Áp dụng thuật toán đã sử dụng trong bài tập 12) b. Chương trình mẫu:

Private Sub Form_Load() Dim DanhSach(100) As String ‘// Mảng lưu danh sách tên của lớp Dim SoSV As Integer '//Số Sinh viên nhập vào Dim i As Integer SoPT = InputBox("Bạn cần nhập tên của bao nhiêu người : ") For i = 1 To SoSV DanhSach(i) = InputBox("Nhập tên của người thứ " & i) Next Dim j As Integer, TrungGian As String '/// Sắp xếp tăng dần bằng 1 thuật toán đơn giản (dùng với số pt ít)

Page 25: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 25

For i = 1 To SoSV- 1 For j = i + 1 To SoSV If DanhSach(j) < DanhSach(i) Then TrungGian = DanhSach(i) DanhSach(i) = DanhSach(j) DanhSach(j) = TrungGian End If Next Next '/// Hiển thị danh sách vừa sắp xếp ra cửa sổ Immediate '/// Nhấn Ctrl-G để hiển thị cửa sổ này For i = 1 To SoSV Debug.Print DanhSach(i) Next End Sub

c. Ghi chú: Có thể áp dụng giải thuật Quic_Sort và Heap_Sort ở các bài tập trước để thực hiện sắp xếp trên danh sách ở dạng xâu ký tự. Bài tập 28: a. Hướng dẫn: Sử dụng các hàm thao tác xâu ký tự.

• Hàm Trim(S) trả về xâu S nhưng không có dấu trắng ở 2 đầu (Lưu ý: Bản thân xâu S không bị thay đổi).

• Hàm Replace(S, Sc, Sm) : Hàm thay thế tất cả các xâu con Sc nằm trong xâu cha S bằng xâu Sm.

b. Chương trình mẫu:

'----------------------------------------------------------------------------------------------------------------------------- '/// Hμm chuÈn ho¸ x©u ký tù S. Gi¸ trÞ tr¶ vÒ cho hμm lμ x©u ®−îc chuÈn ho¸ '/// X©u vμo ®−îc truyÒn ë d¹ng tham trÞ. Hμm kh«ng lμm thay ®æi x©u vμo S '----------------------------------------------------------------------------------------------------------------------------- Function ChuanHoa(ByVal S As String) As String '/// Thªm dÊu tr¾ng vμo sau dÊu chÊm "." -> hay dấu “.” = “.” + dấu trắng S = Replace(S, ".", "." & Chr(32)) '//Thªm dÊu tr¾ng vμo sau dÊu ph¶y "," -> hay thay dấu “,” bằng dấu “,” + dấu trắng S = Replace(S, ",", "," & Chr(32)) '/// Thay 2 dÊu tr¾ng b»ng 1 dÊu tr¾ng cho ®Õn khi nμo kh«ng cßn 2 dÊu tr¾ng liÒn nhau Do While InStr(1, S, Chr(32) & Chr(32)) > 0

S = Replace(S, Chr(32) & Chr(32), Chr(32))

Loop '/// C¾t dÊu tr¾ng ë 2 ®Çu x©u S = Trim(S) '/// Tr¶ kÕt qu¶ vÒ cho hμm. (L−u ý: B¶n th©n x©u S kh«ng bÞ thay ®æi khi ra khái hμm) ChuanHoa = S End Function '----------------------------------------------------------------------------------------------------------------------------- '/// Ch−¬ng tr×nh chÝnh Private Sub Form_Load() Dim S As String S = InputBox("H·y nhËp mét x©u ký tù : ") MsgBox "X©u sau khi chuÈn ho¸ lµ : " & ChuanHoa(S) End Sub

Page 26: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 26

c. Ghi chú:

• Vì khi viết dấu trắng (có mã là 32) trong tài liệu rất khó khăn cho người đọc nên ở đây thay vì viết dấu trắng “ “, thì có thể viết là chr(32).

• Có thể dùng Hàm String(N, Ch) để tạo một xâu gồm có N ký tự Ch. Bài tập 29 a. Hướng dẫn:

• Các bước cần làm giống như bài tập 28, ngoài ra còn cần phải thực hiện việc đổi thành chữ cái hoa mỗi ký tự đầu câu và đầu xâu văn bản.

• Khi đã chuẩn hoá theo như bài 28 thì các ký tự cần chuyển thành chữ HOA sẽ nằm ở vị trí của dấu chấm + 2.

b. Chương trình mẫu:

'/// Hμm chuÈn ho¸ x©u ký tù S. Gi¸ trÞ tr¶ vÒ cho hμm lμ x©u ®−îc chuÈn ho¸ '/// X©u vμo ®−îc truyÒn ë d¹ng tham trÞ. Hμm kh«ng lμm thay ®æi x©u vμo S Function ChuanHoa(ByVal S As String) As String Dim i As Integer, S2 As String '/// Thªm dÊu tr¾ng vμo sau dÊu chÊm "." S = Replace(S, ".", "." & Chr(32)) '/// Thªm dÊu tr¾ng vμo sau dÊu ph¶y "," S = Replace(S, ",", "," & Chr(32)) '/// Thay 2 dÊu tr¾ng b»ng mét dÊu tr¾ng cho ®Õn khi nμo kh«ng cßn 2 dÊu tr¾ng liÒn nhau Do While InStr(1, S, Chr(32) & Chr(32)) > 0 S = Replace(S, Chr(32) & Chr(32), Chr(32)) Loop '/// C¾t dÊu tr¾ng ë 2 ®Çu x©u S = Trim(S) '///----------- ChuyÓn ®æi thμnh ký tù HOA ë mçi ®Çu c©u (Sau dÊu ".")----------/// S2 = "" '/// BiÕn ®Ó l−u kÕt qu¶ sau khi chuyÓn thμnh ch÷ c¸i Hoa ®Çu c©u '///KiÓm tra tõng ký tù, nÕu lμ dÊu "." th× chuyÓn ký tù ®øng c¹nh (c¸ch 2 vÞ trÝ) thμnh ch÷ HOA. For i = 1 To Len(S) If (Mid(S, i, 1) = ".") And (i < Len(S)) Then S2 = S2 & "." & Mid(S, i+1, 1) & UCase(Mid(S, i + 2, 1)) i = i + 2 '/// Bá qua vÞ trÝ i+1 vμ i+2 (v× ®· céng vμo kÕt qu¶ S2 ë dßng trªn råi) Else S2 = S2 & Mid(S, i, 1) '/// NÕu kh«ng ph¶i lμ dÊu "." th× céng vμo S2 End If Next '// Còng cÇn chuyÓn ký tù ®Çu v¨n b¶n thμnh ch÷ HOA S2 = UCase(Left(S2, 1)) & Mid(S2, 2) '/// Tr¶ kÕt qu¶ vÒ cho hμm. ChuanHoa = S2 End Function

Page 27: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 27

'----------------------------------------------------------------------------------------------------------------------------- '/// Ch−¬ng tr×nh chÝnh Private Sub Form_Load()

Dim S As String

S = InputBox("H·y nhËp mét x©u ký tù : ")

MsgBox "X©u sau khi chuÈn ho¸ lµ : " & ChuanHoa(S)

End Sub

c. Ghi chú: • Hàm Mid(S,i,n) để lấy n ký tự tại vị trí i của xâu S. Nếu bỏ qua tham số n thì

hàm sẽ trả về các ký tự còn lại từ vị trị i cho đến cuối xâu. Nếu n = 1 thì cho ta ký tự tại vị trí thứ i. (Trong các ngôn ngữ lập trình khác, để lấy ký tự thứ i trong xâu S, ta thường viết S[i] nhưng trong VB phải viết là Mid(S,i,1) )

• Left(S,n) : Trả về n ký tự phía trái của xâu S • Right(S,n) : Trả về n ký tự phía phải của xâu S. • Hàm Ucase(S) : Trả về xâu S nhưng ở dạng chữ HOA • Lcase(S) : Trả về xâu chữ thường của S.

Bài tập 30 a. Hướng dẫn: Ở đây ta cần duyệt lần lượt từng ký tự và kiểm tra, sẽ có 2 khả năng xảy ra. trong quá trình thực hiện, ta sẽ dùng một biến xâu để lưu các số.

• Trường hợp ký tự đang xét là ký tự số thì chỉ việc cộng vào biến xâu hiện tại

• Trường hợp ký tự đang xét không là ký tự số thì xét tiếp: Nếu biến xâu hiện tại không rỗng thì in sau đó xoá xâu đó.

b. Chương trình mẫu

'/// T¸ch c¸c sè ra khái x©u Private Sub Form_Load() Dim S As String, i As Integer, So As String S = InputBox("H·y nhËp mét x©u ký tù : ") So = "" i = 1 Do While i <= Len(S) If ("0"<=Mid(S,i,1)) And (Mid(S,i,1) <= "9") Then '/// NÕu ký tù ®ang xÐt lμ ký tù sè So = So & Mid(S, i, 1) '/// Th× ghÐp vμo sè hiÖn t¹i Else If So <> "" Then '/// §· ®äc hÕt sè đó råi-> in ra mμn h×nh Debug.Print So So = "" '/// Xo¸ ®Ó b¾t ®Çu l−u sè míi End If End If i = i + 1 '/// XÐt ký tù tiÕp theo Loop '/// In nèt ra mμn h×nh (Tr−êng hîp sè cuèi cïng n»m ë cuèi x©u). If So <> "" Then Debug.Print So End Sub

c. Ghi chú: Thuật toán có thể mở rộng để tách các số âm/dương, nguyên/thực ….

Page 28: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 28

Bài tập 31 a. Hướng dẫn: Gọi S1 là một câu trong xâu S. Ta duyệt từng ký tự trong S và cộng vào S1 cho đến khi nào gặp ký tự là dấu chấm hoặc hết xâu thì dừng lại. Sau đó in xâu S1 ra màn hình và đặt lại S1 = “”. b. Chương trình mẫu:

'/// T¸ch c¸c c©u ra khái x©u v¨n b¶n Private Sub Form_Load() Dim S As String, i As Integer, S1 As String S = InputBox("H·y nhËp mét x©u ký tù : ") S1 = "" i = 1 Do While i <= Len(S) S1 = S1 & Mid(S, i, 1) If Mid(S, i, 1) = "." Then Debug.Print S1 S1 = "" End If i = i + 1 '/// Chuyển đến ký tù tiÕp theo Loop '/// In nèt c©u S1 ra mμn h×nh (Trong tr−êng hîp x©u S1 kh«ng cã dÊu chÊm c©u) Debug.Print S1 End Sub

c. Ghi chú: Bài toán này có thể áp dụng để đếm số câu trong một văn bản. Bài tập 32 a. Hướng dẫn: Ta sẽ dùng hàm Replace để thay thế mỗi ký tự ở font .vnTime bằng một ký tự (hoặc xâu ký tự) ở font VIQR. Việc này thực hiện trên từng xâu ký tự đọc từ tệp với lệnh Line Input. b. Chương trình mẫu : ở đây chỉ xin minh hoạ thay thế một số ký tự: đ, â, ă, à, á ,ả

,ạ, ư, ơ.

'/// ChuyÓn ®æi font ch÷ Private Sub Form_Load() On Error GoTo Err Dim F_Nguon As Long, F_Dich As Long, S As String F_Nguon = FreeFile Open "c:\FontVNTIME.txt" For Input As F_Nguon '/// Më ®Ó ®äc (Input=đọc) F_Dich = FreeFile Open "c:\FontVIQR.txt" For Output As F_Dich '/// Më (t¹o míi) ®Ó ghi Do While Not EOF(F_Nguon) Line Input #F_Nguon, S '/// §äc mét dßng trong file nguån S = Replace(S, "®", "dd") S = Replace(S, "©", "a^") S = Replace(S, "¨", "a(") S = Replace(S, "µ", "a`") S = Replace(S, "¸", "a'")

Page 29: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 29

S = Replace(S, "¶", "a?") S = Replace(S, "¹", "a.") S = Replace(S, "−", "u+") S = Replace(S, "¬", "o+") '............... Tiếp tôc thay thÕ c¸c ký tù Tiếng ViÖt kh¸c ë ®©y Print #F_Dich, S '/// Ghi kÕt qu¶ vμo file ®Ých Loop Close F_Nguon '/// §ãng file nguån vμ file ®Ých Close F_Dich MsgBox "§· chuyÓn ®æi xong ! Xin më file C:\FontVIQR.txt ®Ó xem !" Exit Sub Err: MsgBox "XuÊt hiÖn lçi ! " & Err.Description, vbCritical, "Lçi !" End Sub

c. Ghi chú:

• Có thể áp dụng để chuyển đổi giữa các bộ font chữ khác nhau.

• Câu lệnh Line Input dùng để đọc từng dòng văn bản trong tệp văn bản.

• Câu lệnh Print dùng để ghi danh sách các giá trị vào tệp

• Hàm eof(F) dùng để kiểm tra xem đã đọc hết tệp F hay chưa. True -> đã hết

• Phát biểu On error goto err thường được dùng để chủ động bắt lỗi, tránh bị treo máy. Trước nhãn Err: thường phải là Exit Sub hay Exit Function. Hãy sử dụng cơ chế bắt lỗi này trong những bài toán hay đoạn chương trình mà dễ xảy ra lỗi Runtime. Còn có một lệnh bắt lỗi khác là On error Resume Next. Xin hãy tra cứu trong tài liệu hướng dẫn trực tuyến MSDN, gồm 3 đĩa CDs.

Bài tập 33 a. hướng dẫn: Có nhiều cách giải quyết bài này, nhưng cách nhanh gọn nhất là dùng một mảng để lưu trữ số lượng ký tự đã nhập. Chỉ số của các phần tử trong mảng để lưu số lượng ký tự sẽ là giá trị ASCII của ký tự đó. Ví dụ: M[65] dùng để lưu số lượng ký tự là chữ cái “A”. b. Chương trình mẫu

'/// §Õm sè l−îng tõng lo¹i ký tù Private Sub Form_Load() Dim i As Integer Dim S As String Dim M(1 To 255) As Integer For i = 1 To 255 M(i) = 0 Next S = InputBox("H·y nhËp vµo mét x©u ký tù chØ chøa c¸c ch÷ c¸i HOA : ") For i = 1 To Len(S) M(Asc(Mid(S, i, 1))) = M(Asc(Mid(S, i, 1))) + 1 Next For i = 1 To 255

Page 30: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 30

If M(i) > 0 Then Debug.Print "Sè l−îng ký tù """ & Chr(i); """ lµ : " & M(i) End If Next End Sub

c. Ghi chú:

• Hàm ASC(Ch) cho ta mã ASCII của ký tự Ch, ví dụ: ASC(“A”) 65

• Dấu nháy kép là ký tự đặc biệt được VB sử dụng để bao bọc một hằng xâu, do vậy khi muốn in dấu nháy kép ra màn hình thì cần phải gõ 2 lần dấu nháy kép đó. Ví dụ “” để in ra một dấu nháy kép ra màn hình.

Bài tập 34 a. Hướng dẫn : Sửdụng hàm Replace b. Chương trình mẫu:

'/// Thay thÕ ký tù Private Sub Form_Load() Dim S As String S = InputBox("H·y nhËp mét x©u : ", "Sö dông hµm Replace", "Welcome to VB") S = Replace(S, Chr(32), "_") MsgBox "X©u sau khi thay thÕ lµ : " & S End Sub

Bài tập 35 a. Hướng dẫn: Thực hiện cộng từ phải sang trái từng cặp ký tự số với nhau (có tính đến phần nhớ) b. Chương trình mẫu

Private Sub Form_Load() Dim S1 As String, S2 As String, S As String Dim i As Integer, Nho As Integer, DonVi As Integer ‘/// Nho=Nhí, DonVI=§¬n VÞ

S1 = InputBox("NhËp vµo sè nguyªn d−¬ng thø nhÊt : ") S2 = InputBox("NhËp vµo sè nguyªn d−¬ng thø hai : ")

'/// ChÌn thªm sè 0 vμo tr−íc x©u s2 ®Ó 2 x©u dμi b»ng nhau nÕu S2 < S1 If len(s2) < len(s1) Then S2 = String(Len(S1) - Len(S2), "0") & S2

‘/// ChÌn thªm sè 0 vμo tr−íc x©u S1 ®Ó 2 x©u dμi b»ng nhau nÕu S1 < S2 If Len(s1) < len(s2) Then S1 = String(Len(S2) - Len(S1), "0") & S1

S = "" Nho = 0

For i = Len(S1) To 1 Step -1 DonVi = (Val(Mid(S1, i, 1)) + Val(Mid(S2, i, 1)) + Nho) Mod 10 Nho = (Val(Mid(S1, i, 1)) + Val(Mid(S2, i, 1)) + Nho) \ 10 S = DonVi & S Next

If Nho > 0 Then S = Nho & S

MsgBox "kÕt qu¶ cña " & S1 & "+" & S2 & " = " & S End Sub

Page 31: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 31

c. Ghi chú: • Có thể áp dụng để thực hiện cộng 2 số nguyên, hai số thực hay số nguyên với

số thực…. • Có thể vận dụng vào việc nhân 2 số lớn. • Hàm String(N,Ch) : Trả về một xâu chứa N ký tự Ch • Hàm Val (S) : Chuyển xâu S thành số. • Phép Mod thực hiện việc chia lấy phần dư • Phép toán \ thực hiện việc chia lấy phần nguyên.

Bài tập 36 a. hướng dẫn: Các phần tử trên đường chéo chính thứ nhất có chỉ số là [i,i] (với i chạy từ 1 đến n). Đường chéo chính thứ hai có chỉ số là [i,j] (với i chạy từ 1 đến n và j chạy từ n-i+1 đến 1) b. Chương trình mẫu:

Private Sub Form_Load() Const MAX = 10 Dim TongDuong As Long, TongAm As Long Dim A(1 To MAX, 1 To MAX) As Integer Dim N As Integer, i As Integer, j As Integer N = InputBox("KÝch th−íc cña ma trËn : ") '/// NhËp d÷ liÖu cho ma trËn For i = 1 To N For j = 1 To N A(i, j) = InputBox("NhËp phÇn tö A[" & i & "," & j & "]") Next j Next i TongAm = 0 TongDuong = 0 '/// Céng trªn ®−êng chÐo thø nhÊt For i = 1 To N If A(i, i) < 0 Then TongAm = TongAm + A(i, i) Else TongDuong = TongDuong + A(i, i) End If Next '/// Céng trªn ®−êng chÐo thø hai For i = 1 To N If A(i, N - i + 1) < 0 Then TongAm = TongAm + A(i, N - i + 1) Else TongDuong = TongDuong + A(i, N - i + 1) End If Next MsgBox "Tæng ©m = " & TongAm & " Tæng d−¬ng = " & TongDuong End Sub

Page 32: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 32

Bài tập 37 a. Hướng dẫn: Kiểm tra từng vị trí A[i,j] của ma trận. Với mỗi vị trí ta “thử” lan tiếp theo chiều ngang, dọc, chéo xem liệu có ô liền kề mà có giá trị 1 hay không ?. Nếu có thì ghi nhận thêm vào, trong quá trình ghi nhận thì cần kiểm tra, nếu số ô đó >=5 thì dừng và thông báo là có tồn tại một hàng liền nhau cùng có giá trị là 1. b. Chương trình mẫu:

Option Explicit Dim A(1 To 10, 1 To 10) As Integer Dim N As Integer '///Hμm kiÓm tra xem t¹i vÞ trÝ hμng h, cét c cã Ýt nhÊt 5 « cã cïng gi¸ trÞ 1 hay kh«ng ? '/// NÕu tån t¹i th× hμm tr¶ vÒ gi¸ trÞ True, tr¸i l¹i tr¶ vÒ False Function KiemTraHangNgang(h As Integer, c As Integer) As Boolean Dim i As Integer, SoPT As Integer SoPT = 1 For i = 1 To 4 If i + c <= N Then If A(h, i + c) = 0 Then Exit For SoPT = SoPT + 1 End If Next KiemTraHangNgang = (SoPT >= 5) End Function '----------------------------------------------------------------------------------------------------------------------------- '/// Hμm kiÓm tra hμng däc Function KiemTraHangDoc(h As Integer, c As Integer) As Boolean Dim i As Integer, SoPT As Integer SoPT = 1 For i = 1 To 4 If i + h <= N Then If A(i + h, c) = 0 Then Exit For SoPT = SoPT + 1 End If Next KiemTraHangDoc = (SoPT >= 5) End Function '----------------------------------------------------------------------------------------------------------------------------- Function KiemTraCheo1(h As Integer, c As Integer) As Boolean Dim i As Integer, SoPT As Integer SoPT = 1 For i = 1 To 4 If (h + i <= N) And (c + i <= N) Then If A(h + i, c + i) = 0 Then Exit For SoPT = SoPT + 1 End If Next KiemTraCheo1 = SoPT >= 5 End Function '----------------------------------------------------------------------------------------------------------------------------- Function KiemTraCheo2(h As Integer, c As Integer) As Boolean Dim i As Integer, SoPT As Integer SoPT = 1

Page 33: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 33

For i = 1 To 4 If (h + i <= N) And (c - i >= 1) Then If A(h + i, c - i) = 0 Then Exit For SoPT = SoPT + 1 End If Next KiemTraCheo2 = SoPT >= 5 End Function '----------------------------------------------------------------------------------------------------------------------------- Private Sub Form_Load() Dim i As Integer, j As Integer N = InputBox("KÝch th−íc cña ma trËn : ") '/// NhËp d÷ liÖu cho ma trËn For i = 1 To N For j = 1 To N A(i, j) = InputBox("NhËp phÇn tö A[" & i & "," & j & "]") Next j Next i For i = 1 To N For j = 1 To N If A(i, j) = 1 Then If KiemTraHangNgang(i, j) Then MsgBox "§−êng ngang b¾t ®Çu tõ vÞ trÝ " & i & ":" & j End End If If KiemTraHangDoc(i, j) Then MsgBox "§−êng däc b¾t ®Çu tõ vÞ trÝ " & i & ":" & j End End If If KiemTraCheo1(i, j) Then MsgBox "§−êng chÐo chÝnh 1, b¾t ®Çu tõ vÞ trÝ " & i & ":" & j End End If If KiemTraCheo2(i, j) Then MsgBox "§−êng chÐo chÝnh 2, b¾t ®Çu tõ vÞ trÝ " & i & ":" & j End End If End If Next Next MsgBox "Kh«ng thÊy xuÊt hiÖn !" End Sub

Bài tập 37 a. Hướng dẫn: Muốn định nghĩa kiểu dữ liệu mới, cần dùng từ khoá Type … End type và thường định nghĩa trong Module.

Page 34: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 34

b. Chương trình mẫu:

Private Sub Form_Load()

Dim i As Integer, j As Integer

Dim DS(100) As CanBo

Dim SoLuong As Integer

Dim Tam As CanBo

SoLuong = InputBox("Sè l−îng c¸n bé cÇn nhËp : ")

For i = 1 To SoLuong

DS(i).HoTen = InputBox("Hä tªn :")

DS(i).NamSinh = InputBox("NhËp n¨m sinh : ")

DS(i).QueQuan = InputBox("NhËp quª qu¸n : ")

DS(i).HeSoLuong = InputBox("HÖ sè l−¬ng : ")

Next

'/// S¾p xÕp b»ng gi¶i thuËt s¾p xÕp ®¬n gi¶n

For i = 1 To SoLuong - 1

For j = i + 1 To SoLuong

If DS(i).NamSinh > DS(j).NamSinh Then

Tam = DS(i)

DS(i) = DS(j)

DS(j) = Tam

End If

Next

Next

'/// L−u kÕt qu¶ ra tÖp

Dim F As Long

F = FreeFile

Open "c:\Canbo.txt" For Output As #F

For i = 1 To SoLuong

Print #F, DS(i).HoTen, vbTab, DS(i).NamSinh

Next

Msgbox “Mở file c:\Canbo.txt để quan sát “

Close F

End Sub

c. Ghi chú:

• Có thể gán giá trị của các biến cấu trúc cho nhau.

Page 35: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 35

• Hàm FreeFile trả về một con số (gọi là thẻ file) còn trống. C – BÀI TẬP TỰ GIẢI Bài 1: Viết chương trình nhập vào 3 cạnh của tam giác (Lưu ý phải đảm bảo kiểm tra tổng 2 cạnh lớn hơn cạnh còn lại). Dùng hàm MsgBox hiển thị chu vi, diện tích, độ dài 3 đường cao, 3 đường trung tuyến, 3 đường phân giác, bán kính đường tròn nội tiếp, ngoại tiếp theo các công thức sau: V = a+b+c = 2p

S = ))()(( cpbpapp −−− ha = aS2

ma = 222 2221 acb −+ ga = )(2 apbcp

cb−

+

PSr =

SabcR4

=

Bài tập 2: Thông tin về một sinh viên gồm có: Họ tên, Tuổi, Điểm toán (Hệ số 2), điểm tin (Hệ số 1). Hãy nhập các thông tin trên cho một lớp và in ra bảng điểm gồm các chi tiết nêu trên và điểm trung bình. HD: Định nghĩa kiểu dữ liệu mới bằng từ khoá Type (Tương tự như Record trong pascal) và khai báo một Mảng để lưu trữ danh sách sinh viên. Dùng hàm inputbox để nhập liệu, hàm Debug.print để in kết quả. Bài tập 3: Nhập 3 số a, b, c. Hãy cho biết 3 số trên có thể là độ dài 3 cạnh của tam giác hay không ?. Nếu lập thành một tam giác thì đó là tam giác gì : Vuông, đều, cân, vuông cân hay tam giác thường. HD: Sử dụng cấu trúc If ... Then và If...Then ...Else. Bài tập 4: Nhập một ký tự. Hãy cho biết đó là chữ cái viết hoa, thường, chữ số hay ký tự khác. HD: Sử dụng cấu trúc Select Case Bài tập 5: Nhập vào tháng và năm dương lịch. Hãy hiển thị số ngày trong tháng đó. HD: Sử dụng cấu trúc Select Case và lưu ý những tháng của năm nhuận (Tức tháng 2 có 29 ngày). Bài tập 6 : Nhập vào tên của một hàm (Chữ thường hoặc hoa) và giá trị của một biến số. Sau đó in ra kết quả của hàm. Ví dụ : Nếu nhập tên hàm là Cos và giá trị biến số là 0 thì kết quả là 1. HD: Sử dụng cấu trúc Select Case và hàm UCase (hoặc LCase) Bài tập 7: Vừa gà vừa chó bó lại cho tròn 36 con, 100 chân chẵn. Hãy lập trình cho biết có bao nhiêu con gà, bao nhiêu con chó. HD: Sử dụng 2 vòng lặp lồng nhau để thử. Nếu kiểm tra thoả mãn đầu bài thì hiển thị kết quả và dừng vòng lặp. Bài tập 8: Có 100 con trâu, 100 bó cỏ, trâu đứng ăn năm bó, trâu nằm ăn 3 bó, trâu già 3 con ăn 1 bó. Hãy lập trình tìm xem có bao nhiêu con trâu mỗi loại. HD : Tương tự như bài tập 7, nhưng sử dụng 3 vòng lặp để thử.

Page 36: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 36

Bài tập 9 : Yêu nhau cau sáu bổ ba, ghét nhau cau sáu bổ ra làm mười. Giận thương có bảy mươi hai người, nhưng thời cau chỉ có mười quả thôi. Hãy cho biết có bao nhiêu người thương bao nhiêu người giận. HD: Sử dụng 2 vòng lặp. Bài tập 10: Nhập vào xâu ký tự, sau đó đếm xem có bao nhiêu chữ cái hoa, bao nhiêu chữ cái thường, bao nhiêu chữ số và bao nhiêu ký tự khác. HD : Sử dụng hàm inStr và kết hợp với vòng lặp For. Bài tập 11: Nhập vào một xâu ký tự và đảo ngược xâu ký tự đó. Bài tập 12 : Nhập vào một xâu ký tự và cắt các khoảng trắng ở 2 đầu (không sử dụng hàm Trim của VB) Bài tập 13: Viết chương trình cho người dùng nhập vào số tự nhiên n và hiển thị tổng của các dãy số sau :

S1 = n

n++++ ...321 S2= 2222 ...321 n++++

S3=n

n2

12.....65.

43.

21 − S4= nn++++ ...332211

S5 = 2...222 ++++ (n dấu căn) S6 = n !

Hướng dẫn: Sử dụng vòng lặp (Nên thử làm với cả 3 loại vòng lặp) Bài tập 14: Nhập vào một số nguyên dương n. Hãy lập trình để cho biết đó có phải là số nguyên tố hay không ? HD: Số n được gọi là nguyên tố nếu nó không chia hết cho bất kỳ số nào nằm trong khoảng [2, [ n ]]. Bài tập 15 : Nhập vào tuổi của một người cho đến khi nào tuổi nhập vào là một số âm. HD: Sử dụng vòng lặp do...Loop Bài tập 16: Nhập vào một dãy ký tự (mỗi lần một ký tự). Điều kiện nhập kết thúc khi ký tự nhập vào là một dấu chấm. Sau đó hiển thị số lượng ký tự là chữ số và số lượng ký tự không phải là ký tự số. Bài tập 17: Tìm số dương n lớn nhất thoả mãn điều kiện :

a. 101999.212

1...51

311 <

−++++

n

b. en-1999Log10n < 2000 (HD: Trong VB : Log10n viết là Log(n)/Log(10)) Bài tập 18 : Viết chương trình tìm ước số chung lớn nhất của hai số a và b. Bài tập 19 : Viết chương trình nhập vào hai số nguyên T và M. Hãy in ra phân số T/M ở dạng tối giản. Ví dụ nhập T = 10, M = 20 thì in ra là ½. Hướng dẫn : Áp dụng kết quả của bài 18. Bài tập 20 : Nhập vào một xâu ký tự, sau đó in ngược xâu đó bằng thủ tục debug.print. Mỗi ký tự in trên một dòng riêng biệt.

Page 37: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 37

Bài tập 21: Viết chương trình tính diện tích hình giới hạn bởi đường y1=0, y2 = x2 và xa=-2, xb=5. bằng phương pháp trung bình, bước nhảy là Δi = xi+1-xi = 0.0000001.

HD: Diện tích S = 2

11

2

2)(

;/)(;* ⎥⎦⎤

⎢⎣⎡ +

=Δ−=Δ +∑ iiniiabii

xxyxxny

Bài tập 22: Viết chương trình cho người dùng nhập vào một số nguyên dương, sau đó in ra màn hình ở dạng chữ, ví dụ nhập "12345" thì in ra là "mười hai nghìn ba trăm bốn mươi lăm". HD: Phân chia thành các cụm 3 chữ số sau đó "đọc" cụm 3 số kết hợp với hàng của 3 số đó. Như ví dụ trên thì số 12 được đọc là "mười hai", nhưng vì số này thuộc hàng nghìn nên thêm từ "nghìn". Bài tập 23: Nhập vào n số và in ra ước số chung lớn nhất của n số đó Bài tập 24: Viết chương trình mã hoá một file văn bản bằng phương pháp mã hoá cổ điển. Kết quả được lưu vào một file văn bản khác. Qui tắc mã hoá như sau:

Ký tự ban đầu Ký tự sau khi bị mã hoá a b b c c d ................. ..... z a A B B C ............. ....... Z A

Bài tập 25: Viết chương trình giải mã theo qui tắc của bài 24. (B-> A, A->Z...) Bài tập 26 : Viết chương trình chuyển đổi một dãy các con số (dãy con số này cho dưới dạng một xâu, ví dụ '142345'). Sau đó chuyển dãy số này thành số chuỗi nhị phân, trong đó mỗi chữ số được chuyển thành 1 cụm 4 bit nhị phân. ví dụ nếu nhập xâu '1234567' thì kết quả cho ta : '0001 0010 0011 0100 0101 0110 0111'. Bài tập 26: Viết chương trình chuyển đổi dãy nhị phân thành dãy các ký tự ASCII tương ứng, biết rằng mỗi cụm gồm 7 bit nhị phân biểu diễn một ký tự có mã là giá trị hệ 10 của 7 bit đó. Bài tập 27: Nhập vào n điểm trong toạ độ phẳng. Sau đó in ra màn hình số lượng tam giác có thể có từ n điểm đó. Bài tập 28: Yêu cầu như bài tập 27 nhưng đếm số lượng tam giác đều, cân, vuông, vuông cân và tam giác thường. Bài tập 29 : Yêu cầu như bài tập 27 nhưng đếm số lượng tam giác ở góc phần tư thứ I, II, III, IV. Bài tập 30: Nhập vào một số hệ 10 sau đó in giá trị của nó trong hệ cơ số 2, 8, 16.

Page 38: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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á

Page 39: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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

Page 40: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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]

[email protected].

Page 41: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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.

Page 42: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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

Page 43: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 đề

Page 44: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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

Page 45: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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ử

Page 46: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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"

Page 47: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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.

Page 48: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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)

Page 49: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 <ĐK> không chỉ làm việc với biểu thức <ĐK> ở 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).

Page 50: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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

Page 51: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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

Page 52: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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

Page 53: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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.

Page 54: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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

Page 55: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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.

Page 56: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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ọ.

Page 57: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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) = TG

End If Next Next End Sub

d. Ghi chú:

• Giải thuật ở trên chỉ thực hiện sắp xếp đúng đối với Tiếng việt không dấu. Muốn việc sắp xếp ở trên đúng đắn cả với Tiếng việt có dấu thì cần mã hoá lại các ký tự có dấu thành các ký tự không dấu, sau khi sắp xếp xong thì lại giải mã ngược lại. Ví dụ: chữ à, á, ă, ả, ạ thì có thể mã hoá tương ứng thành: aa, ab, ac, ad, ae, af. Việc mã hoá hay giải mã thực chất là việc thay thế ký tự, do vậy ta có thể thực hiện hết sức đơn giản bằng hàm Replace trong VB.

• Giải thuật này có thể áp dụng rất tốt trong việc sắp xếp Tiếng việt trong môi trường Word và đặc biệt là trong MS Excel.

Page 58: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 58

Bài 9 a. Giao diện và đặt tên cho các điều khiển trên Form

Hình 2.34 – Giao diện và đặt tên cho các điều khiển

b. Hướng dẫn

• Điều khiển Web Browser cho phép chúng ta có thể hiển thị các trang Web giống như trong Internet Explorer hay hiển thị nội dung của một thư mục, một ổ đĩa giống như Window Explorer hay My Computer.

• Điều khiển này nằm trong thư viện:

• Có thể sử dụng phương thức Navigate2 của điều khiển Microsoft Internet Control để mở một thư mục hay một trang Web.

c. Chương trình mẫu

Option Explicit '///Nếu người dùng chọn địa chỉ trong danh sách thì mở trang đó Private Sub cboDiaChi_Click() webChinh.Navigate2 cboDiaChi.Text End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Nếu người dùng nhập mới sau đó nhấn Enter thì cũng mở Private Sub cboDiaChi_KeyUp(KeyCode As Integer, Shift As Integer) If KeyCode = 13 Then cboDiaChi.AddItem cboDiaChi.Text, 0 webChinh.Navigate2 cboDiaChi.Text '/// Thêm mục mới vào.

End If End Sub

d. Ghi chú:

• Mã ASCII của phím Enter là 13.

• Điều khiển này có thể kết hợp với đối tượng "HTML Microsoft Object Library" (Vào trong Project References) để truy cập và thao tác trực tiếp đến các thành phần bên trong một trang WEB bằng mã lệnh Visual Basic. Có thể truy cập trang Web http://www.w3schools.com để biết thêm về mô hình truy cập DOM – (Document Object Model).

Page 59: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 59

Bài 10 a. Giao diện và đăt tên cho các điều khiển trên form

Hình 35– Giao diện chương trình

b. Hướng dẫn: Sử dụng các thuộc tính FontCount và Fonts của đối tượng Screen để lấy tên các font chữ hiện có trong hệ thống. c. Chương trình mẫu Option Explicit '/// Đặt cỡ chữ cho nội dung trong txtVanBan Private Sub cboCoChu_Click() txtVanBan.FontSize = cboCoChu.Text End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Đặt font chữ cho txtVanBan theo như lựa chọn của người dùng Private Sub cboFontChu_Click() txtVanBan.FontName = cboFontChu.Text End Sub '----------------------------------------------------------------------------------------------------------------------------- '//////////// Chương trình mẫu ////////////// Private Sub Form_Load() Dim i As Integer

'/// Chèn tên các font vào trong ListBox For i = 0 To Screen.FontCount - 1 cboFontChu.AddItem Screen.Fonts(i) Next '-----------------------------------------------------------------------------------------------------------------------------

'/// Chèn một số giá trị vào trong cboCoChu For i = 8 To 100 Step 2 cboCoChu.AddItem i Next End Sub

d. Ghi chú:

• Muốn hiển thị mục nào đó trên ComboBox thì có thể viết: <TênCombo>.ListIndex=<Vị trí mục muốn hiển thị>. ví dụ: cboFontChu.ListIndex=1. Tuy nhiên để tránh lỗi cần kiểm tra mục có tồn tại?

Page 60: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 60

• Muốn hiển thị hộp TextBox có nhiều dòng, thanh cuộn thì cần đặt lại các thuộc tính như MultiLine True, ScrollBars 3 - Boths

Bài 11 a. Giao diện và đặt tên cho các điều khiển

Hình 2.36 – Giao diện và đặt tên cho các điều khiển

b. Hướng dẫn Việc LogOff, Restart, Shutdown… có thể thực hiện thông qua hàm API ExitWindows hay ExitWindowsEx, tuy nhiên với các hệ điều hành thuộc dòng Windows NT, 2K, XP thì cần phải thực hiện thêm một số công việc khác liên quan đến xác lập quyền (Với Window 95, 98, Me thì không cần). Do vậy, ở đây cũng giới thiệu cách thức để chúng ta nhận biết được hệ điều hành hiện tại thuộc loại nào (9x hay Win2K, XP…) c. Chương trình mẫu (Trong phần này, bạn cần tạo một form và một Module) Gõ đoạn lệnh sau trong Module Module1.bas Option Explicit '/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// '/// Đoạn code này được lấy từ trang http://www.allapi.net '//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Private Const EWX_LOGOFF = 0 Private Const EWX_SHUTDOWN = 1 Private Const EWX_REBOOT = 2 Private Const EWX_FORCE = 4 Private Const TOKEN_ADJUST_PRIVILEGES = &H20 Private Const TOKEN_QUERY = &H8 Private Const SE_PRIVILEGE_ENABLED = &H2 Private Const ANYSIZE_ARRAY = 1 Private Const VER_PLATFORM_WIN32_NT = 2 Type OSVERSIONINFO dwOSVersionInfoSize As Long dwMajorVersion As Long dwMinorVersion As Long dwBuildNumber As Long dwPlatformId As Long szCSDVersion As String * 128 End Type Type LUID LowPart As Long HighPart As Long End Type

Page 61: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 61

Type LUID_AND_ATTRIBUTES pLuid As LUID Attributes As Long End Type Type TOKEN_PRIVILEGES PrivilegeCount As Long Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES End Type '/// Các hàm này xin copy từ API TextViewer đi cùng với bộ Visual Studio 6.0 Private Declare Function GetCurrentProcess……….. Private Declare Function OpenProcessToken ……… Private Declare Function LookupPrivilegeValue ……. Private Declare Function AdjustTokenPrivileges …… Private Declare Function ExitWindowsEx …………… Private Declare Function GetVersionEx ……………..

'///Kiểm tra xem hệ điều hành đang chạy có phải thuộc dòng Windows NT hay không ? Public Function IsWinNT() As Boolean Dim myOS As OSVERSIONINFO myOS.dwOSVersionInfoSize = Len(myOS) GetVersionEx myOS IsWinNT = (myOS.dwPlatformId = VER_PLATFORM_WIN32_NT) End Function '----------------------------------------------------------------------------------------------------------------------------- '/// Đặt quyền Shutdown cho ứng dụng Private Sub EnableShutDown() Dim hProc As Long Dim hToken As Long Dim mLUID As LUID Dim mPriv As TOKEN_PRIVILEGES Dim mNewPriv As TOKEN_PRIVILEGES hProc = GetCurrentProcess() OpenProcessToken hProc, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hToken LookupPrivilegeValue "", "SeShutdownPrivilege", mLUID mPriv.PrivilegeCount = 1 mPriv.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED mPriv.Privileges(0).pLuid = mLUID '/// Cho phép ứng dụng hiện hành Shutdown máy tính AdjustTokenPrivileges hToken, False, mPriv, 4 + (12 * mPriv.PrivilegeCount), mNewPriv, 4 + (12 * mNewPriv.PrivilegeCount) End Sub

'//// Shut Down máy tính Public Sub ShutDownNT(Force As Boolean) Dim Ret As Long Dim Flags As Long Flags = EWX_SHUTDOWN If Force Then Flags = Flags + EWX_FORCE If IsWinNT Then EnableShutDown ExitWindowsEx Flags, 0 End Sub

'/// Khởi động lại máy tính Public Sub RebootNT(Force As Boolean) Dim Ret As Long Dim Flags As Long Flags = EWX_REBOOT If Force Then Flags = Flags + EWX_FORCE If IsWinNT Then EnableShutDown ExitWindowsEx Flags, 0

Page 62: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 62

End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Log off khỏi hệ thống Public Sub LogOffNT(Force As Boolean)

Dim Ret As Long

Dim Flags As Long

Flags = EWX_LOGOFF

If Force Then Flags = Flags + EWX_FORCE

ExitWindowsEx Flags, 0

End Sub Form.frm Private Sub cmdThucHien_Click() If optLogoff.Value = True Then LogOffNT optFore.Value If optRestart.Value = True Then RebootNT optFore.Value If optShutdown.Value = True Then ShutDownNT optFore.Value End Sub

d. Ghi chú:

• Phần khai báo các hàm API (Application Programming Interface – Giao diện lập trình ứng dụng) ở trên xin bạn đọc gõ đầy đủ phần khai báo của từng hàm (Có thể mở tiện ích API Text Viewer trong : Start->Programs-> Visual Studio 6.0-> Microsoft Visual Studio 6.0 Tools -> API Text Viewer, sau đó gõ hàm cần tham chiếu và copy & paste vào trong VB).

• Muốn tạo ra nhiều nhóm lựa chọn (ở trên là 2 nhóm) thì mỗi nhóm cần đặt trong một Frame.

Bài 12 a. Thiết kế giao diện

Hình 2.37 - Đặt thuộc tính cho các điều khiển Label và Form

b. Hướng dẫn

• Trước hết, để bỏ thanh tiêu đề của Form cần đặt 2 thuộc tính như sau: Thuộc tính Caption để trống (xoá đi), thuộc tính thứ hai là ControlBox = False

Page 63: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 63

• Sau đó, trong sự kiện di chuyển nhãn (label) ta sử dụng hàm ReleaseCapture để giải phóng các sự kiện chuột khỏi sự theo dõi (Capture) của Form và thay vào đó là gửi một thông điệp (Message) đến cho Form rằng : "Người dùng đang di chuyển thanh tiêu đề", như thế Form sẽ di chuyển khi người dùng click và di chuột trên Label.

c. Chương trình mẫu

'/// Khai báo hàm API Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Private Declare Sub ReleaseCapture Lib "user32" () Const WM_NCLBUTTONDOWN = &HA1 Const HTCAPTION = 2 '----------------------------------------------------------------------------------------------------------------------------- '/// Khi người dùng click và di chuột trên Label thì "bảo" với Form là "Người dùng đan di chuyển '/// thanh tiêu đề" để Form được di chuyển. Private Sub lblTitle_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

Dim lngReturnValue As Long

Call ReleaseCapture '/// Không cho Form nhận (Xử lý) sự kiện Click chuột

lngReturnValue = SendMessage(Me.hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)

End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Thoát khỏi chương trình khi người dùng click vào nút thoát Private Sub cmdThoat_Click()

End

End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Thoát khỏi chương trình khi người dùng click vào nút ⌧ trên Form Private Sub cmdClose_Click()

End

End Sub

d. Ghi chú:

• Hàm SendMessage có chức năng gửi một thông điệp -Message (có thể coi là một lệnh) đến một đối tượng nào đó trong một ứng dụng (như Command, textbox, listbox, Form, label v.v…). Các đối tượng này được đại diện bởi một số hiệu – Handle – duy nhất (có sách còn gọi là "thẻ", "cán" …). Số hiệu này do Window quản lý và thường được lưu trong thuộc tính có tên là HWND. Ví dụ, handle của Command1 và Form1 lần lượt là Command1.HWND, Form1.HWND. Các tham số tiếp theo của hàm SendMessage là các tham số đặc tả cho biết là lệnh thực hiện trên đối tượng đó là lệnh gì (tham số thứ 2 và thứ 3) và mức độ như thế nào (nằm trong tham số thứ 4). Hàm SendMessage rất thường được sử dụng khi lập trình ở mức thấp và rất hữu ích trong một số trường hợp. do vậy, cần phải nắm và vận dụng tốt hàm này.

• Việc thay đổi tiêu đề chuẩn bằng một Label giúp cho ứng dụng có thể đặt Font chữ theo như ý muốn mà không bị lệ thuộc vào font hệ thống mặc định. Tuy nhiên có một số hạn chế là : Khi Form đó có hệ thống menu bar và thanh công cụ (Toolbar) v.v… thì việc thay thế này không còn ý nghĩa vì việc hiển thị khi đó sẽ bị sai lệch. Nói chung, chỉ nên thay thế khi Form ứng dụng đơn giản, còn đối với những form phức tạp thì nên sử dụng các kỹ thuật khác.

Page 64: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 64

Bài 13 a. Thiết kế giao diện

Hình 2.38 - Đặt tên và thiết lập thuộc tính cho các điều khiển

b. Hướng dẫn Ở đây, việc "cuộn" dòng văn bản chứa trong Label thực chất là việc di chuyển liên tục Label lên phía trên sau mỗi khoảng thời gian nhất định (ví dụ 50 ms). Tuy nhiên, để cho việc cuộn văn bản chỉ nằm trong một khung nhất định thì cần phải đặt trong một Frame. Việc dừng hay tiếp tục cũng như tốc độ di chuyển được điều khiển bởi các nút lệnh "Bắt đầu" và "Dừng cuộn". Muốn dừng cuộn thì đơn giản chỉ việc đặt thuộc tính Enable của Timer thành False, còn muốn tiếp tục thì đặt thành True. c. Chương trình mẫu

Option Explicit Private Sub Form_Load() '/// L−u mét sè néi dung trong Label ®Ó cuén

lblMain.Caption = "Khoa C«ng nghÖ th«ng tin - §¹i häc s− ph¹m Kü thuËt H−ng Yªn. " lblMain.Caption = lblMain.Caption & "Bµi tËp m«n LËp tr×nh H−íng sù kiÖn víi VB" lblMain.Caption = lblMain.Caption & "H−íng dÉn sö dông Label kÕt hîp víi ®iÒu khiÓn Frame " lblMain.Caption = lblMain.Caption & " vµ ®iÒu khiÓn Timer. H·y click vµo nót " lblMain.Caption = lblMain.Caption & "B¾t ®Çu vµ Dõng cuén vµ quan s¸t !. " lblMain.Caption = lblMain.Caption & vbCrLf & "Cã thÓ thay ®æi tèc ®é cuén b»ng c¸ch ®Æt l¹i " lblMain.Caption = lblMain.Caption & "thuéc tÝnh Interval. Gi¸ trÞ nµy cµng nhá th× tèc ®é cuén cµng nhanh."

End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Cø sau 50 miligi©y th× cuén Label lªn trªn 5 twips. Trong khi cuén cÇn kiÓm tra vμ ®Æt l¹i vÞ trÝ cña Label Private Sub tmr50ms_Timer() lblMain.Top = lblMain.Top - 5 If lblMain.Top + lblMain.Height <= fraMain.Top Then lblMain.Top = fraMain.Top + fraMain.Height End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Muèn thùc hiÖn cuén, chØ cÇn bËt timer lªn (®Æt thuéc tÝnh Enable = True) Private Sub cmdBatDau_Click() tmr50ms.Enabled = True End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Muèn thùc hiÖn cuén, chØ cÇn bËt timer lªn (®Æt thuéc tÝnh Enable = True) Private Sub cmdDungCuon_Click() tmr50ms.Enabled = False End Sub

Page 65: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 65

d. Ghi chú:

• Có thể làm ẩn thanh Frame đi bằng cách đặt thuộc tính BorderStyle = 0, khi đó chương trình trông sẽ đẹp hơn.

• Khi tạo nhãn thì phải vẽ nhãn đó ở trong Frame (tạo frame trước). • Màu nền của Label ở trên chỉ đặt để cho dễ quan sát, còn thực tế thì nên để

màu mặc định. Bài 14 a. Thiết kế giao diện

Hình 2.39 - Đặt tên và thuộc tính cho các điều khiển

b. Hướng dẫn Tương tự như bài 13, tuy nhiên tốc độ cuộn (phụ thuộc vào giá trị của thuộc tính Interval) có thể thay đổi trực quan thông qua điều khiển Vscrollbar. c. Chương trình mẫu

Option Explicit Private Sub Form_Load() '/// L−u mét sè néi dung trong Label ®Ó cuén

lblMain.Caption = "Khoa C«ng nghÖ th«ng tin - §¹i häc s− ph¹m Kü thuËt H−ng Yªn. " lblMain.Caption = lblMain.Caption & "Bµi tËp m«n LËp tr×nh H−íng sù kiÖn víi VB" lblMain.Caption = lblMain.Caption & "H−íng dÉn sö dông Label kÕt hîp víi ®iÒu khiÓn Frame " lblMain.Caption = lblMain.Caption & " vµ ®iÒu khiÓn Timer. H·y click vµo nót " lblMain.Caption = lblMain.Caption & "B¾t ®Çu vµ Dõng cuén vµ quan s¸t !. " lblMain.Caption = lblMain.Caption & vbCrLf & "Cã thÓ thay ®æi tèc ®é cuén b»ng c¸ch ®Æt l¹i " lblMain.Caption = lblMain.Caption & "thuéc tÝnh Interval. Gi¸ trÞ nµy cµng nhá th× tèc ®é cuén cµng nhanh."

'///§Æt mét sè thuéc tÝnh cho VscollBar. (Thñ tôc sù kiÖn Change sÏ ®−îc kÝch ho¹t sau c¸c lÖnh nμy) vsbMain.Min = 5 vsbMain.Max = 200 vsbMain.SmallChange = 1 vsbMain.LargeChange = 5 End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Khi ng−êi dïng thay ®æi gi¸ trÞ trªn ScrollBar th× g¸n tr¶ l¹i gi¸ trÞ nμy cho Timer. Private Sub vsbMain_Change() tmrMain.Interval = vsbMain.Value End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Thùc hiÖn di chuyÓn Label lªn phÝa trªn sau mçi kho¶ng thêi gian. Trong qu¸ tr×nh di chuyÓn cÇn '//// kiÓm tra vÞ trÝ cña Label xem cã v−ît qu¸ Frame kh«ng ? NÕu ®· v−ît qu¸ th× ®Æt vÒ vÞ trÝ ë d−íi Frame

Page 66: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 66

Private Sub tmrMain_Timer() lblMain.Top = lblMain.Top – 5 '/// Mçi lÇn sÏ di chuyÓn lªn phÝa trªn 5 Twips If lblMain.Top + lblMain.Height <= fraMain.Top Then lblMain.Top = fraMain.Top + fraMain.Height End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// TiÕp tôc cuén Private Sub cmdBatDau_Click() tmrMain.Enabled = True End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Dõng cuén Private Sub cmdDungCuon_Click() tmrMain.Enabled = False End Sub

Bài 15 a. Thiết kế giao diện (thêm vào 1 Label và 4 đường thẳng – Line vào form)

Hình 2.40 - Đặt tên cho các điều khiển

b. Hướng dẫn

• Khi chuột di chuyển vào trong Label (sự kiện MouseMove) thì đặt lại thuộc tính của Label và 4 đường Line để tạo hiệu ứng.

• Khi chuột di chuyển ra khỏi Label (cũng có nghĩa là chuột đang di chuyển ở trong Form) thì đặt các thuộc tính về giá trị ban đầu.

c. Chương trình mẫu

Option Explicit '///Khi chuột di chuyển trong form ⇔ Chuột di chuyển ra ngoài Label thì đặt như ban đầu Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) l3.BorderColor = &HFFFFFF l4.BorderColor = &HFFFFFF l1.BorderColor = 0 l2.BorderColor = 0 End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Khi chuột di chuyển vào trong Label thì đặt hiệu ứng cho các đường L1, L2, L3, L4 Private Sub lblThoat_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) l3.BorderColor = 0 l4.BorderColor = 0 l1.BorderColor = &HFFFFFF l2.BorderColor = &HFFFFFF End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Khi click chuột lên Label thì thực hiện thoát Private Sub lblThoat_Click() End End Sub

Page 67: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 67

d. Ghi chú:

• Khi vẽ các đường thẳng cần phải vẽ cho sát với 4 mép của Label • Có thể phát triển thay Label bằng Image và viết cả với những sự kiện

MouseDown, MouseUp để thay đổi ảnh của nút v.v.. Bài 16 a. Thiết kế giao diện

Hình 2.41 - Đặt tên cho các điều khiển

b. Hướng dẫn: Để cho chữ chạy (cuộn), ta chỉ việc cắt ký tự đầu tiên của xâu và chèn vào cuối sau mỗi khoảng thời gian nhất định. Khoảng thời gian này càng nhỏ thì tốc độ cuộn càng nhanh. c. Chương trình mẫu (Viết trong Form code)

Private Sub Form_Load() Me.Caption = "Trường ĐHSPKT Hưng Yên - Khoa Công nghệ thông tin. " tmrScroll.Interval = 100 '/// Sau mỗi 100 ms thì kích hoạt một lần tmrScroll.Enabled = False End Sub '/// Cắt ký tự đầu tiên và chèn vào cuối mỗi khi thủ tục này được gọi Private Sub tmrScroll_Timer() Me.Caption = Mid(Me.Caption, 2) & Left(Me.Caption, 1) End Sub

Private Sub cmdBatDau_Click() tmrScroll.Enabled = True End Sub

Private Sub cmdDung_Click() tmrScroll.Enabled = False End Sub

Bài 17 a. Thiết kế giao diện (tên của các điều khiển được viết chữ đậm bên cạnh)

Hình 2.42 - Đặt tên cho các điều khiển

Page 68: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 68

b. Hướng dẫn: Sử dụng một Timer để liên tục lấy giờ hiện tại trong máy tính và đem so sánh với giờ - phút đã được hẹn báo thức. Nếu thấy bằng nhau thì thực hiện chơi file nhạc chỉ định trong Textbox. c. Chương trình mẫu

'/// Khai báo hàm API để mở một file bất kỳ Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long '----------------------------------------------------------------------------------------------------------------------------- Private Sub Form_Load() tmrBaoThuc.Interval = 100 '/// Cứ sau 100 ms thì thực hiện kiểm tra 1 lần

'/// Chèn một số mục vào hộp Combo Giờ và Phút Dim i As Integer For i = 0 To 23 cboGio.AddItem i Next For i = 0 To 59 cboPhut.AddItem i Next End Sub '-----------------------------------------------------------------------------------------------------------------------------

Private Sub tmrBaoThuc_Timer()

Dim T As Date

T = Now '/// Lấy giờ hiện tại của hệ thống và so sánh. Nếu bằng thì mở file nhạc

If (Hour(T) = cboGio.Text) And (Minute(T) = cboPhut.Text) Then

ShellExecute Me.hwnd, "open", txtTenFile.Text, vbNullString, "C:\", 1 '/// Mở file

tmrBaoThuc.Enabled = False

End If '/// Thông tin về giờ, phút hiện tại hiển thị trên thanh tiêu đề Me.Caption= "Bây giờ là: " & Hour(T) & "h:" & Minute(T) & "':" & Second(T) & "''"

End Sub '----------------------------------------------------------------------------------------------------------------------------- Private Sub cmdDongY_Click()

tmrBaoThuc.Enabled = True

End Sub

d. Ghi chú:

• Hàm ShellExecute rất hay được dùng để mở một file bất kỳ trong ứng dụng có hỗ trợ file đó. Ví dụ: khi ShellExecute một file có đuôi là .doc thì hàm này sẽ gọi MS Word để mở file này.

• Hàm Now luôn trả về ngày, tháng, năm và giờ, phút, giây hiện tại trong máy tính. Còn để trích riêng các thành phần đó ra thì cần phải các hàm xử lý tương ứng là Year, Month, Hour, Minute ….

• Nên sử dụng điều khiển Timer để Check (kiểm tra) giờ của hệ thống sau đó thực hiện các công việc cần thiết. Không nên sử dụng nó vào mục đích đếm giờ, vì đồng hồ này sẽ thường xuyên bị "chạy chậm" hơn so với máy tính.

Page 69: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 69

Bài 18 a. Thiết kế giao diện: Cần 4 Label, 1 Shape (Shape=3-circle), 1 timer và một Line.

Hình 2.43 - Đặt tên và thuộc tính cho các điều khiển

b. Hướng dẫn Liên tục lấy thời gian hiện tại và cập nhật vị trí của đường thẳng (Kim giây). c. Chương trình mẫu

Option Explicit Dim BanKinh As Single, Goc As Single Private Sub Form_Load() With linKimGiay BanKinh = Sqr((.X2 - .X1) ^ 2 + (.Y2 - .Y1) ^ 2) End With

tmrCapNhatKimGiay.Enable = True tmrCapNhatKimGiay.Interval = 10 End Sub '----------------------------------------------------------------------------------------------------------------------------- Private Sub tmrCapNhatKimGiay_Timer() Goc = (Second(Now)) * 6 / 180 * 3.14 '/// Đổi ra Radian With linKimGiay .X2 = .X1 + BanKinh * Sin(Goc) .Y2 = .Y1 - BanKinh * Cos(Goc) End With End Sub

d. Ghi chú:

• Có thể cho kim giây chạy "mịn" hơn (như đồng hồ analog) thì cần tính toán lại và có tính đến Miligiây.

• Có thể sử dụng từ khoá With…End with để tránh phải nhắc lại tên đối tượng khi truy cập vào các thuộc tính của nó.

• Có thể cải tiến để trở thành chiếc đồng hồ hoàn chỉnh với 3 kim

Page 70: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 70

Bài 19 a. Thiết kế giao diện

Hình 2.44 - Đặt tên và thiết lập các thuộc tính cho các điều khiển

b. Hướng dẫn Hàm API GetasyncKeyState(n) cho ta biết trạng thái của phím có mã là n có được nhấn hay không (dù nhấn ở bất kỳ ứng dụng nào), do vậy ta có thể sử dụng một Timer liên tục kiểm tra toàn bộ các phím và nếu thấy trạng thái của phím nào được nhấn thì ghi nhận lại vào trong một Textbox. c. Chương trình mẫu

Option Explicit Private Declare Function GetasyncKeyState Lib "user32" (ByVal vKey As Long) As Integer Dim PrevKey As String, i As Integer '///PrevKey để lưu trạng thái của phím nhấn trước đó

Private Sub Form_Load() tmrLogger.Interval = 10 '/// Cứ 10 ms lại kiểm tra phím nhấn 1 lần tmrLogger.Enabled = False '/// Khi người dùng click "bắt đầu" thì mới bắt phím End Sub '/// Hàm này kiểm tra và lấy về phím được nhấn Function GetPressedKey() As String Dim i As Integer For i = 32 To 128 '/// Kiểm tra từng phím xem có được nhấn hay không. If GetasyncKeyState(i) <> 0 Then '/// Phím có mã là i đã được nhấn GetPressedKey = Chr$(i) '///Chuyển sang xâu và gán cho hàm Exit For End If Next i End Function '----------------------------------------------------------------------------------------------------------------------------- '/// Liên tục kiểm tra trạng thái phím nhấn, nếu xuất hiện thì lưu vào Textbox Private Sub tmrLogger_Timer() Dim Key As String Key = GetPressedKey If Key <> PrevKey Then txtKeys.Text = txtKeys.Text & Key PrevKey = Key End If End Sub '-----------------------------------------------------------------------------------------------------------------------------

Page 71: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 71

'/// Bắt đầu cho đồng hồ chạy để theo dõi phím nhấn Private Sub cmdBatDau_Click() tmrLogger.Enabled = True End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Kết thúc : Ghi các phím nhấn đã lưu trong Textbox vào file c:\Keys.txt Private Sub cmdKetThuc_Click() tmrLogger.Enabled = False Dim F As Long F = FreeFile Open "c:\Keys.txt" For Output As #F Print #F, txtKeys.Text Close #F MsgBox "Các phím đã được lưu trong tệp c:\Keys.txt", vbInformation, "Saved" End Sub

d. Ghi chú

• Có thể bắt cả chuột và bàn phím một cách hiệu quả hơn bằng kỹ thuật Hook. Tuy nhiên đây cũng là một cách đơn giản nhất để bắt các phím nhấn ở trong các ứng dụng khác.

• Các phím nhấn nhận về luôn ở dạng chữ HOA dù ta có bật Caplock hay k0?

• Kết quả nhận được có thể bị sai một số ký tự đầu tiên nếu như khi chạy ứng dụng vẫn còn một số ký tự trong bộ đệm.

Bài 20

a. Thiết kế giao diện: cần 4 nút và ; ; với tên được đặt như hình sau đây.

Hình 2.45 - Đặt tên cho các điều khiển

b. Hướng dẫn

• Sử dụng hàm FileLen để lấy kích thước file

• Hàm ShellExecute để mở file

• Thủ tục Kill để xoá file

• Đặt lại đường dẫn (Path) mới cho các điều khiển Dir và File mỗi khi Drive1 và Dir1 tương ứng thay đổi (trong sự kiện change).

Page 72: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 72

c. Chương trình mẫu Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long '----------------------------------------------------------------------------------------------------------------------------- '/// Khi nội dung trong Drive1 thay đổi thì cũng thay đổi lại đường dẫn trong Dir1 Private Sub Dir1_Change() File1.Path = Dir1.Path End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Khi nội dung trong Dir1 thay đổi thì cũng thay đổi lại đường dẫn trong File1 Private Sub Drive1_Change() Dir1.Path = Drive1.Drive End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Xem kích thước của file đang được chọn Private Sub cmdKichThuoc_Click() On error Goto Err MsgBox "Kích thước file là : " & FileLen(File1.Path & "\" & File1.FileName) & " bytes" Exit Sub Err: Msgbox "Lỗi xuất hiện ! mã lỗi là : " & Err.Number End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Mở file đang được chọn bằng hàm ShellExecute Private Sub cmdMoFile_Click() On error resume Next ShellExecute Me.hwnd, "open", File1.Path & "\" & File1.FileName, vbNullString, "C:\", 1 End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Thực hiện xoá file đang được chọn Private Sub cmdXoaFile_Click() On error Goto Err If MsgBox("Xoá file """ & File1.FileName & """ ?", vbYesNo, "Confirm") = vbYes Then Kill File1.Path & "\" & File1.FileName File1.Refresh '/// Cập nhật lại nội dung trong File1 End If

Exit Sub '/// Cần phải có, nếu không lệnh MsgBox ở dưới sẽ được thực hiện Err:

Msgbox "Có lỗi xuất hiện. " & Err.Description End Sub '----------------------------------------------------------------------------------------------------------------------------- Private Sub cmdThoat_Click() End End Sub

d. Ghi chú

• Khi làm việc vào ra với File, có thể xuất hiện lỗi. Do vậy, để đảm bảo không bị lỗi runtime thì cần phải bắt lỗi bằng lệnh On error goto và On error Resume…

• Lệnh On error Goto <Nhãn> thì khi gặp lỗi, chương trình sẽ nhảy đến nhãn đã được chỉ định trước. Còn đối với lệnh On error Resume Next thì chương trình vẫn cứ tiếp tục chạy câu lệnh tiếp theo, bỏ qua câu lệnh gây lỗi.

• Thuộc tính Path của điều khiển File chỉ trả về thư mục chứa file hiện hành, còn thuộc tính FileName thì trả về tên file nhưng không chứa đường dẫn.

Page 73: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 73

Bài 21 a. Thiết kế giao diện (như bài tập 20). b. Hướng dẫn: Nạp biểu tượng (icon) cho điều khiển nguồn thông qua thuộc tính DragIcon. Tiếp theo viết lệnh cho thủ tục sự kiện Drop của điều khiển đích. Việc kéo thả thực sự chỉ diễn ra khi gọi phương thức Drag của điều khiển nguồn (thường gọi trong thủ tục sự kiện MouseDown) c. Chương trình mẫu

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long '--------------------------------------------------------------------------------------------------------------------------- '/// Thủ tục này sẽ được gọi khi người dùng thả (drop) 1 file từ điều khiển File1 '/// Tham số Source lúc này chính là điều khiển File1, và như vậy để lấy tên file và đường '/// dẫn mà người dùng vừa "thả" thì sử dụng thuộc tính Path và FileName như đối với '/// điều khiển file '--------------------------------------------------------------------------------------------------------------------------- Private Sub cmdXoaFile_DragDrop(Source As Control, X As Single, Y As Single) If MsgBox("Xoá """ & Source.FileName & """ ?", vbYesNo, "Confirm") = vbYes Then Kill Source.Path & "\" & Source.FileName '/// Kill là lệnh xoá file Source.Refresh '/// cập nhật lại sự thay đổi vừa tạo ra đối với File1 End If End Sub '----------------------------------------------------------------------------------------------------------------------------- Private Sub Dir1_Change() File1.Path = Dir1.Path '/// Các file hiển thị trong File1 bây giờ là Dir1.Path . End Sub '----------------------------------------------------------------------------------------------------------------------------- Private Sub Drive1_Change() Dir1.Path = Drive1.Drive '/// Thư mục hiển thị trong Dir1 bây giờ là ổ đĩa Drive1.Drive End Sub '----------------------------------------------------------------------------------------------------------------------------- Private Sub Form_Load() Dim F As String F = "C:\Program Files\Microsoft Visual Studio\Common\Graphics\Icons\Office\folder03.ico" File1.DragIcon = LoadPicture(F) '/// Nạp biểu tượng khi kéo file trong File1 End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Thực hiện kéo thả đối với file vừa được chọn Private Sub File1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) File1.Drag End Sub '///------------------------------------------------------------------------------------------------------------------------ '/// Mở file vừa chọn khi người dùng thả một file vào nút cmdMoFile. Tham số Source bây giờ '/// chính là điều khiển File1. Nên có thể sử dụng thuộc tính Path và FileName ! '///------------------------------------------------------------------------------------------------------------------------- Private Sub cmdMoFile_DragDrop(Source As Control, X As Single, Y As Single) ShellExecute Me.hwnd, "open", Source.Path & "\" & Source.FileName, vbNullString, "C:\", 1 End Sub '----------------------------------------------------------------------------------------------------------------------------- Private Sub cmdMoFile_Click() ShellExecute Me.hwnd, "open", File1.Path & "\" & File1.FileName, vbNullString, "C:\", 1 End Sub

Page 74: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 74

Private Sub cmdXoaFile_Click() If MsgBox("Xoá """ & File1.FileName & """ ?", vbYesNo, "Confirm") = vbYes Then Kill File1.Path & "\" & File1.FileName File1.Refresh End If End Sub

Private Sub cmdKichThuoc_DragDrop(Source As Control, X As Single, Y As Single) On Error GoTo Err MsgBox "Kích thước là : " &FileLen(Source.Path & "\" & Source.FileName) &" bytes" Exit Sub Err: MsgBox "Có lỗi xuất hiện !" End Sub

Private Sub cmdKichThuoc_Click() On Error Resume Next MsgBox "Kích thước là : " & FileLen(File1.Path & "\" & File1.FileName) & " bytes" End Sub

d. Ghi chú • Có thể tham khảo thêm về Drag và Drop trong bộ trợ giúp MSDN với topic

"Drag Method" và chọn thêm phần Sample. • Khi thao tác với tệp, thư mục có nhiều trường hợp xảy ra lỗi do vậy cần phải

bắt lỗi với phát biểu "On error goto err" hoặc "On error resume Next" (Xin tham khảo thêm trong MSDN).

• 3 điều khiển DriveListBox, DirListBox và FileListBox không nhất thiết lúc nào cũng phải đi cùng với nhau. Thực tế nếu muốn hiển thị nội dung của một ổ đĩa nào đó trong điều khiển DirListbox thì ta chỉ việc gán tên ổ đĩa cho thuộc tính Path, ví dụ: Dir1.Path = "e:" thì lập tức nội dung của ổ đĩa E: sẽ được hiển thị trong DirListbox. Tuy nhiên, vì thuộc tính Drive của điều khiển DriveListbox trả về tên ổ đĩa mà người dùng chọn nên ta thường gán giá trị này cho thuộc tính Path của DirListbox. Tương tự với điều khiển FileListbox.

• Khi sự kiện "Drop" của đối tượng đích xuất hiện thì tham số Source của thủ tục sự kiện đó sẽ trỏ đến (hay chính là) điều khiển nguồn. Nên ta có thể gọi các thuộc tính và phương thức của đối tượng nguồn thông qua Source.

Bài 22 a. Thiết kế giao diện như hình 46 (Tên của các điều khiển được đặt trong ô tròn)

Hình 2.46 - Đặt tên cho các điều khiển

Page 75: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 75

b. Hướng dẫn Vì chương trình cho phép người dùng lựa chọn nhiều file (Multiselect) nên cần đặt thuộc tính MultiSelect của điều khiển File là True. Sau đó tính tổng kích thước các file bằng hàm FileLen. c. Chương trình mẫu Option Explicit Private Sub cmdThem_Click()

Dim i As Integer, TongKichThuoc As Long

'/// Thêm tên các file đang được chọn (Selected = true) vào danh sách

For i = 0 To File1.ListCount - 1

If File1.Selected(i) = True Then lstDanhSachFile.AddItem File1.Path & "\" & File1.List(i)

Next

'/// Tính tổng kích thước các file đã cho vào danh sách (Listbox) TongKichThuoc = 0 For i = 0 To lstDanhSachFile.ListCount - 1

TongKichThuoc = TongKichThuoc + FileLen(lstDanhSachFile.List(i))

Next

'/// hiển thị kết quả tính toán ra Label

lblSL.Caption = "Tổng số file : " & lstDanhSachFile.ListCount

lblKT.Caption = "Tổng kích thước : " & TongKichThuoc & " bytes"

End Sub '----------------------------------------------------------------------------------------------------------------------------- Private Sub Dir1_Change()

File1.Path = Dir1.Path '/// Phản ánh sự thay đổi của Dir1 vào File1

End Sub '----------------------------------------------------------------------------------------------------------------------------- Private Sub Drive1_Change()

Dir1.Path = Drive1.Drive '/// Phản ánh sự thay đổi của Drive1 vào Dir1

cmdThem.ToolTipText = "Thêm file vào danh sách"

End Sub

d. Ghi chú:

• Thuộc tính Selected(i) cho biết mục có chỉ số i được chọn hay không? • Thuộc tính Selected này cũng có trong rất nhiều điều khiển khác và cũng có

cách sử dụng tương tự. • Khi thực hành thì có thể cần phải kiểm tra các file xem đã có trong danh sách

(Listbox) phía bên phải hay chưa ? Nếu chưa có thì mới thêm. • Biểu tượng trong nút cmdThem ở trên chỉ có ý nghĩa minh hoạ, không nhất

thiết phải có, do vậy bạn có thể đưa vào hoặc không. • Khi chèn một biểu tượng (Icon) vào điều khiển Command button chuẩn thì

trước tiên cần phải đặt thuộc tính Style = 1-Graphical.

Page 76: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 76

Bài 23 a. Thiết kế giao diện

Hình 2.47 - Đặt tên và thuộc tính cho các điều khiển

b. Hướng dẫn

• Đặt thuộc tính Stretch của Image là True để có thể kéo giãn ảnh. • Khi Form thay đổi (Sự kiện Form_Resize) thì đặt lại kích thước của Image

đúng bằng kích thước của Form. c. Chương trình mẫu

Option Explicit '/// Mở hộp thoại chọn file (nhưng chỉ hiển thị những file ảnh) Private Sub cmdChonFile_Click() dlgChonFile.Filter = "Tất cả (*.*)|*.*|File ảnh (BMP, JPG, GIF)|*.bmp;*.GIF;*.JPG|" dlgChonFile.ShowOpen On Error GoTo Err imgBack.Picture = LoadPicture(dlgChonFile.FileName) '///Nạp file vừa chọn Exit Sub Err: MsgBox "Có lỗi khi nạp file : " & Err.Description, vbCritical, "Thông báo." End Sub '----------------------------------------------------------------------------------------------------------------------------- '///Hàm LoadPicture() không tham số có nghĩa là nạp file rỗng. Private Sub cmdHuyBo_Click() imgBack.Picture = LoadPicture() End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Cập nhật kích thước của image bằng với kích thước của form mỗi khi form thay đổi Private Sub Form_Resize() imgBack.Top = 0 imgBack.Left = 0 imgBack.Width = Me.ScaleWidth imgBack.Height = Me.ScaleHeight End Sub

d. Ghi chú

• Nên sử dụng cách thức này khi cần đặt ảnh nền cho Form, bởi vì nếu đặt ngay thuộc tính Picture của Form thì trong một số trường hợp kích thước của Form và của ảnh sẽ bị chênh nhau khi ở các máy tính có độ phân giải cao.

Page 77: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 77

• Khi muốn huỷ bỏ ảnh trong điều khiển Image (hoặc các điều khiển khác có thuộc tính Picture) thì chỉ việc gán thuộc tính này giá trị : LoadPicture().

Bài 24 a. Thiết kế giao diện

Hình 2.48 - Tạo Menu và đặt tên cho điều khiển PictureBox

b. Hướng dẫn : Thêm vào Form một điều khiển PictureBox và tạo một Menu như hình trên. Có thể tham khảo về system tray trong trang http://www.allapi.net. c. Chương trình mẫu

Option Explicit '/// §Þnh nghÜa cÊu tróc l−u tr÷ th«ng tin vÒ Icon d−íi khay hÖ thèng Private Type NOTIFYICONDATA cbSize As Long hwnd As Long uId As Long uFlags As Long ucallbackMessage As Long hIcon As Long szTip As String * 64 End Type Private Const NIM_ADD = &H0 Private Const NIM_DELETE = &H2 Private Const NIF_MESSAGE = &H1 Private Const NIF_ICON = &H2 Private Const NIF_TIP = &H4 '/// §Þnh nghÜa c¸c h»ng Private Const WM_LBUTTONDBLCLK = &H203 Private Const WM_LBUTTONDOWN = &H201

Page 78: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 78

Private Const WM_RBUTTONUP = &H205 '/// Khai b¸o hμm API xö lý Icon trong khay hÖ thèng Private Declare Function Shell_NotifyIcon Lib "shell32" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, pnid As NOTIFYICONDATA) As Boolean Dim TrayI As NOTIFYICONDATA Dim Msg As Long '----------------------------------------------------------------------------------------------------------------------------- Private Sub Form_Load() TrayI.cbSize = Len(TrayI) '///§Æt Hangle cña cöa sæ TrayI.hwnd = Picture1.hwnd '///§Æt ®Þnh danh cho khay biÓu t−îng TrayI.uId = 1& '///ThiÕt lËp c¸c cê TrayI.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE '///ThiÕt lËp Message CallBack TrayI.ucallbackMessage = WM_LBUTTONDOWN '///§Æt biÓu t−îng cho khay (Ph¶i lμ mét biÓu t−îng) TrayI.hIcon = Picture1.Picture '///§Æt dßng nh¾c khi chuét di chuyÓn qua biÓu t−îng d−íi Khay hÖ thèng TrayI.szTip = "Faculty of Information Technology - UTE Hung Yen" & Chr$(0) '///T¹o biÓu t−îng võa thiÕt lËp ®ã Shell_NotifyIcon NIM_ADD, TrayI '/// N¹p mét biÓu t−îng vμo Picture (Cã thÓ ®Æt ngay cho thuéc tÝnh Picture lóc thiÕt kÕ) Dim DuongDan As String DuongDan = "C:\Program Files\Microsoft Visual Studio\Common\Graphics\Icons\Misc\FACE02.ICO" picIcon.Picture = LoadPicture(DuongDan) '///Èn form (ChØ hiÓn thÞ Icon trªn khay hÖ thèng) Me.Hide End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Thñ tôc xo¸ (Remove) biÓu t−îng trong khay hÖ thèng Sub Deletetray() TrayI.cbSize = Len(TrayI) TrayI.hwnd = Picture1.hwnd TrayI.uId = 1& Shell_NotifyIcon NIM_DELETE, TrayI End Sub '----------------------------------------------------------------------------------------------------------------------------- Private Sub mnuAbout_Click() MsgBox "T¹o menu d−íi System tray !. ", vbInformation End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Xö lý khi ng−êi dïng Click chuét lªn biÓu t−îng trong khay hÖ thèng Private Sub picIcon_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Msg = X / Screen.TwipsPerPixelX

Page 79: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 79

If Msg = WM_LBUTTONDBLCLK Then

MsgBox "Xö lý c«ng viÖc khi ng−êi dïng click ®óp chuét" ElseIf Msg = WM_RBUTTONUP Then '///Xö lý khi ng−êi dïng click ph¶i chuét lªn Icon Me.PopupMenu mnuMain '//// HiÓn thÞ menu mnuMain cña Form End If End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Xo¸ biÓu t−îng vμ tho¸t khi ng−êi dïng chän môc Exit Private Sub mnuExit_Click() Call Deletetray End End Sub

d. Ghi chú

• Phương thức PopupMenu của Form được dùng để hiển thị một menu ở ngay vị trí click chuột mà không nhất thiết phải ở trên thanh menu. Do vậy, có thể áp dụng cách thức này khi xây dựng các ứng dụng đòi hỏi có menu xổ lên (Menu popup).

• Có thể nghiên cứu thêm các hàm API như GetMenu, GetSubMenu, GetMenuItemID, ModifyMenu… để tuỳ biến và đưa các biểu tượng vào các mục menu.

C- BÀI TẬP TỰ GIẢI Bài 1. Viết chương trình "đồng hồ báo thức". Chiếc đồng hồ này sẽ thực hiện "Reo chuông" (Chơi đi chơi lại một file nhạc tiếng) cho đến khi nào người dùng tắt ứng dụng thì thôi. Bài 2: Tạo chiếc đồng hồ có đầy đủ 3 Kim (Giờ, phút, giây). Mặt đồng hồ là một bức ảnh thật. Bài 3: Viết chương trình Soạn thảo văn bản đơn giản. Bài 4: Viết chương trình quản lý và xem các file hình ảnh. Bài 5: Viết lại chương trình KeyLogger để thu được nội dung chuẩn mà người dùng đã gõ, tức là nếu người dùng nhấn phím xoá (←) thì nội dung cũng phải xoá …. Bài 6: Viết chương trình quản lý điểm cho một lớp. Thông tin có thể được lưu và nạp từ file. Bài 7: Viết chương trình "máy tính bỏ túi", có khả năng thực hiện các phép toán cộng, trừ, nhân, chia, bình phương, chuyển đổi giữa các hệ cơ số…. Bài 8: Sử dụng điều khiển FlexGrid hoặc điều khiển Grid, viết trò chơi xếp ô chữ. Trò chơi này như sau: Một bàn có kích thước n x n ô, trong đó có n x n -1 ô chứa các số từ 1 đến n x n – 1 và một ô để trống. Các ô được đặt ở các vị trí ngẫu nhiên và nhiệm vụ của người chơi là xếp các số theo đúng thứ tự từ 1 đến n x n – 1. Bài 9: Viết chương trình định dạng font cho các từ khoá của một chương trình nguồn viết trên ngôn ngữ Visual Basic (có thể mở rộng sang các ngôn ngữ khác). Dữ liệu vào là chương trình nguồn chứa trong tệp văn bản RTF. HD: Sử dụng điều khiển Richtext và sử dụng các phương thức Find để tìm và đặt SelText = Bold v.v..

Page 80: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 80

Ch−¬ng iiI SỬ DỤNG HỘP THOẠI CHUẨN & MENU

MỤC TIÊU: SAU KHI HOÀN THÀNH CÁC BÀI TẬP, NGƯỜI HỌC CÓ THỂ Xây dựng được các hệ thống menu một cấp nhiều cấp, menu Popup Xây dựng được các hệ thống thanh công cụ - Toolbar. Sử dụng thành thạo các thuộc tính và phương thức của điều khiển Dialog Phân biệt được giữa ứng dụng đa cửa sổ và đơn cửa sổ. Viết được một ứng dụng soạn thảo văn bản đơn giản với đa cửa sổ.

A - ĐỀ BÀI TẬP Bài 1: Xây dựng chương trình soạn thảo văn bản sử dụng điều khiển RichText.

Hình 3.1 – giao diện chương trình

Yêu cầu: • Chương trình hỗ trợ các phím tắt (Ctrl-O để mở, Ctrl-S để lưu v.v…) • Có thể định dạng chữ Đậm, nghiêng, gạch chân bằng cách nhấn tổ hợp phím

tắt tương ứng là Ctrl-B, Ctrl-I, Ctrl-U. • Vùng soạn thảo (Textbox) có thể thay đổi kích thước khi Form thay đổi. • Khi một mục trên thanh menu được chọn thì mục đó sẽ được đánh dấu " "

Bài 2: Xây dựng chương trình như bài 1 nhưng có thêm menu "Màu chữ" cho phép người dùng đặt màu chữ cho nội dung văn bản.

Hình 3.2 – Giao diện chương trình (Có thêm mục chọn "Màu chữ")

Page 81: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 81

Bài 3: Xây dựng chương trình như bài 2, nhưng thêm khả năng hiển thị menu ngữ cảnh như sau: Khi người dùng chọn một đoạn văn bản và click chuột phải trong Richtextbox thì hiển thị (Popup) menu "Định dạng" còn khi người dùng không chọn đoạn văn bản nào nhưng click chuột phải thì hiển thị Menu "File". Tuy nhiên, việc định dạng font chữ ở đây là định dạng riêng cho phần được bôi đen.

Hình 3.3 - Hiển thị menu cảm ngữ cảnh

Bài 4: Xây dựng chương trình như bài 3 nhưng sử dụng cơ chế đa cửa sổ (Multi documents). Tức là chương trình cho phép soạn thảo nhiều tệp tin trong nhiều cửa sổ khác nhau.

Hình 3.4 - Hệ thống đa cửa sổ (MultiDocuments)

Bài 5: Xây dựng chương trình như bài 4, nhưng thêm một số mục trên thanh Menu của FormMDI bằng các nút lệnh trên thanh công cụ (ToolBar).

Hình 3.5 - Hệ thống soạn thảo đa cửa sổ với thanh công cụ

Page 82: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 82

Bài 6 : Như bài 5 nhưng chương trình có thêm thanh trạng thái (status bar) trong

form chính (Xem hình 6). Trong thanh trạng thái có 3 ô, ô thứ nhất cho biết tổng số

ký tự trong Richtextbox, ô thứ hai hiển thị thời gian, ô thứ 3 hiển thị ngày trong máy

tính.

Hình 3.6 - Bổ sung thêm thanh trạng thái

Page 83: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 83

B. HƯỚNG DẪN - GIẢI MẪU Bài 1 a. Thiết kế giao diện

Hình 3.10 – Giao diện chương trình

Hình 3.11 - Đặt tên cho mục Menu

Ngoài ra, trong lúc thiết kế đặt thuộc tính Scrollbar của Richtextbox là 3- Both b. Hướng dẫn:

• Kết hợp sử dụng điều khiển Common Dialog để mở, lưu File • Sử dụng phương thức LoadFile, SaveFile để nạp, lưu file đang soạn thảo

c. Chương trình mẫu

Option Explicit '/// Xử lý khi người dùng click vào mục ""Đặt Font chữ" trên menu Private Sub mnuFont_Click() dlgMain.Flags = cdlCFBoth Or cdlCFEffects '/// Phải có trước khi ShowFont dlgMain.ShowFont '/// Hiển thị hộp thoại chọn font

'/// Đặt font chữ của Richtext theo như thông tin người dùng đã chọn rtfNoiDung.Font.Name = dlgMain.FontName

Page 84: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 84

rtfNoiDung.Font.Bold = dlgMain.FontBold rtfNoiDung.Font.Italic = dlgMain.FontItalic rtfNoiDung.Font.Underline = dlgMain.FontUnderline rtfNoiDung.Font.Size = dlgMain.FontSize End Sub '/// Đảo lại trạng thái trước đó: Nghiêng Không nghiêng, Chọn Không chọn Private Sub mnuItalic_Click() mnuItalic.Checked = Not mnuItalic.Checked '/// Hiện / ẩn dấu tích ( ) rtfNoiDung.Font.Italic = Not rtfNoiDung.Font.Italic '///Nghiêng Không nghiêng End Sub '/// Xử lý cập nhật lại định dạng và trạng thái chọn khi người dùng chọn "Chữ nghiêng" Private Sub mnuUnderline_Click() mnuUnderline.Checked = Not mnuUnderline.Checked rtfNoiDung.Font.Underline = Not rtfNoiDung.Font.Underline End Sub '/// Xử lý cập nhật lại định dạng và trạng thái chọn khi người dùng chọn "Chữ đậm" Private Sub mnuBold_Click() mnuBold.Checked = Not mnuBold.Checked rtfNoiDung.Font.Bold = Not rtfNoiDung.Font.Bold End Sub '/// Tạo mới tài liệu khi người dùng chọn mục "New Ctrl-N" Private Sub mnuNew_Click() rtfNoiDung.TextRTF = "" End Sub '/// Xử lý mở file sử dụng điều khiển Dialog. Private Sub mnuOpen_Click() dlgMain.Filter = "Các file RTF |*.rtf|Các file TXT|*.txt|Tất cả các file (*.*)|*.*|" dlgMain.DialogTitle = "Më file" dlgMain.ShowOpen rtfNoiDung.LoadFile dlgMain.FileName End Sub '/// Lưu nội dung đang soạn ra đĩa, sử dụng phương thức SaveFile của Richtext Private Sub mnuSave_Click() dlgMain.Filter = "Các file RTF |*.rtf|Các file TXT|*.txt|Tất cả các file (*.*)|*.*|" dlgMain.DialogTitle = "Lưu văn bản ra file" dlgMain.ShowSave rtfNoiDung.SaveFile dlgMain.FileName, rtfRTF End Sub '/// Thay đổi kích thước của Richtext để nó luôn bằng Form mỗi khi kéo giãn Form Private Sub Form_Resize() rtfNoiDung.Top = 0 rtfNoiDung.Left = 0 rtfNoiDung.Height = Me.ScaleHeight rtfNoiDung.Width = Me.ScaleWidth End Sub

d. Chú ý:

• Có thể gán tổ hợp phím tắt cho các mục menu trong khi soạn Menu

Page 85: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 85

• Hộp thoại Common Dialog không tự lưu file hay mở file mà nó chỉ cung cấp một hộp thoại để người dùng chọn hay gõ tên file mà thôi.

• Có thể thay đổi phần mở rộng mặc định khi hộp Dialog mở ra • Khi hộp thoại Dialog mở ra, rất có thể người dùng sẽ nhấn Cancel. Khi đó, tên

file nhận được sẽ là tên được mở trước đó. Như vậy, thực tế cần phải biết được người dùng đã nhấn "Open" hay nút "Cancel" để có xử lý phù hợp.

• Font chữ trong menu thường là font hệ thống do vậy, nhìn chung là sẽ không hiển thị đúng trên các máy tính khác nhau khi chúng ta sử dụng Tiếng việt.

• Khi lưu tệp văn bản bằng phương thức SaveFile, có một tham số cho biết là lưu dưới dạng tệp văn bản (Text) hay tệp Richtext. Giá trị của tham số này tương ứng là rtfText và rtfRTF.

Bài 2 a. Giao diện như bài 1 nhưng có thêm mục "Màu chữ" với tên là mnuForeColor. b. Hướng dẫn: Sử dụng phương thức ShowColor của điều khiển Dialog c. Chương trình mẫu: (Chèn thêm đoạn lệnh xử lý sự kiện mnuForeColor_Click vào phần Code của bài 1)

'///…………chèn phần chương trình nguồn của bài 1 vào đây ………………. Private Sub mnuForeColor_Click() dlgMain.ShowColor rtfNoiDung.SelStart = 0 rtfNoiDung.SelLength = Len(rtfNoiDung.Text) rtfNoiDung.SelColor = dlgMain.Color rtfNoiDung.SelLength = 0 End Sub

d. Ghi chú • Điều khiển Richtext không có phương thức cho phép ta đặt màu chữ của toàn

bộ nội dung mà chỉ cho phép đặt màu chữ của phần văn bản được bôi đen thông qua thuộc tính SelColor (Selected Color).

• Có thể chọn (bôi đen) một đoạn văn bản bằng cách thiết lập các thuộc tính SelStart (Selected Start - vị trí bắt đầu bôi đen) và SelLength (Selected Length – Bôi đen bao nhiêu ký tự). Điều này có thể áp dụng cho cả Textbox.

Bài 3 a. Thiết kế giao diện (Như bài tập số 2)

Hiển thị menu "File" khi chưa bôi đen Hiển thị menu "Định dạng" khi bôi đen

Hình 3.12 - Kết quả khi chạy chương trình

Page 86: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 86

b. Hướng dẫn

• Sử dụng phương thức PopupMenu để hiển thị menu tại vị trí con chuột • Đặt thuộc tính chữ đậm, nghiêng, màu … cho các thuộc tính SelBold, SelItalic,

SelColor… tương ứng của điều khiển RichtextBox. • Muốn biết người dùng có bôi đen đoạn văn bản nào đó hay không thì chỉ việc

kiểm tra dữ liệu trong thuộc tính SelText (nếu có thì độ dài của sẽ lớn hơn 0) c. Chương trình mẫu (Chương trình nguồn giống như bài tập số 2 nhưng sửa đổi các thủ tục sự kiện có tên sau đây )

Private Sub mnuItalic_Click() mnuItalic.Checked = Not mnuItalic.Checked rtfNoiDung.SelItalic = Not rtfNoiDung.SelItalic End Sub '----------------------------------------------------------------------------------------------------------------------------- Private Sub mnuUnderline_Click() mnuUnderline.Checked = Not mnuUnderline.Checked rtfNoiDung.SelUnderline = Not rtfNoiDung.SelUnderline End Sub '----------------------------------------------------------------------------------------------------------------------------- Private Sub mnuBold_Click() mnuBold.Checked = Not mnuBold.Checked rtfNoiDung.SelBold = Not rtfNoiDung.SelBold End Sub '----------------------------------------------------------------------------------------------------------------------------- Private Sub mnuForeColor_Click() dlgMain.ShowColor rtfNoiDung.SelColor = dlgMain.Color End Sub '----------------------------------------------------------------------------------------------------------------------------- Sub rtfNoiDung_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single) If Button = 2 Then '/// Nếu click chuột phải (nút chuột trái là 1) If Len(rtfNoiDung.SelText) = 0 Then Me.PopupMenu mnuFile If Len(rtfNoiDung.SelText) > 0 Then Me.PopupMenu mnuFormat End If End Sub

d. Ghi chú: Khi làm việc với điều khiển Richtext, nếu các thuộc tính của điều khiển này có tiền tố là "Sel", ví dụ SelText, SelColor, SelBold… thì ta hiểu là đang làm việc với phần được bôi đen (hay chỉ phần được bôi đen bị tác động) Bài 4 a. Thiết kế giao diện

• Với loại ứng dụng đa cửa sổ này thì trước tiên ta cần phải tạo ra một form dạng "MDI Form". Để tạo menu dạng này, hãy vào menu Project và chọn mục:

. Sau đó, các form về sau khi thêm thì cần đặt thuộc tính MDIChild là True: nếu muốn là con của Form MDI ban đầu.

• Trong bài tập này, tạo 2 form, một form loại MDI với tên là frmMain và một form thường có tên là frmDocument. Trong frmDocument, thêm một Richtext với tên là rtfNoiDung. Trong frmMain, tạo hệ thống menu như sau:

Page 87: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 87

Hình 3.13 – Giao diện của Form MDI

Hình 3.14– Giao diện của frmDocument (cần đặt thuộc tính MDIChild = True)

b. Hướng dẫn

• Sử dụng từ khoá New để tạo một thể hiện form mới. • Sử dụng hàm ActiveForm để trỏ tới form đang được kích hoạt.

c. Chương trình mẫu (Viết cho form: frmDocument và MDI: frmMain)

frmDocument.frm Option Explicit '/// Khi người dùng kéo giãn Form thì đặt lại kích thước của Richtext bằng với Form Private Sub Form_Resize() rtfNoiDung.Top = 0 rtfNoiDung.Left = 0 rtfNoiDung.Height = Me.ScaleHeight rtfNoiDung.Width = Me.ScaleWidth End Sub

frmMain.frm Option Explicit Dim SoTT As Integer '/// Biến dùng để lưu số lượng Form tạo ra '/// Người dùng click chọn menu : "Tài liệu mới" Private Sub mnuNew_Click() Dim F As New frmDocument '///Tạo một thể hiện mới của frmDocument SoTT = SoTT + 1 F.Caption = "Tài liệu thứ " & SoTT '/// Đặt tiêu đề cho cửa sổ (form) mới F.Show '/// Hiển thị form vừa tạo End Sub

Page 88: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 88

'/// Người dùng click chọn mục "mở tài liệu" Private Sub mnuOpen_Click() Dim TenFile As String dlgMain.Filter = "Tất cả các file văn bản |*.rtf;*.txt|Tất cả các file|*.*|" dlgMain.ShowOpen TenFile = dlgMain.FileName Dim FormMoi As New frmDocument '///Tạo 1 thể hiện mới của frmDocument FormMoi.Caption = TenFile '/// Đặt caption là tên của file vừa mở FormMoi.rtfNoiDung.LoadFile TenFile '/// Nạp file đó vào điều khiển Richtext End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Lưu nội dung trong Richtext của của form đang kích hoạt ra file Private Sub mnuSave_Click() Dim TenFile As String Dim FormDangSoanThao As frmDocument '/// Khai báo biến Form dlgMain.Filter = "Tất cả các file văn bản|*.txt|File RTF|*.rtf|Tất cả các file|*.*|" dlgMain.ShowSave TenFile = dlgMain.FileName Set FormDangSoanThao=ActiveForm '///Gán biến file cho form đang kích hoạt FormDangSoanThao.rtfNoiDung.SaveFile TenFile, rtfRTF '/// Lưu ra file FormDangSoanThao.Caption = TenFile '/// Cập nhật lại tiêu đề của form End Sub

d. Ghi chú

• Trong khi chương trình đang chạy, nếu muốn tạo ra một form mới có đầy đủ tính chất như một form đã có thì sử dụng từ khoá : Dim <Biến> As New <Tên form đang tồn tại>, như ví dụ ở trên. Ngoài ra còn có một cách khác, ví dụ: Dim F As frmDocument Set F = New frmDocument

• Trong trường hợp một ứng dụng có nhiều form cùng tồn tại thì ActiveForm sẽ trả về (trỏ tới) form đang được kích hoạt.

• Có thể thay đổi màu nền của form MDI bằng cách đặt lại thuộc tính BackColor, hay cũng có thể đặt vào đó một file ảnh qua thuộc tính picture.

• Muốn một form ở dạng MDIChild thì đặt thuộc tính MDIChild = True. • Nếu form con có hệ thống menu thì menu của form MDI sẽ bị ẩn đi. • Nếu các form đã được đóng hết và người dùng click chọn mục "Lưu file ra

đĩa" thì sẽ có lỗi xuất hiện. Ở đây có 2 giải pháp : thứ nhất là "Disable" mục này. thứ hai là cần kiểm tra giá trị trả về từ hàm ActiveForm. Nếu giá trị này là Nothing thì thoát ngay, cụ thể là: If ActiveForm Is Nothing Then Exit Sub

Bài 5 a. Thiết kế giao diện Hệ thống giao diện giống như bài tập 4, nhưng thêm thanh công cụ (Toolbar) và đối tượng chứa ảnh ImageList. (Tên của các điều khiển được in đậm bên cạnh)

Page 89: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 89

Hình 3.15 – Giao diện form MDI và đặt tên cho các điều khiển

Lưu ý: Thanh công cụ nằm trong thư viện: Microsoft Window Common Control 6.0

Tiếp theo, cần đặt thuộc tính cho 2 điều khiển ImageList và Toolbar như sau: b1. Mở trang Property (click chuột phải và chọn Properties) của điều khiển ImageList như trong hình 16.

Hình 3.16 - Chọn kích thước Icon là 16x16 cho ImageList

Hình 3.17 – Chèn và đặt tên cho các biểu tượng của ImageList

- Các biểu tượng ở đây chỉ mang ý nghĩa minh hoạ cho sinh động, thực tế bạn có thể chọn các biểu tượng khác theo sở thích. - Các biểu tượng nên được đặt tên, như trong bài tập này, 3 biểu tượng ở trên có các tên (Key) lần lượt là icoBold, icoItalic, icoUnderline. Khi đặt tên thì về sau ta có

thuộc tính Key chính là tên.

Page 90: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 90

thể tham chiếu tới nó thông qua tên này. Cũng xin nói thêm ở đây là việc đặt tên bằng chữ thường và chữ HOA là quan trọng. B2. Thêm các nút vào Toolbar và thiết lập các thông số.

Hình 3.19 - Gắn kết Toolbar với điều khiển ImageList

Hình 3.20 – Thêm các nút vào Toolbar và đặt thuộc tính cho mỗi nút

b. Hướng dẫn: Phần viết lệnh trong bài tập này tương tự như bài tập trước, tuy nhiên còn phải chèn thêm vào các sự kiện Click chọn trên thanh công cụ. Khi người dùng click một nút trên thanh công cụ thì sự kiện ButtonClick sẽ xuất hiện. c. Chương trình mẫu

frmDocument.frm '/// Khi người dùng kéo giãn Form thì đặt lại kích thước của Richtext bằng với Form Private Sub Form_Resize() rtfNoiDung.Top = 0 rtfNoiDung.Left = 0 rtfNoiDung.Height = Me.ScaleHeight rtfNoiDung.Width = Me.ScaleWidth End Sub

Đoạn lệnh sau viết trong Form frmMain:

frmMain.frm Dim SoTT As Integer '/// Biến dùng để lưu số lượng Form tạo ra '/// Người dùng click chọn menu : "Tài liệu mới" Private Sub mnuNew_Click() Dim F As New frmDocument '///Tạo một thể hiện mới của frmDocument SoTT = SoTT + 1 F.Caption = "Tài liệu thứ " & SoTT '/// Đặt tiêu đề cho cửa sổ (form) mới F.Show '/// Hiển thị form vừa tạo

Page 91: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 91

End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Người dùng click chọn mục "mở tài liệu" Private Sub mnuOpen_Click() Dim TenFile As String dlgMain.Filter = "Tất cả các file văn bản |*.rtf;*.txt|Tất cả các file|*.*|" dlgMain.ShowOpen TenFile = dlgMain.FileName Dim FormMoi As New frmDocument '///Tạo 1 thể hiện mới của frmDocument FormMoi.Caption = TenFile '/// Đặt caption là tên của file vừa mở FormMoi.rtfNoiDung.LoadFile TenFile '/// Nạp file đó vào điều khiển Richtext End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Lưu nội dung trong Richtext của của form đang kích hoạt ra file Private Sub mnuSave_Click() Dim TenFile As String Dim FormDangSoanThao As frmDocument '/// Khai báo biến Form dlgMain.Filter = "Tất cả các file văn bản|*.txt|File RTF|*.rtf|Tất cả các file|*.*|" dlgMain.ShowSave TenFile = dlgMain.FileName Set FormDangSoanThao=ActiveForm '///Gán biến file cho form đang kích hoạt FormDangSoanThao.rtfNoiDung.SaveFile TenFile, rtfRTF '/// Lưu ra file FormDangSoanThao.Caption = TenFile '/// Cập nhật lại tiêu đề của form End Sub '///--------------------------------------------------------------------------------------------------------------------------- '/// Sự kiện này được kích hoạt khi người dùng click một nút trên thanh Toolbar '/// Khi chọn định dạng đậm, nghiêng, gạch chân thì đảo lại giá trị trước đó (sử dụng phép NOT) '///--------------------------------------------------------------------------------------------------------------------------- Private Sub tbrMain_ButtonClick(ByVal Button As MSComctlLib.Button) Dim F As frmDocument Set F = ActiveForm '/// Trỏ đến Form đang được kích hoạt Select Case Button.Key Case "cmdBold" F.rtfNoiDung.Font.Bold = Not F.rtfNoiDung.Font.Bold If F.rtfNoiDung.Font.Bold = True Then Button.Value = tbrPressed If F.rtfNoiDung.Font.Bold = False Then Button.Value = tbrUnpressed Case "cmdItalic" F.rtfNoiDung.Font.Italic = Not F.rtfNoiDung.Font.Italic If F.rtfNoiDung.Font.Italic = True Then Button.Value = tbrPressed If F.rtfNoiDung.Font.Italic = False Then Button.Value = tbrUnpressed Case "cmdUnderline" F.rtfNoiDung.Font.Underline = Not F.rtfNoiDung.Font.Underline Button.Value=IIf(F.rtfNoiDung.Font.Underline=True, tbrPressed, tbrUnpressed) End Select End Sub

Page 92: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 92

d. Ghi chú

• Khi sự kiện ButtonClick xảy ra thì ta có thể kiểm tra và biết được nút nào đã dược nhấn (chọn) thông qua tham số là Button. ngoài ra, ta cũng có thể cần phải thay đổi luôn trạng thái của nút vừa được nhấn như các nút B, I, U. Khi đó ta chỉ cần thay đổi thuộc tính Value của Button thành tbrPressed (trạng thái nhấn = nút chìm) và tbrUnPressed (trạng thái không nhấn = nút nổi).

• Hàm iif(<Biểu thức logic L>, <GT1>, <GT2>) là một hàm rất hay và ngắn gọn, hàm này sẽ trả về giá trị là GT1 hoặc GT2 tuỳ vào Biểu thức L là true hay False. Nếu Biểu thức logic L là true thì trả về GT1, trái lại trả về GT2.

Bài 6 a. Thiết kế giao diện. Giống như bài số 5, nhưng thêm điều khiển Statusbar (tên là staMain) với thuộc tính được thiết lập như hình 21 dưới đây:

Hình 3.21 – Đặt thuộc tính cho điều khiển StatusBar

Trong đó: Cần tạo ra 3 ô (Panel). Mỗi Panel có thuộc tính Style tương ứng là N1, N2, N3 như chỉ dẫn trong hình 21. b. Hướng dẫn: Viết lệnh trong thủ tục sự kiện Change của Richtext, sau đó đặt nội dung vào panel đầu tiên của thanh trạng thái theo cú pháp: staMain.Panels(1).Text c. Chương trình mẫu: Như bài tập 5 nhưng chèn thêm sự kiện (đoạn lệnh) sau : d. Ghi chú:

• Panel đầu tiên trong thanh trạng thái có chỉ số là 1

• Có thể mở rộng chương trình để trạng thái của các nút nhấn sẽ thay đổi tương ứng với định dạng văn bản tại vị trí con trỏ. Các lệnh sau đây minh hoạ điều này. (Chú ý: Đặt trong thủ tục sự kiện KeyUp của điều khiển Richtext): Dim F As frmDocument Set F = frmMain.ActiveForm If F.rtfNoiDung.SelBold=True Then F.tbrMain.Buttons("cmdBold").Value=1

Page 93: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 93

If F.rtfNoiDung.SelBold=false Then F.tbrMain.Buttons("cmdBold").Value=0 …………… (Giá trị 1 có nghĩa là nút được ấn – Chìm), 0 = không nhấn (nổi))

Dưới đây là kết quả minh hoạ khi chạy chương trình !

Hình 3.22 - Kết quả chạy chương trình

Qui tắc vàng :

• Luôn luôn tham khảo và đọc thêm tài liệu trợ giúp trực tuyến MSDN, Internet

• Hãy thử đặt các giá trị khác nhau cho các thuộc tính và chạy để kiểm nghiệm.

• Luôn luôn tìm mọi cách và phương thức khác nhau để giải các bài toán.

• Luôn suy nghĩ và tìm ra các ý tưởng, rồi lập trình thử nghiệm trên máy tính.

• Luôn phải quan niệm rằng: Kiến thức viết trong một cuốn sách chỉ mang ý nghĩa dẫn dắt ta làm các bước làm cơ bản. Kiến thức sâu sắc nhất đó chính là từ thực tiễn ta làm !.

• Không nên chỉ học những gì sách vở, thầy cô giáo dạy mà hãy chủ động tìm tòi, tự viết những phần mềm mà mình yêu thích, vì: "Công việc mà người ta làm tốt nhất là những công việc mà họ thích nhất !"

• Rút ra kiến thức từ những lần thử nghiệm đó.

• VÀ hãy luôn học hỏi từ những người xung quanh ….

• ….. Nhưng rồi cũng phải có lúc thư giãn ☺

Page 94: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 94

Ch−¬ng iV

Sö dông c¸c ®iÒu khiÓn n©ng cao 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 hầu hết các điều khiển nâng cao đi kèm với Visual Basic và một số điều khiển nâng cao thông dụng từ các hãng thứ 3 –Third party.

Lựa chọn được các điều khiển phù hợp khi viết chương trình. Xây dựng được một số ứng dụng với các điều khiển nâng cao.

A - ĐỀ BÀI TẬP Bài 1: Minh hoạ sử dụng điều khiển Carlendar (Lịch)

Giới thiệu: Điều khiển Carlendar nằm trong thư viện , có chức năng hiển thị như một cuốn lịch điện tử. Đồng thời cũng được dùng để cho phép người dùng chọn trực quan ngày, tháng, năm trong một số ứng dụng.

Hình 4.1 – Giao diện chương trình

Yêu cầu:

• Khi người dùng click nút thì hiển thị lịch của tháng trước.

• Khi người dùng click nút thì hiển thị lịch của tháng tiếp theo

• Khi người dùng click nút thì hiển thị lịch của năm trước

• Khi người dùng click nút thì hiển thị lịch của năm tiếp theo

• Khi người dùng click nút thì trở về ngày hiện tại

• Khi người dùng click nút thì thay ngày tháng năm trong máy tính bằng ngày tháng năm đang được chọn trong Calendar.

Page 95: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 95

Bài 2: Minh hoạ sử dụng điều khiển truyền thông nối tiếp Comm Control

Giới thiệu: Điều khiển MSComm nằm trong thư viện , cung cấp cho ứng dụng khả năng truyền thông nối tiếp bằng cách truyền và nhận dữ liệu thông qua cổng nối tiếp (Serial Port).

Hình 4.2 – Giao diện chương trình và đặt tên cho các điều khiển

Yêu cầu:

• Xây dựng ứng dụng như hình 2. • Khi người dùng click thì mở cổng có số hiệu trong điều

khiển . • Khi click thì đóng cổng hiện hành.

• Khi click thì gửi lệnh và dữ liệu chứa trong cboCommand Bài 3 : Minh hoạ điều khiển FlexGrid

Giới thiệu: Điều khiển MSFlexGrid nằm trong thư viện rol có chức năng hiển thị và thao tác dữ liệu ở dạng bảng (Tabular). Nó hoàn toàn cho phép sắp xếp, trộn và định dạng bảng có chứa xâu ký tự và hình ảnh. Khi gắn kết với các điều khiển Data, MSFlexGrid chỉ hiển thị dữ liệu ở chế độ Read-Only.

Hình 4.3 – Giao diện và đặt tên cho các điều khiển (tên được in đậm)

Yêu cầu:

• Khi click nút "Thêm" thì thêm một bản ghi trong các Textbox vào FlexGrid • Khi click nút "Xoá" thì xoá dòng đang được chọn trong FlexGrid

Page 96: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 96

• Khi click nút "Cập nhật" thì đặt nội dung của dòng hiện hành bằng nội dung trong các hộp Text tương ứng.

• Khi click nút "Lưu ra File" thì lưu nội dung FlexGrid ra file Text, mỗi bản ghi trong FlexGrid được ghi trên một dòng của file.

Bài 4 : Minh hoạ sử dụng điều khiển Web brower và HTML Object Library. Giới thiệu : Điều khiển Web Browser đóng vai trò như một trình duyệt IE, do vậy cho ta phép nhúng vào trong ứng dụng để mở và thao tác với trang web bằng các lệnh của VB. Để truy cập (đọc / ghi) nội dung chứa trong các đối tượng của trang web (nút nhấn, textbox...) thì cần phải có thư viện HTML Object Library. Trong trường hợp ứng dụng chỉ mở các trang web thì không cần đến thư viện này.

Hai thành phần này nằm trong và

Hình 4.4 – Giao diện chương trình

Yêu cầu:

• Khi chương trình bắt đầu, một trang web trắng (Blank) sẽ được mở. • Khi click nút "Mở" thì mở trang có địa chỉ nằm trong txtURL • Khi click nút "Tạo nút nhấn và Textbox" thì tạo ra một hộp text và một nút

nhấn trong trang Web. • Khi click nút "Ghi giá trị vào Text" thì cho người dùng nhập một xâu ký tự và

chèn xâu này vào hộp Text vừa tạo ra trong trang web • Khi click nút "Đọc giá trị trong Textbox" thì đọc nội dung trong hộp Text vừa

tạo ra và hiển thị ra màn hình bằng hàm Msgbox. • Khi click nút "Thêm "Hello"" thì thêm một dòng "Hello" có màu xanh vào trong

trang web. Bài 5: Minh hoạ sử dụng Internet Control

Giới thiệu: Điều khiển Internet cài đặt 2 giao thức được sử dụng rộng rãi nhất đó là giao thức HyperText Transfer Protocol (HTTP) và File Transfer Protocol (FTP).

Sử dụng giao thức HTTP, chúng ta có thể lấy về các trang Web từ Internet, còn giao thức FTP cho phép đăng nhập vào máy chủ FTP để Download (lấy về) và Upload

Page 97: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 97

(Gửi lên) các file. Ngoài ra, các lệnh trong giao thức FTP như SEND, PUT, PWD…. cũng được điều khiển này hỗ trợ.

Yêu cầu: Xây dựng một chương trình cho phép người dùng Download các file từ Internet về máy tính cục bộ. Các file này sau đó có thể mở theo yêu cầu.

Hình 4.5 – Giao diện và đặt tên cho các điều khiển

Bài 6. Sử dụng điều khiển Multimedia MCI để chơi các file nhạc và hình

Giới thiệu: điều khiển Multimedia MCI ( ) được dùng để ghi và chơi các file nhạc và hình. Các dạng file mà điều khiển này hỗ trợ là các file Wav (WaveAudio), các file trên đĩa CD (CDAudio), các file hình (DAT), file hình AVI..

Hình 4.6 – Giao diện chương trình và tên cho các điều khiển

Yêu cầu:

• Xây dựng chương trình với giao diện như hình 6

• Khi người dùng click nút thì mở hộp thoại chọn file và chơi file này. Bài 7: Sử dụng Script Control để tính toán biểu thức bất kỳ được nhập từ bàn phím trong khi chương trình chạy. Giới thiệu: Điều khiển Script ( ) cho phép định giá (Eval) một biểu thức bất kỳ khi chương trình đang chạy. Nó khắc phục được hạn chế trong các chương trình trước đây là biểu thức cần tính toán phải được nhập trước và khi đã dịch ra file exe rồi thì không thể thay đổi được. Muốn thay đổi biểu thức tính toán thì phải sửa đổi chương trình nguồn sau đó dịch lại ra file EXE. Ngoài khả năng định giá (tính) một biểu thức, Script control còn có khả năng rất mạnh khác là có thể thêm các lệnh (như khai báo biến, khai báo thủ tục, các lệnh rẽ nhánh v.v… của VB) trong khi chương trình chạy. Ở đây chỉ xin giới thiệu khả năng thứ nhất. Yêu cầu:

• Xây dựng giao diện như hình 7

• Khi người dùng nhập một biểu thức trong textbox và click nút "Hiển thị…" thì hiển thị kết quả tính toán được bằng hàm MsgBox.

Page 98: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 98

Hình 4.7 – Giao diện chương trình và kết quả chạy chương trình

Bài 8: Sử dụng điều khiển SSTab và viết chương trình cờ CARO đơn giản Giới thiệu: SSTab nằm trong thư viện là một điều khiển hoạt động giống như một đối tượng chứa (tức cho các các điều khiển khác đặt lên). Các điều khiển có thể đặt trong nhiều trang (còn gọi là Page hay TAB) khác nhau của SSTab, do vậy giúp chúng ta không phải tạo ra nhiều Form. Trong bài tập này, chúng ta sẽ sử dụng SSTab kết hợp với điều khiển FlexGrid để viết một chương trình chơi cờ Caro đơn giản. (Có thể kết hợp với bài tập 37 - Chương 1 sẽ được chương trình hoàn chỉnh hơn)

Hình 4.8 – Giao diện và tên của các điều khiển

Yêu cầu:

• Chương trình cho phép 2 người dùng sử dụng chuột để chơi • Khi người dùng click vào một ô trong Flexgrid thì đặt vào các ký hiệu là "X"

hoặc "O". • Thứ tự người đi trước có thể thay đổi. • Số ô cũng có thể thay đổi. • Khi người dùng click vào "Ván mới" thì xoá bàn cờ và bắt đầu chơi ván mới.

Bài 9: Sử dụng thanh tiến trình (Progressbar) Giới thiệu: Thanh tiến trình nằm trong thư viện thường được sử dụng để hiển thị một cách trực quan tiến trình một công việc, giúp cho người dùng thấy được trực quan công việc đã thực hiện được bao nhiêu %.

Page 99: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 99

Hình 4.9 – Giao diện chương trình khi chạy

Yêu cầu: Copy nội dung từ file nguồn và lưu sang file đích. Trong quá trình copy có hiển thị tiến trình copy và % dung lượng đã copy được bằng Pgrogressbar. Bài 10: Sử dụng điều khiển ImageCombo box Giới thiệu: Điều khiển ImageCombo nằm trong là một phiên bản của điều khiển ComboBox chuẩn nhưng có thêm khả năng hiển thị ảnh (biểu tượng) với từng mục trong danh sách. Ngoài ra, ImageCombo ưu việt hơn ComboBox ở chỗ, ComboBox thì chỉ có thuộc tính List để lưu trữ các mục dữ liệu trong khi đó

Hình 4.10 – Giao diện khi chạy chương trình.

Yêu cầu:

• Nạp một số mục vào ImageCombo có kèm thêm biểu tượng. • Khi người dùng click nút "Gửi thông báo" thì gửi thông báo trong hộp Text đến

máy tính đã được chọn trong ImageCombo sử dụng dịch vụ Net Send của hệ điều hành Windows 2K, XP.

Bài 11 : Sử dụng điều khiển Listview Giới thiệu: Điều khiển ListView nằm trong được sử dụng để hiển thị một danh sách các mục dữ liệu, trong đó mỗi mục lại có nhiều thuộc tính đi cùng (ví dụ mỗi mục thông tin về sinh viên có thể gồm họ tên, ngày sinh, quê quán...). Điều khiển ListView hỗ trợ 4 cách hiển thị khác nhau là Icon, SmallIcon, List và Report. Bài tập sau đây sẽ hướng dẫn bạn cách sử dụng điều khiển này với các thao tác "Chèn thêm" và "đọc" giá trị của các mục. Ngoài ra, còn giới thiệu một số thuộc tính hay dùng của điều khiển ListView này.

Page 100: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 100

Hình 4.11 – Giao diện và kết quả chạy chương trình mẫu

Yêu cầu:

• Thiết kế giao diện như hình 11 (Tên các điều khiển được đặt ở bên cạnh)

• Cho phép thêm một hàng (mục) mới vào Listview khi click nút "Thêm bản ghi"

• Hiển thị ra màn hình giá trị của nhiều mục được chọn khi click nút "Đọc các hàng đang chọn" (Khi chế độ Chọn nhiều hàng được ) bằng hàm Debug.Print. Mỗi hàng trên một dòng, mỗi trường cách nhau 1 dấu TAB.

• Đọc và hiển thị giá trị của hàng đang được chọn bằng hàm MsgBox khi click nút "Đọc hàng hiện tại".

• Cho người dùng chọn 1 trong 4 chế độ hiển thị. Bài 12: Sử dụng điều khiển TreeView Giới thiệu: Điều khiển TreeView nằm trong được sử dụng để trình bày dữ liệu dưới dạng phân cấp (Hình cây). Bài tập sau đây minh hoạ các thao tác chèn (Add), Xoá (Remove), Duyệt (đọc giá trị) các nút trong cây và xử lý sự kiện click chuột khi click lên 1 nút của cây. Yêu cầu:

• Xây dựng giao diện như hình 12 (có thể có biểu tượng hoặc không)

• Thực hiện các chức năng khi người dùng click vào các nút tương ứng. Việc đọc giá trị của mỗi nút bao gồm giá trị của trường "Key" và trường "Text".

• Khi người dùng click vào một nút trên cây thì hiển thị giá trị của trường "Key" và trường "Text" của nút đó trong một thanh trạng thái (staThongTinThem).

Page 101: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 101

Hình 4.12 – Giao diện khi chạy chương trình mẫu & đặt tên các điều khiển

Bài 13: Sử dụng DateTimePicker để nhập trực quan ngày/tháng/năm. Giới thiệu

Hình 4.13 – Giao diện chương trình khi chạy và tên của các điều khiển

Bài 14: Sử dụng điều khiển Window Media Player, viết chương trình chơi nhạc Giới thiệu: WMP là một điều khiển cho phép lập trình để xây dựng các ứng dụng đa phương tiện (Chơi các file nhạc hình, nhạc tiếng)

Hình 4.14 – Giai diện của form : frm4_14

Page 102: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 102

Hình 4.15 – Giao diện chương trình của form: frm4_14_Setting

B- HƯỚNG DẪN - GIẢI MẪU Bài 1 a. Hướng dẫn: Tên các thuộc tính và phương thức của điều khiển này bản thân nó đã nói lên chức năng của chúng. Do vậy chúng ta có thể tra cứu về điều khiển Calendar trong bộ MSDN. (Cách tra cứu nhạn: Trong khi lập trình, click vào điều khiển Calendar và nhấn phím F1). b. Chương trình mẫu: Form1.frm

Option Explicit '/// Chuyển sang tháng tiếp theo Private Sub cmdNextMonth_Click() Calendar1.NextMonth End Sub '----------------------------------------------------------------------------------------------------------------------------- /// Chuyển sang năm tiếp theo Private Sub cmdNextYear_Click() Calendar1.NextYear End Sub '----------------------------------------------------------------------------------------------------------------------------- '//// Chuyển sang tháng trước tháng hiện tại Private Sub cmdPrevMonth_Click() Calendar1.PreviousMonth End Sub '----------------------------------------------------------------------------------------------------------------------------- //// Chuyển sang năm trước năm hiện tại Private Sub cmdPrevYear_Click() Calendar1.PreviousYear End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Đặt lại ngày tháng năm bằng với ngày tháng năm vừa chọn (ví dụ 15/1/2006) Private Sub cmdSetdate_Click() Date = Calendar1.Value End Sub '-----------------------------------------------------------------------------------------------------------------------------

Page 103: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 103

'/// Hiển thị ngày tháng hiện hành trong máy tính Private Sub cmdToday_Click() Calendar1.Today End Sub

c. Chú ý:

• Điều khiển Calendar thường được sử dụng trong các chương trình để người dùng nhập vào ngày, tháng và năm.

• Khi muốn nhận về cả ngày/tháng/năm thì lấy thuộc tính Value, còn nếu muốn nhận từng thành phần riêng lẻ thì lấy thuộc tính Day, month, year…

Bài 2 a. Hướng dẫn: Điều khiển COM có thể được sử dụng để truyền thông (Giao tiếp) với bất kỳ thiết bị nào được nối và tương thích với cổng này. Việt thiết lập các thông số kết nối tương đối đơn giản, chỉ cần đặt số hiệu cổng (Com 1, 2, 3…) sau đó mở kết nối bằng cách đặt thuộc tính PortOpen = True. Riêng đối với một số trường hợp đặc biệt thì cần đặt lại một số thông số khác. Khi làm việc, điều khiển Com này có 2 cách để lấy dữ liệu do các thiết bị khác gửi đến Cổng Com, cách thứ nhất là luôn luôn thăm dò (Polling) cổng và nhận dữ liệu về; cách thứ 2 là khi dữ liệu được gửi đến thì sự kiện OnComm xuất hiện và ta lấy dữ liệu về thông qua thuộc tính Input. Chương trình mẫu dưới đây sử dụng cách nhận dữ liệu thứ 2 và thực hiện giao tiếp với Modem. Có thể tham khảo thêm trong MSDN. b. Chương trình mẫu (Giao tiếp với Modem): Form1.frm Option Explicit Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) '///--------------------------------------------------------------------------------------------------------------------------------- '/// Thực hiện mở cổng COM khi người dùng click nút Open Private Sub cmdOpen_Click() On Error GoTo err '/// Sử dụng cơ chế bắt lỗi comModem.CommPort = Val(cboPort.Text) '/// đặt cổng để giao tiếp comModem.PortOpen = True '/// mở cổng cmdClose.Enabled = True '/// đặt trạng thái cho các nút cmdOutput.Enabled = True '/// … (Có thể bỏ qua) cmdOpen.Enabled = False Exit Sub err: If cboPort.Text = "" Then MsgBox "Hãy chọn cổng COM cần mở!", vbInformation, "Chọn COM Port" Else MsgBox "Không thể mở cổng COM " & cboPort.Text, vbCritical, "Failed" End If End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Đóng cổng COM đang mở Private Sub cmdClose_Click() On Error GoTo err comModem.PortOpen = False cmdOutput.Enabled = False cmdClose.Enabled = False

Page 104: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 104

cmdOpen.Enabled = True Exit Sub err: End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Gửi lệnh ra cổng COM khi click nút OutPut Private Sub cmdOutput_Click() On Error GoTo err Dim Buffer As String comModem.Output = cboCommand.Text & Chr$(13) Exit Sub err: lstReceived.AddItem err.Description, 0 End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Sự kiện này được kích hoạt mỗi khi có dữ liệu gửi đến cổng COM Private Sub comModem_OnComm() Sleep 200 '///chờ 200 ms. (Cần phải có vì Modem thường bị trễ) Dim Buffer As String Buffer = comModem.Input Buffer = "onCom : " & Buffer lstReceived.AddItem Buffer, 0 End Sub '///--------------------------------------------------------------------------------------------------------------------------------- Private Sub Form_Load()

'/// Bạn cần xem thiết bị nối với cổng Com có số hiệu là Com mấy và đặt cho phù hợp cboPort.Text = "1" '/// Giả sử là cổng Com1

'/// Thêm một số lệnh cơ bản về Modem (Có thể tham khảo tập lệnh của Modem) cboCommand.Text = "AT" '/// Lệnh kiểm tra modem

cboCommand.AddItem "AT" cboCommand.AddItem "AT VCID = 1" cboCommand.AddItem "AT# CID" cboCommand.AddItem "ATDT 0912068582" cboCommand.AddItem "ATDT 713319" '/// Quay (gọi) điện đến số 713319 cboCommand.AddItem "ATDT 713153" End Sub

Bài 3 a. Hướng dẫn: Sử dụng thuộc tính Row, Col để chuyển đến ô cần tham chiếu, ví dụ cần chuyển đến ô có chỉ số hàng là 10, cột là 20 thì chỉ cần đặt Row = 10, Col = 20. Muốn lấy hoặc thay đổi giá trị của một ô ở hàng i, cột j thì viết theo cú pháp: TextMaTrix(i,j). b. Chương trình mẫu. Form1.frm

Option Explicit Dim SL_BanGhi As Integer '/// Biến lưu số lượng bản ghi đã thêm vào '/// Khi người dùng click vào ô nào thì biến Row và Col sẽ lưu chỉ số hàng và cột của ô đó '/// Hàm Round(X,N) trả về giá trị làm tròn số X đến n chữ số sau dấu chấm. Private Sub cmdCapnhat_Click() Dim DongHienTai As Integer DongHienTai = flxDanhSach.Row '/// Lấy dòng hiện tại đang được chọn

Page 105: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 105

With flxDanhSach '/// sử dụng từ khoá with để tránh viết lại tên .TextMatrix(DongHienTai, 1) = txtHoVaTen.Text .TextMatrix(DongHienTai, 2) = txtPascal.Text .TextMatrix(DongHienTai, 3) = txtC.Text .TextMatrix(DongHienTai, 4) = txtVB.Text .TextMatrix(DongHienTai,5)=(Val(txtPascal.Text)+Val(txtC.Text)+Val(txtVB.Text)) / 3 .TextMatrix(DongHienTai, 5) = Round(.TextMatrix(DongHienTai, 5), 1) End With End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Ghi danh sách nhập vào FlexGrid ra một file văn bản. Mỗi bản ghi trên một dòng Private Sub cmdLuu_Click() Dim F As Long, i As Integer, S As String F = FreeFile '/// xin một thẻ file còn trống Open "c:\FlexGrid.txt" For Output As #F '/// mở để ghi (output = ghi) For i = 1 To SL_BanGhi With flxDanhSach S= .TextMatrix(i, 0) & vbTab & .TextMatrix(i, 1) & vbTab & .TextMatrix(i, 2) S= S & .TextMatrix(i, 3) & vbTab & .TextMatrix(i, 4) & .TextMatrix(i, 5) Print #F, S '/// hàm Print để ghi giá trị S vào file F End With Next Close #F '/// Đóng file với thẻ file F MsgBox "Đã lưu dữ liệu ra tệp C:\FlexGrid.txt !", vbInformation End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Thêm một bản ghi mới vào FlexGrid Private Sub cmdThem_Click() SL_BanGhi = SL_BanGhi + 1 '/// tăng số lượng bản ghi mỗi khi thêm '//// Xin thêm dòng mới nếu FlexGrid bị đầy If flxDanhSach.Rows = SL_BanGhi Then flxDanhSach.Rows = SL_BanGhi + 1 With flxDanhSach .TextMatrix(SL_BanGhi, 0) = SL_BanGhi .TextMatrix(SL_BanGhi, 1) = txtHoVaTen.Text .TextMatrix(SL_BanGhi, 2) = txtPascal.Text .TextMatrix(SL_BanGhi, 3) = txtC.Text .TextMatrix(SL_BanGhi, 4) = txtVB.Text .TextMatrix(SL_BanGhi,5)=(Val(txtPascal.Text)+Val(txtC.Text)+Val(txtVB.Text)) / 3 .TextMatrix(SL_BanGhi, 5) = Round(.TextMatrix(SL_BanGhi, 5), 1) End With txtHoVaTen.Text = "" txtPascal.Text = "" txtC.Text = "" txtVB.Text = "" End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Xoá bản ghi (dòng) hiện hành bằng phương thức RemoveItem. Cần bắt lỗi ở đây. Private Sub cmdXoa_Click() On Error Resume Next flxDanhSach.RemoveItem flxDanhSach.Row '/// Xoá dòng hiện tại (Row) SL_BanGhi = SL_BanGhi - 1

Page 106: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 106

If err Then MsgBox err.Description '/// Hiển thị thông báo khi có lỗi xảy ra End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Hiển thị giá trị của dòng hiện tại trong FlexGrid mỗi khi người dùng Click lên dòng đó Private Sub flxDanhSach_Click() Dim DongHienTai As Integer DongHienTai = flxDanhSach.Row txtHoVaTen.Text = flxDanhSach.TextMatrix(DongHienTai, 1) txtPascal.Text = flxDanhSach.TextMatrix(DongHienTai, 2) txtC.Text = flxDanhSach.TextMatrix(DongHienTai, 3) txtVB.Text = flxDanhSach.TextMatrix(DongHienTai, 4) End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Đặt một số thuộc tính khởi đầu cho FlexGrid. (Bạn cũng có thể đặt nó trong lúc thiết kế) Private Sub Form_Load() With flxDanhSach .Font.Name = ".vnArial" .Font.Size = 12 .Rows = 2 '/// Số lượng hàng .Cols = 6 '/// Số lượng cột .FixedCols = 0 '/// Số cột cố định (có Màu xám) .AllowUserResizing = flexResizeBoth '/// Cho phép kéo giãn hàng / cột .TextMatrix(0, 0) = "Số TT" '/// Đặt tiêu đề cho các cột .TextMatrix(0, 1) = "Họ và tên" .TextMatrix(0, 2) = "Pascal" .TextMatrix(0, 3) = "C++" .TextMatrix(0, 4) = "VB" .TextMatrix(0, 5) = "Trung bình chung" End With SL_BanGhi = 0 End Sub

c. Ghi chú:

• FlextGrid cũng quan niệm ma trận hàng và cột cũng có thể coi như một mảng, khi đó có thể truy cập từng phần tử của mảng thông qua chỉ số, Ví dụ : <Tên Flex>.Array(i) sẽ trả về phần tử thứ i.

• Cũng có thể chèn một ảnh vào các ô của Flex. Ví dụ để đặt ảnh trong điều khiển Picture1 vào ô hiện hành thì viết:

flxDanhSach.PictureType = flexPictureColor Set flxDanhSach.CellPicture = Picture1.Picture Bài 4 a. Hướng dẫn:

• Muốn mở một trang Web thì sử dụng phương thức Navigate hoặc Navigate2 của điều khiển Web Browser.

• Ngoài ra, nếu có nhu cầu truy cập trực tiếp tới từng phần tử trong trang web đang được mở thì cần phải khai báo một đối tượng HTMLDocument (đối tượng này nằm trong thư viện HTML Object Library). Trong đó dùng phương thức getElementById để tham chiếu đến đối tượng trên trang web thông qua tên của đối tượng ấy. và dùng phương thức getAttribute để lấy giá trị một thuộc tính nào đó của đối tượng tham chiếu bởi getAttribute.

Page 107: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 107

• Để biết rõ hơn về các đối tượng trên trang Web, cần nắm rõ mô hình DOM. b. Chương trình mẫu Form1.frm

Option Explicit Dim Doc As HTMLDocument '/// Biến trỏ đến đối tượng tài liệu (Document) đang mở '///--------------------------------------------------------------------------------------------------------------------------------- Private Sub Form_Load() webMain.Navigate "about:blank" '/// Mở một trang web trắng - Blank cmdGhiGiaTri.Enabled = False '/// tạm thời cấm nút này cmdDocGiaTri.Enabled = False End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '///Phương thức getElementById ("HopBox") sẽ tham chiếu đến đối tượng có tên là "HopBox" '/// Phương thức getAttribute("value") sẽ đọc giá trị của thuộc tính "value" của đối tượng đó Private Sub cmdDocGiaTri_Click() MsgBox Doc.getElementById("HopBox").getAttribute("value") End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Phương thức setAttribute("value", S) sẽ gán giá trị S vào thuộc tính có tên là "value" Private Sub cmdGhiGiatri_Click() Dim S As String S = InputBox("Nhập một xâu chữ để lưu textbox") Call Doc.getElementById("HopBox").setAttribute("value", S) End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Phương thức Navigate của điều khiển Webbrowser dùng để mở một trang Web Private Sub cmdMo_Click() webMain.Navigate txtURL.Text End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Toàn bộ nội dung của trang Web được lưu trong thuộc tính innerHTML. '/// Do vậy để thêm nội dung vào trang Web thì ta chỉ việc ghép thêm vào thuộc tính này Private Sub cmdTaoNut_Click() Doc.body.innerHTML=Doc.body.innerHTML &"<input Name='HopBox' value='DHSPKTHY'>" Doc.body.innerHTML=Doc.body.innerHTML &"<input type=Button value='Click here'>" cmdGhiGiaTri.Enabled = True '/// Đã thêm nút rồi nên cho phép đọc và ghi giá trị vào. cmdDocGiaTri.Enabled = True cmdTaoNut.Enabled = False End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Ghép nội dung cần thêm vào thuộc tính innerHTML. Để biết rõ về cách tổ chức nội dung '/// của trang Web, hãy vào Internet để biết rõ về mô hình đối tượng tài liệu – DOM. Private Sub cmdThemHello_Click() Doc.body.innerHTML = Doc.body.innerHTML & "<h2 style = 'color:blue'>Hello </h2>" End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Khi trang web mở xong một trang thì sự kiện này xuất hiện. Khi đó ta mới cho '/// biến đối tượng Doc "trỏ" đến đối tượng Document này (Phải sử dụng câu lệnh Set). Private Sub webMain_DocumentComplete(ByVal pDisp As Object, URL As Variant) Set Doc = webMain.Document End Sub

Page 108: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 108

c. Ghi chú:

• Đây là vấn đề cực kỳ quan trọng khi chúng ta muốn thao tác (đọc/ ghi) đến nội dung của một trang Web thông qua môi trường VB.

• Hiểu rõ bản chất của mô hình đối tượng tài liệu (DOM) trong trang web giúp ta có thể xây dựng được rất nhiều ứng dụng, ví dụ : Có thể xây dựng các chương trình hỗ trợ download hàng loạt như TeleportPro, WebZip, Chat….

• Bạn đọc cũng có thể tham khảo sách về HTML, DHTML & JavaScript tại Trung tâm Aptech để biết rõ hơn về mô hình DOM, về innerHTML ….

Bài 5 a. Hướng dẫn: Internet control có thể lấy dữ liệu từ máy chủ về thông qua 2 giao thức là HTTP và FTP. Phương thức OpenURL là cách đơn giản để lấy dữ liệu về, đồng thời có thể lưu ngay vào file. Phương thức này cũng được gọi là phương thức hoạt động đồng bộ (synchronous), có nghĩa là việc lấy dữ liệu về phải được hoàn tất thì các lệnh tiếp sau mới được thực hiện. Cũng có thể nhận dữ liệu bằng phương thức khác như Execute, nhưng phương thức Execute lại hoạt động ở chế độ không đồng bộ (Asynchronous), tức là câu lệnh tiếp theo lệnh này sẽ được thực hiện không phụ thuộc vào việc dữ liệu đã lấy về hay chưa (Thường sử dụng trong ứng dụng phức tạp). Trong trường hợp này, xin sử dụng phương thức OpenURL để lấy dữ liệu về. Cú pháp của phương thức này như sau: OpenURL url [, <Kiểu dữ liệu lấy về>]. Trong đó, url là địa chỉ của trang Web (ví dụ http:///www.myweb.com/index.htm hay ftp://home.com/default.html), Còn kiểu dữ liệu lấy về cho biết là dữ liệu lấy về xem như một mảng xâu (hằng icString) hay một mảng byte (hằng icByteArray). Mặc định xem như một mảng xâu. b. Chương trình mẫu Form1.frm

Option Explicit '/// Các hàm API nên copy từ API Text Viewer Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long '/// Thực hiện download trang web khi click nút Download Private Sub cmdDownload_Click() Dim bData() As Byte '/// Mảng Byte chứa dữ liệu Download về Dim F As Long F = FreeFile() '///Kết quả của phương thức OpenURL sẽ được lưu vào một mảng Byte và được lưu ra đĩa bData() = Inet1.OpenURL(txtURL.Text, icByteArray) Open "c:\Tam001.htm" For Binary Access Write As #F Put #F, , bData() '/// ghi vào file Close #F '/// Đóng file If MsgBox("Đã· lưu ra đĩa. Bạn có muốn mở không ?", vbYesNo) = vbYes Then ShellExecute Me.hWnd, "open", "c:\Tam001.htm", vbNullString, "c:\", 1 End If End Sub

Page 109: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 109

c. Ghi chú:

• Nhiều ứng dụng có thể lấy về và hiển thị trên một điều khiển nào đó, ví dụ Richtext thì có thể viết như sau: Private Sub Form_Load() Inet1.AccessType = icUseDefault RichTextBox1.Text = Inet1.OpenURL (InputBox("URL", ,"ftp://ftp.microsoft.com")) End Sub

• Phương thức Execute cho phép ta thực hiện rất nhiều lệnh FTP chuẩn như LS, DIR, CDUP, CD, PUT, GET, SEND v.v…do vậy có thể dễ dàng viết các ứng dụng FTP Client (như CuteFTP chẳng hạn)

• Điểu khiển này cũng có thể sử dụng rất tốt vào việc gửi (Upload) một file lên Server thông qua giao thức FTP. Thực tế có thể được sử dụng để chuyển file lên các máy Server cục bộ.

• Các ví dụ về phương thức Execute, OpenURL, GetChunk… của điều khiển này rất nhiều và rất hay, được giới thiệu rất kỹ trong MSDN.

Bài 6 a. Hướng dẫn: Chỉ cần sử dụng 2 thuộc tính cơ bản là FileName và Command. Để biết rõ hơn, có thể tham khảo thêm trong MSDN. b. Chương trình mẫu Form1.frm

Option Explicit Private Sub cmdOpenFile_Click() '/// Chỉ hiển thị các file có đuôi wav, avi và *.*

dlgOpenFile.Filter = "Cac file Wav va AVI (wav,avi)|*.wav;*.avi| Tat ca |*.*|" dlgOpenFile.ShowOpen mmcPlayer.FileName = dlgOpenFile.FileName Select Case LCase(Right(dlgOpenFile.FileName, 3)) '/// Kiểm tra phần đuôi Case "wav" mmcPlayer.DeviceType = "WaveAudio" Case "avi" mmcPlayer.DeviceType = "AVIVideo" Case "cda" mmcPlayer.DeviceType = "CDAudio" '.............................................................................. End Select mmcPlayer.Command = "open" '/// bắt đầu Play End Sub '///--------------------------------------------------------------------------------------------------------------------------------- Private Sub Form_Load() '/// Đặt một số thuộc tính cho điều khiển (Xin tham khảo ý nghĩa trong MSDN). mmcPlayer.Notify = False mmcPlayer.Wait = True mmcPlayer.Shareable = False End Sub '///--------------------------------------------------------------------------------------------------------------------------------- Private Sub Form_Unload(Cancel As Integer) mmcPlayer.Command = "Close" '/// Giải phóng tài nguyên trước khi thoát

Page 110: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 110

End Sub

c. Ghi chú:

• Đây là điều khiển rất hay được dùng trước kia, tuy nhiên hiện nay đã có các điều khiển mạnh mẽ hơn rất nhiều, như điều khiển Window Media Player hay Window Active Movie chẳng hạn (sẽ được giới thiệu trong bài 14). Do vậy, bài này chỉ giới thiệu với mục đích tham khảo thêm.

• Để một nút (Command button) có thể hiển thị được biểu tượng trên đó thì cần đặt thuộc tính Style = Graphical trong lúc thiết kế.

Bài 7 a. Hướng dẫn: Điều khiển này rất hay trong một số bài toán mà giá trị hay thậm chí là câu lệnh được nhập vào khi chương trình đang chạy. Do vậy nó sẽ vô cùng hữu ích cho những bài toán mà giá trị và công thức tính toán đưa vào là không biết trước. Trong bài tập này lấy ví dụ về việc người dùng nhập vào một biểu thức toán học bất kỳ và chương trình sẽ tính và cho ra kết quả sử dụng điều khiển Script. b. Chương trình mẫu Form1.frm

Option Explicit '/// Phương thức Eval sẽ trả về giá trị tính toán được (trong trường hợp không có lỗi). Private Sub cmdketqua_Click() MsgBox scrMain.Eval(txtBieuThucToanHoc.Text) End Sub

c. Ghi chú: Điều khiển Script còn hỗ trợ khả năng đưa và thực thi các câu lệnh của VB ngay khi chương trình đang chạy. Ví dụ sau đây sẽ gọi một thủ tục từ Script:

Private Sub Form_Load() Dim S As String S = "Private Sub Hello()" & vbCrLf S = S & "Msgbox ""Hello World. Tôi đến từ Script Control !""" & vbCrLf S = S & "End Sub" scrMain.AddCode S '/// Thêm mã lệnh vào Script scrMain.ExecuteStatement "Call Hello()" '/// Thực thi mã lệnh End Sub

Cũng xin nói thêm rằng : Trong VB, vì dấu nháy kép là một ký hiệu dùng để bao một hằng xâu, do vậy khi muốn thêm chính ký hiệu đó vào trong một xâu thì cần thêm vào trước đó một dấu nháy kép nữa (tức 2 dấu nháy kép thì được một dấu). Bài 8 a. Hướng dẫn: Thực tế thì điều khiển TAB rất hay được dùng, tuy nhiên lại rất đơn giản. Do vậy bài này sẽ sử dụng thêm một điều khiển đã được giới thiệu là FlexGrid để viết một chương trình chơi cờ CARO cho thêm phần thú vị. (Để chương trình có thể kiểm tra được ai thắng ai thua thì bạn đọc có thể tham khảo thêm thuật toán ở phần chương trước để hoàn thiện hơn). Với việc chơi cờ của 2 người, ý tưởng chính của chúng ta là dùng một biến để theo dõi hiện trạng là ai đang đi, người 1 hay

Page 111: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 111

người 2 để chúng ta có thể điền được các ký hiệu tương ứng là "X" hay "O". Trong quá trình điền cũng cần phải kiểm tra xem ô đã điền rồi thì thôi. b. Chương trình mẫu Form1.frm

Option Explicit Dim KichThuoc As Integer '/// Lưu kích thước của bàn cờ Dim NguoiDi As Integer '/// Cho biết là ai đang đi Dim Nguoi1 As String, Nguoi2 As String '/// Lưu ký hiệu "X" và "O" của 2 người chơi '/// Tạo một bàn cờ mới với kích thước bàn cờ là KichThuoc x KichThuoc Sub BanCoMoi() flxBanCo.Rows = KichThuoc flxBanCo.Cols = KichThuoc Dim i As Integer

'/// đặt kích thước mỗi ô thành ô vuông, và tự co giãn theo độ rộng của FlexGrid For i = 0 To flxBanCo.Rows - 1 flxBanCo.RowHeight(i) = flxBanCo.Height \ flxBanCo.Rows flxBanCo.ColWidth(i) = flxBanCo.RowHeight(i) Next

'/// Xoá trắng các ô trên bàn cờ. (TextArray sẽ xem Grid như một mảng) For i = 0 To flxBanCo.Rows * flxBanCo.Cols - 1 flxBanCo.TextArray(i) = "" Next NguoiDi = 1 '/// Cho người 1 được đi trước End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Mỗi khi click chuột thì tuỳ theo trước đó là ai đi để điền ký hiệu "X" hay "O" cho phù hợp '/// Sau đí điền xong thì lại "để cho người sau đi" bằng cách đảo lại giá trị của NguoiDi 1 2. Private Sub flxBanCo_Click()

'/// Nếu ô này đã được điền rồi thì không làm gì (Exit Sub) If flxBanCo.TextMatrix(flxBanCo.Row, flxBanCo.Col) <> "" Then Exit Sub If NguoiDi = 1 Then flxBanCo.TextMatrix(flxBanCo.Row, flxBanCo.Col) = Nguoi1 If NguoiDi = 2 Then flxBanCo.TextMatrix(flxBanCo.Row, flxBanCo.Col) = Nguoi2 If NguoiDi = 1 Then '/// Nếu Người 1 đi rồi NguoiDi = 2 '/// Để người 2 đi Else NguoiDi = 1 '/// Để người 1 đi End If End Sub '///--------------------------------------------------------------------------------------------------------------------------------- Private Sub Form_Load() sstMain.Tabs = 2 '/// Tạo 2 trang (TAB) sstMain.TabCaption(0) = "Bàn cờ Caro" '/// Đặt caption cho tab thứ 1 sstMain.TabCaption(1) = "Cấu hình" '/// Đặt caption cho tab thứ 2 KichThuoc = 8 '/// Mặc định kích thước bàn cờ là 8x8

'/// Các thuộc tính này có thể đặt trong cửa sổ Properties. flxBanCo.BorderStyle = flexBorderNone flxBanCo.BackColorBkg = &HFFFFFF

Page 112: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 112

flxBanCo.Width = flxBanCo.Height flxBanCo.FixedCols = 0 flxBanCo.FixedRows = 0 NguoiDi = 1 '/// Cho người 1 đi trước Nguoi1 = "X" '/// Ký hiệu nước đi của người 1 là "X" Nguoi2 = "O" '/// Ký hiệu nước đi của người 2 là "O" Call BanCoMoi '/// Vẽ bàn cờ End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Nếu người 1 đi trước thì ta đặt ký hiệu Nguoi1 = "X" trái lại ta đặt Nguoi1 = "O" Private Sub cmdThietLap_Click() If Val(txtKichThuoc.Text) = 0 Then Exit Sub '///Nếu không là số thì thoát KichThuoc = Val(txtKichThuoc.Text) If optNguoi1.Value = True Then Nguoi1 = "X" Nguoi2 = "O" Else Nguoi1 = "O" Nguoi2 = "X" End If BanCoMoi '/// Vẽ lại bàn cờ End Sub '///--------------------------------------------------------------------------------------------------------------------------------- Private Sub cmdVanMoi_Click() Call BanCoMoi End Sub

c. Ghi chú:

• Có thể chèn hình ảnh vào các ô thay vì ký tự cho chương trình thêm sinh động hơn. Hãy tham khảo bài số 3 về cách chèn ảnh vào trong một ô (Cell).

• Kết hợp với bài toán kiểm tra 5 ô cùng số 1 thẳng hàng ở chương trước để kiểm tra xem ai thắng sau mỗi nước đi.

• Có thể áp dụng cho trò chơi Line. Bài 9 a. Hướng dẫn: Đối với thanh tiến trình thì ta cần quan tâm đến các thuộc tính sau:

• Min : Giá trị nhỏ nhất của thanh tiến trình

• Max : Giá trị lớn nhất của thanh tiến trình

• Value : Giá trị hiện thời của thanh của thanh Trong quá trình làm việc, ta có thể thay đổi các giá trị này cho phù hợp !

Hình 4.16 - Minh họa 3 thuộc tính quan trọng của thanh tiến trình

b. Chương trình mẫu

Page 113: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 113

Form1.frm

Option Explicit '/// Khi mở file đích, dùng hàm Dir để kiểm tra tệp có tồn tại hay không. Private Sub cmdMoFileDich_Click() dlgMain.Filter = "Tất cả các file (*.*)|*.*|" dlgMain.DialogTitle = "Nhập vào tên file để lưu" dlgMain.ShowOpen txtFileDich.Text = dlgMain.FileName If Dir(txtFileDich.Text) <> "" Then MsgBox "File đích sẽ bị ghi đè !", vbCritical End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Cho người dùng chọn tên file nguồn cần copy Private Sub cmdMoFileNguon_Click() dlgMain.Filter = "Tất cả các file (*.*)|*.*|" dlgMain.ShowOpen txtFileNguon.Text = dlgMain.FileName End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Ở đây để thấy được thanh tiến trình chạy, ta copy từng byte một. '/// Tuy nhiên, trong thực hành giá trị của Buffer càng lớn thì tốc độ càng nhanh. Private Sub cmdCopy_Click() Dim F1 As Long, F2 As Long Dim Buffer As String * 1 '/// Vùng đệm 1 byte. F1 = FreeFile Open txtFileNguon.Text For Binary As #F1 '/// Đọc/ ghi ở chế độ nhị phân F2 = FreeFile Open txtFileDich.Text For Binary As #F2 pgrCopyFile.Value = 0 pgrCopyFile.Max = FileLen(txtFileNguon.Text) + 1 Do While Not EOF(F1) Get #F1, , Buffer '/// (Get) Đọc một byte từ file nguồn Put #F2, , Buffer '/// (Put) Ghi vào file đích pgrCopyFile.Value = pgrCopyFile.Value + Len(Buffer) lblPhanTram.Caption = Round(pgrCopyFile.Value/pgrCopyFile.Max * 100) & " %" DoEvents '///Để cho CPU xử lý các ứng dụng khác, tránh chiếm dụng tài nguyên Loop Close #F1 Close #F2 MsgBox "Đã copy xong !", vbInformation End Sub

c. Chú ý :

• Trong khi thao tác phải đảm bảo giá trị Value không được vượt quá Max. • Có thể thay đổi cách hiển thị khác bằng việc đặt lại thuộc tính "Scrolling" • Muốn hiển thị được ảnh trên các nút chuẩn (Command button) thì cần đặt

thuộc tính Style = 1 –Graphical.

Page 114: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 114

Bài 10 a. Hướng dẫn: Việc thao tác giống như điều khiển ComboBox. Tuy nhiên cần lưu ý là ImageCombo cần phải (Bind) gắn kết với một điều khiển ImageList để có thể lấy ảnh (Icon) từ đó ra hiển thị. Việc gắn kết đó có thể sử dụng câu lệnh Set như chương trình mẫu dưới đây, hoặc cũng có thể đặt trong lúc thiết kế (vào Properties). Ngoài ra, điều khiển ImageCombo có "2 nơi" (trường) để lưu dữ liệu cho một mục là Key và Text. Mỗi một phần tử (item) thường có một giá trị để chương trình thao tác (thường ngắn gọn - Key) và một giá trị để hiển thị cho người dùng quan sát (thông tin Tiếng việt có dấu - Text). Thuộc tính ComboItems sẽ quản lý và thao tác với các mục này. Muốn truy cập đến mục i, ta viết: ComboItems (i). Mỗi mục i là một đối tượng ComboItemvới rất nhiều thuộc tính. (Xin tham khảo thêm trong MSDN) . b. Chương trình mẫu Form1.frm

Option Explicit Private Sub cmdGui_Click() Shell "Net.exe Send " & cboComputer.Text & " " & txtThongBao.Text, vbHide End Sub '///--------------------------------------------------------------------------------------------------------------------------------- Private Sub Form_Load() Dim i As Integer Set cboComputer.ImageList = imlBieuTuong

'/// Chèn tên của 5 máy tínhvào Combobox

For i = 1 To 5 cboComputer.ComboItems.Add , ,"Máy " & i, "icoComputer" Next End Sub

c. Chú ý: Để chạy được chương trình trên thì trước hết bạn cần phải thêm một ImageList vào form với tên là imlBieuTuong và trong imlBieuTuong phải có một biểu tượng được đặt với tên (Key) là icoComputer.

Hình 4.17- Khi thêm biểu tượng vào ImageList cần đặt một tên thay vì để chỉ số mặc định

Page 115: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 115

Bài 11 a. Hướng dẫn: Đối với listview, điều khiển này có rất nhiều tập hợp con bên trong nó và nhiều người rất dễ bị nhầm lẫn giữa các khái niệm như, ListItem, SubItems v.v… Trước tiên xin giới thiệu với bạn đọc một cách trực quan về các khái niệm ở trên.

Như vậy:

• Muốn thêm các cột thì tham khảo đến thuộc tính ColumnHeaders

• Muốn thêm các hàng (mỗi hàng gồm 3 trường thông tin) như trên thì tham khảo đến thuộc tính ListItems. Thuộc tính ListItems là một tập hợp, do vậy muốn thêm một mục (ListItem) thì có thể sử dụng phương thức Add. Phương thức này trả về một ListItem. Khi một hàng (listItem) được tạo ra thì ta có thể điền dữ liệu cho các mục con i (i>= 2) thông qua thuộc tính SubItems tương ứng.

• Việc truy cập đến từng phần tử (từng hàng) có thể viết ListItems(i), trong đó i là chỉ số của hàng cần tham chiếu đến. Tiếp theo muốn điền nội dung vào cột đầu tiên của hàng i đó thì viết : ListItems(i).Text = "Cột đầu tiên, hàng thứ i". Còn muốn điền tiếp vào cột thứ 2 và 3 thì viết, ví dụ: ListItems(i).SubItems(1) = "Hàng i cột 2"

ListItems(i).SubItems(2) = "Hàng i cột 3" • Thuộc tính ColumnHeaders quản lý phần tiêu đề của mỗi cột, ListItems quản

lý tất cả các hàng và SubItems quản lý các cột trong cùng một hàng. b. Chương trình mẫu Form1.frm

Option Explicit '/// Mặc định khi người dùng 2 lần click lên một mục thì Listview sẽ cho sửa đổi. '/// Ta có thể không cho phép điều này bằng cách đặt lại thuộc tính LabelEdit. Private Sub chkEditLabel_Click() lvwDSSV.LabelEdit = chkEditLabel.Value End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Listview cũng hỗ trợ khả năng lựa chọn nhiều mục đồng thời (Click chuột + Ctrl)

Page 116: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 116

'/// Thuộc tính MultiSelect =True Cho phép đa lựa chọn. Private Sub chkMultiSelect_Click() lvwDSSV.MultiSelect = (chkMultiSelect = 1) End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// FullRowSelect=true khi người dùng click một ô thì toàn bộ ô đó sẽ được chọn (highlight) Private Sub chkSelectRow_Click() lvwDSSV.FullRowSelect = chkSelectRow.Value = 1 End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '//// GridLines = True Sẽ hiển thị lưới trong Grid Private Sub chkShowGrid_Click() lvwDSSV.GridLines = chkShowGrid.Value = 1 End Sub '///--------------------------------------------------------------------------------------------------------------------------------- Private Sub cmdThem_Click() Dim Item As ListItem Set Item = lvwDSSV.ListItems.Add '/// Thêm một dòng mới và Item trỏ đến mục này Item.SmallIcon = "icoFace" '/// Biểu tượng khi hiển thị ở chế độ Report Item.Icon = "icoFace" '/// Khi hiển thị ở chế độ Icon Item.Text = txtHoVaTen.Text '/// ô ở cột thứ nhất lưu Họ và tên Item.SubItems(1) = txtNgaySinh.Text '/// ô ở cột thứ 2 chứa ngày sinh Item.SubItems(2) = txtQueQuan.Text '/// ô ở cột thứ 3 chứa quê quán End Sub '///--------------------------------------------------------------------------------------------------------------------------------- Private Sub cmdDocHangHT_Click() If lvwDSSV.SelectedItem Is Nothing Then Exit Sub Debug.Print "Text (Cột 1) = " & lvwDSSV.SelectedItem.Text Debug.Print "Text của cột 2 = " & lvwDSSV.SelectedItem.SubItems(1) Debug.Print "Text của cột 3 = " & lvwDSSV.SelectedItem.SubItems(2) End Sub '///--------------------------------------------------------------------------------------------------------------------------------- Private Sub cmdDocNhieuHang_Click() Dim i As Integer For i = 1 To lvwDSSV.ListItems.Count If lvwDSSV.ListItems(i).Checked = True Then Debug.Print "Giá trị Text ở Cột 1 = " & lvwDSSV.ListItems(i).Text Debug.Print "Giá trị Text ở Cột 2 = " & lvwDSSV.ListItems(i).SubItems(1) Debug.Print "Giá trị Text ở Cột 3 = " & lvwDSSV.ListItems(i).SubItems(2) End If Next '/// Cách 2 Dim obj As ListItem For Each obj In lvwDSSV.ListItems If obj.Selected = True Then Debug.Print "Giá trị Text ở Cột 1 = " & obj.Text Debug.Print "Giá trị Text ở Cột 2 = " & obj.SubItems(1) Debug.Print "Giá trị Text ở Cột 3 = " & obj.SubItems(2) End If Next End Sub '///--------------------------------------------------------------------------------------------------------------------------------- Private Sub Form_Load() Dim P As ListImage

Page 117: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 117

'/// 3 dòng này có thể bỏ qua nếu bạn thêm vào imlBieuTuong 1 biểu tượng tên là "icoFace" '/// trong lúc thiết kế (vào phần Properties). Ở đây xin thêm bằng mã lệnh. imlBieuTuong.ImageHeight = 16 imlBieuTuong.ImageWidth = 16 imlBieuTuong.ListImages.Add , "icoFace", LoadPicture("C:\Program Files\Microsoft Visual Studio\Common\Graphics\Icons\Misc\FACE02.ICO") lvwDSSV.Icons = imlBieuTuong '/// Biểu tượng khi hiển thị ở chế độ Icons lvwDSSV.SmallIcons = imlBieuTuong '/// ở chế độ SmallIcon (Report) lvwDSSV.ColumnHeaderIcons = imlBieuTuong '/// Hiển thị ở cột tiêu đề (Header) lvwDSSV.ColumnHeaders.Add , "hoten", "Họ và tên", , , "icoFace" lvwDSSV.ColumnHeaders.Add , "ngaysinh", "Ngày sinh" lvwDSSV.ColumnHeaders.Add , "quequan", "Quê quán" lvwDSSV.View = lvwReport '/// Cho hiển thị ở chế độ Report End Sub '///--------------------------------------------------------------------------------------------------------------------------------- Private Sub optIcon_Click()

lvwDSSV.View = lvwIcon '/// Hiển thị ở chế độ Icon End Sub '///--------------------------------------------------------------------------------------------------------------------------------- Private Sub optList_Click() lvwDSSV.View = lvwList '/// Hiển thị ở chế độ danh sách End Sub '///--------------------------------------------------------------------------------------------------------------------------------- Private Sub optReport_Click() lvwDSSV.View = lvwReport '/// Hiển thị ở chế độ báo cáo (Report) End Sub '///--------------------------------------------------------------------------------------------------------------------------------- Private Sub optSmallIcon_Click() lvwDSSV.View = lvwSmallIcon '/// Hiển thị ở chế độ biểu tượng nhỏ End Sub

c. Ghi chú: ListView có rất nhiều thuộc tính do vậy cũng không thể đưa hết vào đây được. Vì vậy, cách tốt nhất để bạn hiểu rõ hơn về nó là hãy tự thay đổi các tham số sau đó chạy chương trình và quan sát. Từ đó tự rút ra những thông tin bổ ích. Bài 12 a. Hướng dẫn: Về mặt trình diễn (Hiển thị) thì điều khiển này giúp ta hiển thị các mục theo một cấu trúc cây. Tuy nhiên về bản chất cài đặt thì các mục trong cây đều nằm trong một tập hợp là Nodes. Tập hợp nodes là một thuộc tính của cây. Nó có đầy đủ các phương thức và thuộc tính của một tập hợp như : Add, Count, Items, RemoveItem, Clear v.v… Đối với TreeView, cần quan tâm đến một số thuộc tính, phương thức và sự kiện sau đây:

• Thuộc tính SelectedItem : Trả về nút đang được chọn, nếu không có nút nào được chọn thì trả về giá trị là "nothing"

• Trong tập hợp Nodes: Phương thức Add dùng để thêm một nút vào cây. Lưu ý là trường Khoá (Key) của mỗi nút là duy nhất khi Add, nếu không chương trình sẽ bị lỗi. Khi thêm vào thì ta có thể thêm vào một nút con, một nút anh em….Phương thức RemoveItem(i) dùng để xoá nút i khỏi cây (khi đó các con của i cũng sẽ bị xoá). Phương thức Nodes.Clear dùng để xoá toàn bộ các nút

Page 118: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 118

trong cây. Thuộc tính Nodes.Items(i) cũng trả về nút i. Thuộc tính Nodes.Count cho biết hiện tại đang có bao nhiêu nút thuộc cây.

• Ngoài ra còn một số thuộc tính qui định dáng vẻ hiển thị của cây như Hover, HideSelection, LabelEdit v.v…Các thuộc tính này có thể đặt bằng mã lệnh hoặc đặt trong khi thiết kế.

• Thủ tục sự kiện Click sẽ được kích hoạt khi người dùng click vào một nút trong cây. Khi đó ta thường tham chiếu đến thuộc tính SelectedItem.

b. Chương trình mẫu Form1.frm

Option Explicit Dim STT As Integer '/// Biến ghi số lượng phần tử. Sẽ tự động tăng để không xung đột. '///---------------------------------------------------------------------------------------------------------------- '/// Đọc giá trị của nút hiện tại (nút được chọn) và hiển thị 2 trường là Key và Text ra màn hình '///Thuộc tính SelectedItem trả về nút đang được chọn. Nếu không có nút nào được chọn thì '/// thuộc tính này có giá trị là NOTHING. Do vậy cần kiểm tra bằng câu lệnh If … is nothing … '///--------------------------------------------------------------------------------------------------------------------------- Private Sub cmdDocGiaTri_Click() Dim NutHienTai As Node Set NutHienTai = tvwDSSV.SelectedItem If NutHienTai Is Nothing Then Exit Sub MsgBox "Key = " & NutHienTai.Key & ". Text = " & NutHienTai.Text End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Xin giới thiệu 2 cách để đọc (Duyệt) cây. Dùng cấu trúc cây và tập hợp Private Sub cmdDocTatCa_Click() Dim Nut As Node For Each Nut In tvwDSSV.Nodes Debug.Print "Key = " & Nut.Key & vbTab & vbTab & " Text = " & Nut.Text Next '/// Cách 2 (Sử dụng khái niệm tập hợp (Collection). Dim i As Integer For i = 1 To tvwDSSV.Nodes.Count Debug.Print tvwDSSV.Nodes.Item(i).Key &",Text=" & tvwDSSV.Nodes.Item(i).Text Next End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Thủ tục in tất cả các nút anh em liền kề (Cùng mức) trong cây Private Sub cmdPrintAnhEm_Click() Dim Nut As Node If tvwDSSV.SelectedItem Is Nothing Then Exit Sub Set Nut = tvwDSSV.SelectedItem.FirstSibling '/// Trỏ đến nút "anh cả" '/// sau đó Print các nút, từ vị trí "Anh cả" cho đến hết Do While Not (Nut Is Nothing) Debug.Print "Key = " & Nut.Key & vbTab & " Text = " & Nut.Text Set Nut = Nut.Next '/// Trỏ đến nút ngay cạnh Loop End Sub

Page 119: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 119

'///--------------------------------------------------------------------------------------------------------------------------------- '/// In nút cha của nút đang được chọn. Ở đây SelectedItem trả về nút hiện tại '/// Thuộc tính Parent trả về nút cha. (Cần kiểm tra xem có tồn tại trước khi thao tác) Private Sub cmdPrintCha_Click() Dim NutCha As Node If tvwDSSV.SelectedItem Is Nothing Then Exit Sub Set NutCha = tvwDSSV.SelectedItem.Parent If Not (NutCha Is Nothing) Then MsgBox "Giá trị Key = " & NutCha.Key & vbTab & "Text=" & NutCha.Text

End If End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Thủ tục thêm một nút vào trong cây. Cú pháp của phương thức thêm nút như sau:

'/// Ví dụ: tvwDSSV.Nodes.Add "NUT_GOC", tvwChild, "Con1", "Con thứ 1", "icoFace" sẽ '/// thêm một nút có tên (Key) là Con1, nhãn hiển thị là "con thứ 1", biểu tượng hiển thị là icoFace '/// (nằm trong imageList). '/// Còn lệnh : tvwDSSV.Nodes.Add "Con1", tvwNext, "Em1", "Con thứ 2", "icoFace" '/// sẽ thêm vào một nút là anh em (cùng mức) của nút "Con1" (tức là con của "NUT_GOC")

Private Sub cmdThem_Click() Dim NutHienTai As Node Set NutHienTai = tvwDSSV.SelectedItem If NutHienTai Is Nothing Then Exit Sub tvwDSSV.Nodes.Add NutHienTai.Key, tvwChild, txtMaSV.Text, txtHoVaTen.Text, "icoFace" NutHienTai.Expanded = True '/// Mở (Expend) nút đó ra STT = STT + 1 txtMaSV.Text = "SV" & STT '/// Để đảm bảo các Key không trùng nhau End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Xoá nút đang chọn. Phương thức Remove cần chỉ số của nút cần xoá. '/// Chỉ số này tự động được lưu trong thuộc tính Index Private Sub cmdXoaNut_Click() If tvwDSSV.SelectedItem Is Nothing Then Exit Sub '/// Nếu không có nút thì thoát tvwDSSV.Nodes.Remove tvwDSSV.SelectedItem.Index End Sub '///--------------------------------------------------------------------------------------------------------------------------------- Private Sub cmdXoaTat_Click() tvwDSSV.Nodes.Clear '/// Phương thức Clear dùng để xoá một tập hợp nói chung End Sub '///--------------------------------------------------------------------------------------------------------------------------------- Private Sub cmdPrintNutCon_Click() Dim X As Node, N As Node

Page 120: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 120

Set X = tvwDSSV.SelectedItem If X Is Nothing Then Exit Sub If X.children = 0 Then Exit Sub Set X = X.Child Do While Not (X Is Nothing) Debug.Print "Key = " & X.Key & vbTab & "Text = " & X.Text Set X = X.Next Loop End Sub '///--------------------------------------------------------------------------------------------------------------------------------- Private Sub Form_Load() '/// 3 dòng này có thể bỏ qua nếu bạn thêm vào imlBieuTuong 1 biểu tượng tên là "icoFace" '/// trong lúc thiết kế (vào phần Properties). Ở đây xin thêm bằng mã lệnh. imlBieuTuong.ImageHeight = 16 imlBieuTuong.ImageWidth = 16 imlBieuTuong.ListImages.Add , "icoFace", LoadPicture("C:\Program Files\Microsoft Visual Studio\Common\Graphics\Icons\Misc\FACE02.ICO") tvwDSSV.HideSelection = False '/// Luôn tô sáng mục được chọn tvwDSSV.LabelEdit = tvwManual '/// Không cho sửa đổi nhãn của nút tvwDSSV.ImageList = imlBieuTuong '/// Sẽ lấy biểu tượng chứa trong imlBieuTuong

'/// Thêm một nút gốc vào cây tvwDSSV.Nodes.Add , , "NUT_GOC", "Trường ĐHSPKTHY"

'/// Thêm một số nút con (mức 1) vào sau nút gốc tvwDSSV.Nodes.Add "NUT_GOC", tvwChild, "Khoa CNTT", "Khoa CNTT" tvwDSSV.Nodes.Add "NUT_GOC", tvwChild, "Khoa CK", "Khoa Cơ Khí" tvwDSSV.Nodes.Add "NUT_GOC", tvwChild, "Khoa CB", "Khoa Cơ bản" tvwDSSV.Nodes.Add "NUT_GOC", tvwChild,"Khoa CKDL","Khoa Cơ khí động lực" tvwDSSV.Nodes.Add "NUT_GOC", tvwChild, "Khoa D-DT", "Khoa Điện - Điện tử" tvwDSSV.Nodes.Add "NUT_GOC", tvwChild, "Khoa MayTKTT", "Khoa May & TKTT" tvwDSSV.Nodes.Add "NUT_GOC", tvwChild, "Khoa SPKT", "Khoa SPKT" tvwDSSV.Nodes("NUT_GOC").Expanded = True '/// Mở rộng nút gốc STT = 1 txtMaSV.Text = "SV" & STT txtMaSV.Enabled = False

'/// Thêm một ô nữa trong Panel (Mặc định mỗi Panel chỉ có một ô) staThongTinThem.Panels.Add , , "Giá trị Text của nút được chọn" staThongTinThem.Panels(1).Text = "Giá trị key của nút đựơc chọn" End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Hiển thị thông tin của nút vừa được chọn khi người dùng click chuột Private Sub tvwDSSV_Click() staThongTinThem.Panels(1).Text = "Key = " & tvwDSSV.SelectedItem.Key staThongTinThem.Panels(2).Text = "Text = " & tvwDSSV.SelectedItem.Text End Sub

c. Ghi chú: Tại mỗi một nút bất kỳ, ta có thể chuyển đến các nút cha, nút con, nút anh em liền kề và "Anh cả", "em út" một cách dễ dàng thông qua các thuộc tính tương ứng. Hình dưới đây sẽ minh hoạ rõ nét hơn :

Page 121: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 121

Hình 4.18 - Mối liên quan giữa các nút với nút hiện tại (SelectedItem)

Bài 13 a. Hướng dẫn: Sử dụng thuộc tính CustomFormat để định dạng theo khuôn dạng mong muốn. Có thể dùng các hàm Month, Year v,v…để trích riêng từng thành phần. b. Chương trình mẫu Form1.frm

Option Explicit Private Sub cmdHienThiGiaTri_Click() With dtpNgayThang MsgBox "Ngày " & .Day &" Tháng " & .Month & " Năm " & .Year End With End Sub '///--------------------------------------------------------------------------------------------------------------------------------- Private Sub Form_Load() dtpNgayThang.Format = dtpCustom '/// Cho phép tuỳ biến định dạng ngày tháng End Sub '///--------------------------------------------------------------------------------------------------------------------------------- Private Sub optMy_Click() dtpNgayThang.CustomFormat = "MM/dd/yyyy" '/// Định dạng ngày kiểu Mỹ End Sub '///--------------------------------------------------------------------------------------------------------------------------------- Private Sub optNhatBan_Click() dtpNgayThang.CustomFormat = "yyyy/MM/dd" End Sub '///--------------------------------------------------------------------------------------------------------------------------------- Private Sub optVietNam_Click() dtpNgayThang.CustomFormat = "dd/MM/yyyy" End Sub

Bài 14 a. Hướng dẫn: Ý tưởng chính để giải quyết bài này như sau:

• Dùng một form chỉ chứa duy nhất một điều khiển là Window Media Player chuyên thực hiện chơi các file hình và tiếng. form này có tên là: frm4_14

Page 122: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 122

• Dùng form thứ hai thực hiện điều khiển các thông số của Window Media Player trong form thứ nhất. Form này đặt tên là : frm4_14_Setting

b. Chương trình mẫu Frm4_14.frm

Option Explicit Private Declare Sub SetWindowPos Lib "User32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) '----------------------------------------------------------------------------------------------------------------------------- Private Sub Form_Load() wmpMain.uiMode = "none" '/// Không hiển thị các điều khiển trên WM Player frm4_14_Setting.Show '/// Mở form frm4_14_Setting SetWindowPos frm4_14_Setting.hWnd, -1,0,0,0,0,83 '/// Đặt lên trên cùng (Topmost) End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Khi thay đổi kích thước form thì ta cũng kéo giãn kích thước của wmpMain bằng với form Private Sub Form_Resize() wmpMain.Top = 0 wmpMain.Left = 0 wmpMain.Height = Me.ScaleHeight wmpMain.Width = Me.ScaleWidth End Sub '///--------------------------------------------------------------------------------------------------------------------------------- Private Sub Form_Unload(Cancel As Integer) MsgBox "Bạn không thể đóng cửa sổ này", vbExclamation Cancel = True '/// Cancel = True không cho phép đóng End Sub '///--------------------------------------------------------------------------------------------------------------------------------- Private Sub wmpMain_PlayStateChange(ByVal NewState As Long) Static OldState As Integer If (NewState = wmppsTransitioning) And (OldState = wmppsMediaEnded) Then If frm4_14_Setting.lstSongList.ListIndex< frm4_14_Setting.lstSongList.ListCount-1 Then frm4_14_Setting.lstSongList.ListIndex=frm4_14_Setting.lstSongList.ListIndex + 1 Else frm4_14_Setting.lstSongList.ListIndex = 0 End If wmpMain.URL=frm4_14_Setting.lstSongList.List(frm4_14_Setting.lstSongList.ListIndex) wmpMain.Controls.Play '/// Chơi file này End If

'/// Cập nhật lại giá trị Max của thanh cuộn giả lập ở trong frm4_14_Setting '/// Giá trị Duration cho biết độ dài của bài hát (cuộn film) If (NewState = wmppsPlaying) Then

frm4_14_Setting.scrSeekBar.Max = Round(wmpMain.currentMedia.duration) End If OldState = NewState End Sub

c. Ghi chú:

• Khi muốn mở một Form nào đó thì theo cú pháp : <Tên Form>.Show. còn khi muốn ẩn thì gọi <Tên Form>.Hide. muốn nạp vào bộ nhớ nhưng chưa muốn

Page 123: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 123

hiển thị thì viết : Load <Tên Form>. Muốn xoá khỏi bộ nhớ thì viết : Unload <Tên Form>.

• Nếu muốn truy cập vào một điều khiển ở một form khác thì ta cần thêm phần tên của Form chứa điều khiển cần truy nhập, ví dụ: Form1.Text1.Text, Form2.txtHoVaTen.text v.v…)

• Hàm SetWindowPos ở trên là để luôn đặt frm4_14_Setting luôn luôn nổi ở trên tất cả các cửa sổ khác ! (Bạn có thể bỏ qua cũng được)

Viết code cho Form: frm4_14_Setting a. Hướng dẫn: Trong Form này sẽ thực hiện điều khiển toàn bộ công việc liên quan đến điều khiển Window Media Player ở form trước, bao gồm: Tắt loa, tăng/giảm volume, bật, tắt, tạm dừng bài hát, di chuyển thanh trượt báo hiệu thời lượng đã chơi file nhạc đó v.v… b. Chương trình mẫu frm4_14_Setting.frm

Option Explicit Dim FileHienTai As Integer '----------------------------------------------------------------------------------------------------------------------------- '/// hiển thị ở chế độ toàn màn hình hay không ? True có, False Không Private Sub chkFullScreen_Click() frm4_14.wmpMain.FullScreen = (chkFullScreen.Value = 1) End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Bật / Tắt loa. True Tắt, False Bật Private Sub chkMute_Click() frm4_14.wmpMain.Settings.mute = (chkMute.Value = 1) End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Xoá một file khỏi danh sách Private Sub cmdLoai_Click() If lstSongList.ListIndex >= 0 Then lstSongList.RemoveItem lstSongList.ListIndex End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Dừng / Tiếp tục chơi file hiện hành Private Sub cmdPause_Click() If cmdPause.Caption = "Pause" Then cmdPause.Caption = "Resume" frm4_14.wmpMain.Controls.pause Else cmdPause.Caption = "Pause" frm4_14.wmpMain.Controls.Play End If End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Chơi một file đang được chọn trong danh sách Private Sub cmdPlay_Click() If lstSongList.Text = "" Then Exit Sub frm4_14.wmpMain.URL = lstSongList.Text frm4_14.wmpMain.Controls.Play End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Stop chơi file hiện hành. Private Sub cmdStop_Click()

Page 124: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 124

frm4_14.wmpMain.Controls.Stop End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Bổ sung thêm một file vào danh sách các bài hát. Private Sub cmdThemFile_Click() Dim i As Integer dlgOpenFile.Filter = "Các file nhạc tiếng (wav, mp3, wma)|*.wav;*.mp3;*.wma|" dlgOpenFile.ShowOpen lstSongList.AddItem dlgOpenFile.FileName End Sub '///--------------------------------------------------------------------------------------------------------------------------------- Private Sub Form_Load() Dim F As Long, BaiHat As String '/// Nạp tên các file đã lưu trong tệp văn bản vào danh sách If Dir("c:\SongList.txt") <> "" Then F = FreeFile Open "c:\SongList.txt" For Input As #F Do While Not EOF(F) Line Input #F, BaiHat lstSongList.AddItem BaiHat Loop Close #F End If FileHienTai = -1 '/// Đồng hồ có chức năng liên tục cập nhật thời gian đã chơi của file hiện tại tmrUpdate.Interval = 1000 sldVolume.Max = 100 sldVolume.LargeChange = 10 sldVolume.SmallChange = 5 sldVolume.Value = frm4_14.wmpMain.Settings.volume End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Khi người dùng thoát khỏi chương trình thì lưu lại danh sách các bài hát Private Sub Form_Unload(Cancel As Integer) Dim F As Long, i As Integer F = FreeFile Open "c:\SongList.txt" For Output As #F For i = 0 To lstSongList.ListCount - 1 Print #F, lstSongList.List(i) Next Close #F End End Sub '///--------------------------------------------------------------------------------------------------------------------------------- Private Sub lstSongList_Click() FileHienTai = lstSongList.ListIndex End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Thay đổi tương ứng đến vị trí mà người dùng thay đổi thanh gạt giả lập Private Sub scrSeekBar_Scroll() frm4_14.wmpMain.Controls.currentPosition = scrSeekBar.Value End Sub '///---------------------------------------------------------------------------------------------------------------------------------

Page 125: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 125

'/// Điều chỉnh volume của loa Private Sub sldVolume_Click() frm4_14.wmpMain.Settings.volume = sldVolume.Value End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Cập nhật liên tục thời gian đã chơi file trên thanh gạt giả lập Private Sub tmrUpdate_Timer() scrSeekBar.Value = Round(frm4_14.wmpMain.Controls.currentPosition) End Sub

C- BÀI TẬP TỰ GIẢI Bài 1. Viết lại chương trình nghe nhạc cho hoàn chỉnh hơn (Nên tham khảo các chức năng quản lý bài hát của Winnamp và JetAudio. Bài 2. Sử dụng điều khiển TreeView để hiển thị cấu trúc cây thư mục của ổ đĩa C:\, (giả lập điều khiển DirListbox). HD: kết hợp sử dụng hàm API FindFirst, FindNext để lấy danh sách các file và thư mục của thư mục hiện hành, sau đó chèn vào cây. Bài 3: Viết chương trình tạo cây "Gia phả", trong đó cho phép người dùng có thể thêm các thế hệ con cháu (nút con của nút gốc). Sau đó thực hiện đếm xem một người (nút) có bao nhiêu con cháu (nút con). Bài 4: Viết chương trình tạo cây và thực hiện việc duyệt cây theo nhiều cách khác nhau (theo cấu trúc cây nhiều phân thông thường) và duyệt sử dụng khái niệm tập hợp (tức duyệt tập hợp có tên là Nodes của cây). Bài 5: Viết chương trình cho phép người dùng tạo cây sử dụng TreeView nhưng khi xoá một nút bất kỳ thì các nút con của nó không bị xoá mà được đẩy lên mức trên. Bài 6: Viết chương trình cho phép người dùng nhập danh sách các file (có cả đường dẫn) vào một ListView. Trong đó, tuỳ thuộc vào file nhập vào có phần mở rộng là exe, dll, txt, doc, xls, ppt ... thì hiển thị với một biểu tượng tương ứng. Và khi người dùng click đúp chuột vào một mục thì mở file đó. Bài 7: Sử dụng điều khiển ScriptControl viết chương trình vẽ đồ thị của hàm số, trong đó hàm số có thể nhập vào từ bàn phím khi chương trình đang chạy. Bài 8: Sử dụng điều khiển Inet, viết chương trình FTP với một số lệnh FTP đơn giản (HD: Tham khảo một số lệnh và ví dụ mẫu trong MSDN, tra phần Inet control) Bài 9: Xây dựng chương trình Website Download Manager, chương trình này cho phép Download về máy tính một danh sách các địa chỉ trang web chỉ định. (HD: Xem bài tập mẫu trong cùng chương này và xem trong MSDN) Bài 10: Xây dựng chương trình Download tương tự như trình Download Webzip. HD: Xem lại mô hình tài liệu DOM – Document Object Model và sử dụng điều khiển Webbrowser + thư viện HTML Object Library để truy cập nội dung (các links) bên trong một trang WEB.

Page 126: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 126

ch−¬ng v

kÕt nèi vμ thao t¸c víi csdl MỤC TIÊU: SAU KHI HOÀN THÀNH CÁC BÀI TẬP, NGƯỜI HỌC CÓ THỂ

Kết nối đến CSDL bằng điều khiển ADO Data Control và Connection Truy cập (Select, Update, Delete, Insert) dữ liệu sử dụng Connection Gắn kết dữ liệu giữa các điều khiển với đối tượng Connection Viết được một số ứng dụng quản trị CSDL đơn giản Tạo và trình bày báo cáo (Report) để in ra máy in.

A - ĐỀ BÀI TẬP Qui ước Các bài tập trong chương này đều liên quan đến việc kết nối và thao tác với một Cơ sở dữ liệu (CSDL) nhất định, do vậy để đảm bảo sự thống nhất cũng như tránh hiểu sai trong một số tình huống, Ở đây chúng ta chủ yếu sử dụng cơ sở dữ liệu sẵn có khi cài bộ Visual Studio 6.0, có tên là : Nwind.mdb. Sở dĩ chúng ta chọn CSDL này làm mẫu trong hầu hết các bài tập vì mấy lý do sau:

• Sẵn có trong máy tính khi cài Visual Basic. • Đây là một cơ sở dữ liệu được xây dựng thực tế từ quản lý bán hàng của

hãng North Wind, do vậy các bài tập liên quan sẽ sát với thực tiễn hơn. • Số lượng bản ghi trong CSDL này tương đối nhiều, đủ để minh hoạ trong rất

nhiều trường hợp, do đó không phải mất công sức để lại. • Trong CSDL này có nhiều bảng và đã được chuẩn hoá. • Có đầy đủ các mối quan hệ 1-nhiều, nhiều-nhiều để có thể thực hành với các

truy vấn nâng cao, truy vấn trên nhiều bảng đồng thời. Cơ sở dữ liệu Nwind.mdb thường được lưu trong thư mục cùng với thư mục VB: C:\Program Files\Microsoft Visual Studio\VB98\NWIND.MDB. Với đường dẫn rất dài như trên, nói chung là không được thuận tiện trong khi viết chương trình. Ta sẽ giả thiết rằng, với mỗi chương trình, tệp Nwind.mdb sẽ được Copy vào trong cùng thư mục với tệp dự án. Ví dụ, nếu ta có một dự án tên là : QLHSSV.VBP, đặt trong thư mục C:\Projects\QLHSSV thì tệp Nwin.mdb cũng phải được đặt trong thư mục này:

Hình 5.1 – Qui ước về việc copy và lưu tệp CSDL Nwind.mdb

Page 127: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 127

Ở đây cũng xin được cung cấp danh sách tất cả 8 bảng và mối quan hệ giữa các bảng này để chúng ta tiện theo dõi và tham khảo trong quá trình làm bài tập.

Hình 5.2 – Các bảng và sơ đồ liên kết giữa chúng trong CSDL Nwind.mdb

Kiểu dữ liệu của mỗi trường trong từng bảng cũng xin được cung cấp tại đây: Hãy lưu ý là chi tiết của từng kiểu dữ liệu (độ rộng) trong mỗi bảng có thể tham khảo bằng cách mở trực tiếp bảng đó ở chế độ Design View.

Hình 5.3 - Bảng Suppliers (Nhà cung cấp)

Page 128: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 128

Hình 5.4 - Bảng Products (Sản phẩm)

Hình 5.5 - Bảng Order Details (Chi tiết đơn hàng)

Hình 5.6 - Bảng Orders (Đơn hàng)

Hình 5.7 - Bảng Customers (Khách hàng)

Page 129: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 129

Hình 5.8 - Bảng Categories (Chủng loại sản phẩm)

Hình 5.9 - Bảng Employees (Nhân viên bán hàng)

Hình 5.10 - Bảng Shippers (Công ty vận chuyển)

Các bài tập (từ 1-11) sử dụng điều khiển ADO Data Bài 1: Viết chương trình xem thông tin về khách hàng (Version 1). a. Giao diện:

Hình 5.11 – Xem thông tin về khách hàng bằng ADO Data control và Textbox

b. Yêu cầu:

• Xây dựng giao diện chương trình như hình 11 • Có thể xem thông tin về khách hàng (gồm mã, họ tên, địa chỉ, số điện thoại)

bằng cách click vào các nút trên điều khiển ADO Data control.

Page 130: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 130

Bài 2: Viết chương trình xem thông tin về khách hàng (Version 2) a. Giao diện

Hình 5.12 – Xem thông tin về khách hàng sử dụng các phương thức của ADO

b. Yêu cầu

• Xây dựng giao diện như hình 12 • Chương trình có thể di chuyển đến các bản ghi thông qua các nút nhấn • Có cập nhật trạng thái (Enable/Disable) các nút khi đến BOF, EOF của bảng. • Nội dung trong các textbox không được phép thay đổi.

Bài 3: Viết chương trình xem thông tin về khách hàng (Version 3) a. Giao diện

Hình 5.13 – Danh sách khách hàng hiển thị trong Data Grid Control

b. Yêu cầu : Hiển thị tất cả các bản ghi trong bảng Customers trong một DataGrid Bài 4: Viết chương trình xem thông tin về khách hàng (Version 4) a. Giao diện

Hình 5.14 – Thông tin hiển thị chỉ gồm 4 trường

b. Yêu cầu: Như bài 3 nhưng thông tin hiển thị chỉ gồm 4 trường

Page 131: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 131

Bài 5: Viết chương trình xem một bảng CSDL bất kỳ trong CSDL NWind a. Giao diện

Hình 5.15 – Nạp một bảng bất kỳ trong CSDL NWind vào Data Grid

b. Yêu cầu: Khi người dùng chọn tên bảng và click vào nút "Xem bảng này" thì chương trình nạp và hiển thị bảng vừa được chọn trong một Data Grid. Bài 6: Viết chương trình nạp tất cả mã nhà cung cấp vào một hộp Combo a. Giao diện

Hình 5.16 -Nạp các mã nhà cung cấp vào một ComboBox

b. Yêu cầu: Nạp tất cả các Mã nhà cung cấp (SupplierID) trong bảng Suppliers vào một hộp Combo như hình 16 Bài 7: Viết chương trình liệt kê các sản phẩm do 1 công ty cung cấp (ver 1) a. Giao diện

Hình 5.17 - Chỉ hiển thị các sản phẩm ứng với mã NCC được chọn

Page 132: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 132

b. Yêu cầu:

• Nạp tất cả các mã nhà cung cấp (Supplier) vào hộp Combo (Như bài số 6)

• Khi người dùng chọn một mã nhà cung cấp trong Hộp Combo và click nút "Liệt kê các sản phẩm của NCC này" thì hiển thị tất cả các sản phẩm mà nhà cung cấp này đã cung ứng (Như hình 17).

Bài 8: Viết chương trình liệt kê các sản phẩm do 1 công ty cung cấp (ver 2) a. Giao diện

Hình 5.18 – Liệt kê các sản phẩm sử dụng TreeView và DataGrid

b. Yêu cầu

• Nạp Mã (SupplierID) và tên Công ty (CompanyName) trong bảng Suppliers vào một cây (TreeVIew), trong đó Mã được lưu trong trường Key và Tên công ty được lưu trong trường Text của mỗi nút thuộc cây.

• Khi người dùng click chuột lên một nút (tên công ty) trong cây thì hiển thị tất cả các sản phẩm mà công ty đó cung cấp (Hiển thị tất cả các trường trong bảng Products) trong một Datagrid control như hình 18.

Bài 9: Như bài 8 nhưng các sản phẩm được hiển thị trong một ListView. (Để cho ngắn gọn, hãy liệt kê 3 trường là ProductName,CategoryID,UnitPrice) như H.19. a. Giao diện:

Hình 5.19 - Hiển thị sản phẩm trong ListView

Page 133: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 133

b. Yêu cầu: Khi người dùng click vào tên nhà cung cấp thì hiển thị SP trong ListView Bài 10: Xây dựng cây nhiều mức để xem thông tin về những sản phẩm đã bán a. Giao diện:

Hình 5.20 – Xem thông tin bán hàng của mỗi sản phẩm

b. Yêu cầu:

• Nạp tên các công ty cung cấp sản phẩm vào cây (Nạp vào mức 1, sau gốc) • Ứng với mỗi công ty, nạp các sản phẩm mà công ty sản xuất • Khi người dùng click vào tên một sản phẩm (như hình 20) thì hiển thị các hoá

đơn có xuất hiện sản phẩm này. Thông tin hiển thị gồm Mã, giá, số lượng. Bài 11: Bổ sung thêm một trường mới trong câu lệnh SELECT

Hình 5.21 – Thêm một cột (trường) trong câu lệnh SELECT

Yêu cầu: Như bài 10 nhưng thông tin hiển thị có thêm trường "Giá trị", trường này được dẫn xuất từ việc tính : Giá trị = Giá * Số lượng.

Page 134: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 134

Các bài tập sử dụng đối tượng connection và Recordset --------------------------------------

Bài 12: Thực hiện yêu cầu như bài tập 5 nhưng chỉ sử dụng đối tượng Connection và đối tượng Recordset để thao tác với CSDL. Bài tập 13: Làm lại bài 10 với sử dụng đối tượng Connection và Recordset Bài tập 14: Thao tác CSDL trên nhiều Form a. Mô tả chương trình Trong chương trình này, chúng ta sẽ xây dựng một ứng dụng gồm 3 Form để minh

hoạ việc sử dụng đối tượng kết nối Connection. Đối tượng Connection sẽ được sử

dụng chung trong tất cả các form (không giống với điều khiển ADO Data trước đây).

Ứng dụng này sẽ có 3 Form và một Module:

• Form thứ nhất có tên là frmNhapNCC: Để nhập thêm các nhà cung cấp vào bảng Suppliers.

• Form thứ hai có tên là frmNhapSP để nhập các sản phẩm mà một Nhà cung cấp sản xuất.

• Form chính: Tên là frmMain. Form này sẽ hiển thị danh sách các nhà cung cấp và sản phẩm (như bài tập số 9). Ngoài ra, trong form này có 2 nút lệnh là "Nhập NCC" và "Nhập sản phẩm", khi click vào nút thứ nhất thì hiển thị frmNhapNCC, khi Click vào nút thứ hai thì hiển thị frmNhapSP.

• Module có tên là modKetNoi: Trong module này sẽ khai báo biến toàn cục là đối tượng Connection tên là Cn. Đối tượng Cn này sẽ được sử dụng chung trong các form.

b. Giao diện khi chạy chương trình (Hình 22,23,24)

Hình 5.22 – Giao diện của form : frmMain

Page 135: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 135

Hình 5.23 – Giao diện form: frmNhapNCC

Hình 5.24 – Giao diện form: frmNhapSP

Bài 15: Thiết kế báo cáo và kết xuất ra máy in danh sách các sản phẩm (ver 1)

Hình 5.25 – Báo cáo danh sách các sản phẩm để in ra máy in

Page 136: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 136

Bài 16: Thiết kế báo cáo và kết xuất ra máy in danh sách các sản phẩm (ver 2)

Hình 5.26 – Báo cáo có thêm khung viền (Border)

B- HƯỚNG DẪN - GIẢI MẪU Bài 1: Viết chương trình xem thông tin về khách hàng (Version 1). a. Thiết kế giao diện

Hình 5.27 - Đặt tên cho các điều khiển trên Form

b. Hướng dẫn : Sử dụng từ khoá SET để gắn kết các Textbox với ADO data Control. Có 2 cách để gắn kết, là gắn kết trong lúc thiết kế hoặc gắn kết thông qua mã lệnh. Để gắn kết, chỉ cần đặt 2 thuộc tính là DataSource và DataField. Datasource cho biết là lấy dữ liệu từ nguồn nào còn Datafield cho biết là lấy (hiển thị) trường nào ? c. Chương trình mẫu Option Explicit Private Sub Form_Load() Dim strConn As String strConn = "Provider=Microsoft.jet.oledb.4.0; Data Source=" & App.Path & "\Nwind.mdb" adoDSKH.ConnectionString = strConn adoDSKH.CommandType = adCmdTable '/// Sẽ lấy một bảng adoDSKH.RecordSource = "Customers" '/// Bảng có tên là Customers adoDSKH.Refresh Set txtMaKH.DataSource = adoDSKH '/// Nguồn dữ liệu lấy từ adoDSKH txtMaKH.DataField = "CustomerID" '/// Trường hiển thị là CustomerID Set txtHoTenKH.DataSource = adoDSKH

Page 137: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 137

txtHoTenKH.DataField = "ContactName" Set txtDiaChiKH.DataSource = adoDSKH txtDiaChiKH.DataField = "Address" Set txtDienThoaiKH.DataSource = adoDSKH txtDienThoaiKH.DataField = "Phone" End Sub

d. Ghi chú: Nếu thuộc tính CommandType của adoDSKH là adCmdTable thì thuộc tính RecourceSource phải chứa tên của bảng, còn nếu thuộc tính adCmdTable là adCmdText thì thuộc tính RecordSource phải là một câu lệnh SQL (ví dụ Select, Update, Delete, Insert...)

Bài 2: Viết chương trình xem thông tin về khách hàng (Version 2) a. Thiết kế giao diện

Hình 5.28 – Đặt tên cho các điều khiển trên Form

b. Hướng dẫn : Sử dụng các phương thức di chuyển bản ghi có sẵn của đối tượng con Recordset trong điều khiển ADO Data. Tuy nhiên cần kiển tra trước khi di chuyển (thông qua việc kiểm tra thuộc tính EOF và BOF) c. Chương trình mẫu

Option Explicit Private Sub Form_Load() Dim strConn As String strConn="Provider=Microsoft.jet.oledb.4.0;Data Source=" & App.Path & "\Nwind.mdb" adoDSKH.ConnectionString = strConn adoDSKH.CommandType = adCmdTable adoDSKH.RecordSource = "Customers" adoDSKH.Refresh Set txtMaKH.DataSource = adoDSKH txtMaKH.DataField = "CustomerID" Set txtHoTenKH.DataSource = adoDSKH txtHoTenKH.DataField = "ContactName" Set txtDiaChiKH.DataSource = adoDSKH txtDiaChiKH.DataField = "Address" Set txtDienThoaiKH.DataSource = adoDSKH txtDienThoaiKH.DataField = "Phone"

Page 138: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 138

Dim Cmd As Object For Each Cmd In Controls If TypeOf Cmd Is TextBox Then Cmd.Locked = True Next adoDSKH.Visible = False '/// Ẩn điều khiển ADO Data, sử dụng nút nhấn End Sub '------------------------------------------------------------------------------------------------------------------------ '/// Cập nhật lại trạng thái (Enable/Disable) của các nút nhất khi đã hết bản ghi (EOF và BOF) Sub CapNhatNutNhan() cmdPrevious.Enabled = (adoDSKH.Recordset.BOF = False) cmdNext.Enabled = (adoDSKH.Recordset.EOF = False) End Sub '------------------------------------------------------------------------------------------------------------------------ '/// Trở về bản ghi đầu tiên Private Sub cmdFirst_Click() adoDSKH.Recordset.MoveFirst Call CapNhatNutNhan End Sub '------------------------------------------------------------------------------------------------------------------------ '/// Trở về bản ghi cuối cùng Private Sub cmdLast_Click() adoDSKH.Recordset.MoveLast Call CapNhatNutNhan End Sub '------------------------------------------------------------------------------------------------------------------------ '/// Trở về bản ghi tiếp theo Private Sub cmdNext_Click() If adoDSKH.Recordset.EOF = False Then adoDSKH.Recordset.MoveNext Call CapNhatNutNhan End Sub '------------------------------------------------------------------------------------------------------------------------ '/// Trở về bản ghi đứng trước Private Sub cmdPrevious_Click() If adoDSKH.Recordset.BOF = False Then adoDSKH.Recordset.MovePrevious Call CapNhatNutNhan End Sub

Bài 3: Viết chương trình xem thông tin về khách hàng (Version 3) a. Thiết kế giao diện

Hình 5.29 – Giao diện và tên các điều khiển

b. Hướng dẫn: Sử dụng câu lệnh SET để gắn kết Datagrid với ADO Data c. Chương trình mẫu:

Page 139: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 139

Option Explicit Private Sub Form_Load() Dim strConn As String strConn="Provider=Microsoft.jet.oledb.4.0;Data Source=" & App.Path & "\Nwind.mdb" adoDSKH.ConnectionString = strConn adoDSKH.CommandType = adCmdTable adoDSKH.RecordSource = "Customers" adoDSKH.Refresh Set dgrDSKH.DataSource = adoDSKH '/// (gắn) Hiển thị dữ liệu trong adoDSKH adoDSKH.Visible = False '/// Ẩn điều khiển adoDSKH End Sub

d. Ghi chú: Khi gắn kết DataGrid với ADO và thuộc tính CommandType của ADO

Data là adcmdTable thì người dùng có thể sửa, thêm bản ghi trực tiếp trên DataGrid.

(Với điều kiện thuộc tính AllowUpdate, AllowAddNew). Nói chung, không nên cho

phép điều này bởi vì khi người dùng cập nhật trực tiếp như vậy, chúng ta rất khó có

thể kiểm soát được dữ liệu nhập vào này.

Bài 4: Viết chương trình xem thông tin về khách hàng (Version 4) a. Thiết kế giao diện: Giống như bài số 3 b. Hướng dẫn: Vì ở đây chỉ hiển thị 3 trường chứ không phải tất cả, do vậy phải sử

dụng đến câu lệnh SQL. Như vậy cần đặt lại thuộc tính CommandType=adcmdTable

và thuộc tính Recordsource là câu lệnh SELECT.

c. Chương trình mẫu Option Explicit Private Sub Form_Load() Dim strConn As String, strSQL As string strConn="Provider=Microsoft.jet.oledb.4.0;Data Source=" & App.Path & "\Nwind.mdb" adoDSKH.ConnectionString = strConn

strSQL = "SELECT Customerid,ContactName, Address, Phone from Customers" adoDSKH.CommandType = adCmdText adoDSKH.RecordSource= strSQL adoDSKH.Refresh Set dgrDSKH.DataSource = adoDSKH adoDSKH.Visible = False End Sub

d. Ghi chú: Khi sử dụng câu lệnh SELECT để lấy dữ liệu về thì người dùng không thể sửa đổi dữ liệu trực tiếp trên DataGrid.

Page 140: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 140

Bài 5: Viết chương trình xem một bảng CSDL bất kỳ trong CSDL NWind a. Thiết kế giao diện

Hình 5.30 – Giao diện chương trình

b. Hướng dẫn: Vẫn sử dụng cách trước đây là thay đổi tên bảng cho thuộc tính Recordsource. Tuy nhiên, vì một ADO Data được sử dụng nhiều lần và mở nhiều bảng do vậy trước khi mở bảng mới cần kiểm tra và đóng lại. c. Chương trình mẫu Option Explicit Private Sub cmdXem_Click() If Not (adoBang.Recordset Is Nothing) Then adoBang.Recordset.Close adoBang.RecordSource = "[" & cboDSBang.Text & "]" '/// cần đặt trong [ ] adoBang.Refresh Set dgrHienThi.DataSource = adoBang End Sub '------------------------------------------------------------------------------------------------------------------------ Private Sub Form_Load() Dim strConn As String strConn="Provider=Microsoft.jet.oledb.4.0;Data Source=" & App.Path & "\Nwind.mdb" adoDSKH.ConnectionString = strConn adoBang.CommandType = adCmdTable adoBang.RecordSource = "Customers" adoBang.Refresh Set dgrHienThi.DataSource = adoBang cboDSBang.AddItem "Customers" cboDSBang.AddItem "Products" cboDSBang.AddItem "Employees" cboDSBang.AddItem "Categories" cboDSBang.AddItem "Suppliers" cboDSBang.AddItem "Orders" cboDSBang.AddItem "Order details" '/// Tên của bảng này chứa dấu cách cboDSBang.AddItem "Shippers" cboDSBang.Text = "Customers" adoBang.Visible = False End Sub

d. Ghi chú:

Page 141: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 141

• Có thể sử dụng câu lệnh dạng ... Is Nothing ... để kiểm tra xem một đối tượng có rỗng hay không (tức chưa trỏ tới đối tượng nào trước đó).

• Tên bảng trong Access có thể chứa dấu cách, khi đó để không bị lỗi thì tên bảng đó phải đặt trong cặp ngoặc [ ] trước khi gán cho thuộc tính Recordsource, giống như trong bài này. Với các bảng mà tên không chứa dấu cách thì bạn có thể thêm vào hoặc không.

• Khi thiết kế CSDL, không nên đặt tên bảng chứa dấu cách. Bài 6: Viết chương trình nạp tất cả mã nhà cung cấp vào một hộp Combo a. Thiết kế giao diện

Hình 5.31 – Giao diện chương trình

b. Hướng dẫn: Sử dụng vòng lặp để duyệt các bản ghi trong Recordset c. Chương trình mẫu Option Explicit Private Sub Form_Load() Dim strConn As String strConn="Provider=Microsoft.jet.oledb.4.0;Data Source=" & App.Path & "\Nwind.mdb" adoDSKH.ConnectionString = strConn adoMaNCC.CommandType = adCmdTable adoMaNCC.RecordSource = "Suppliers" adoMaNCC.Refresh Do While adoMaNCC.Recordset.EOF = False cboMaNCC.AddItem adoMaNCC.Recordset!SupplierID adoMaNCC.Recordset.MoveNext Loop End Sub

d. Ghi chú: Đây là công việc rất hay gặp phải, do vậy chúng ta nên nắm rõ. Bài 7: Viết chương trình liệt kê các sản phẩm do 1 công ty cung cấp (ver 1) a. Thiết kế giao diện

Hình 5.32 – Giao diện chương trình

Page 142: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 142

b. Hướng dẫn: Do phải nạp dữ liệu vào 2 nơi (Combo và DataGrid) nên cần 2 điều khiển ADO Data. c. Chương trình mẫu Option Explicit Private Sub cmdLietKe_Click() Dim strSQL As String, strConn As String strConn="Provider=Microsoft.jet.oledb.4.0;Data Source=" & App.Path & "\Nwind.mdb" adoDSKH.ConnectionString = strConn adoSanPham.CommandType = adCmdText If Not (adoSanPham.Recordset Is Nothing) Then adoSanPham.Recordset.Close strSQL = "Select * FROM Products WHERE SupplierID =" & cboMaNCC.Text adoSanPham.RecordSource = strSQL adoSanPham.Refresh Set dgrSanPham.DataSource = adoSanPham End Sub '------------------------------------------------------------------------------------------------------------------------ Private Sub Form_Load()

Dim strConn As String strConn="Provider=Microsoft.jet.oledb.4.0;Data Source=" & App.Path &"\Nwind.mdb"

adoMaNCC.ConnectionString = strConn adoMaNCC.CommandType = adCmdText adoMaNCC.RecordSource = "SELECT SupplierID FROM Suppliers" adoMaNCC.Refresh cboMaNCC.Clear Do While adoMaNCC.Recordset.EOF = False cboMaNCC.AddItem adoMaNCC.Recordset!SupplierID adoMaNCC.Recordset.MoveNext Loop adoMaNCC.Visible = False adoSanPham.Visible = False End Sub

d. Ghi chú : Đây là dạng bài toán rất hay gặp phải là : Click vào một mục thì sẽ hiển thị thông tin về các con của mục đó. Bài 8: Viết chương trình liệt kê các sản phẩm do 1 công ty cung cấp (ver 2) a. Thiết kế giao diện:

Hình 5.33 – Giao diện và tên các điều khiển

Page 143: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 143

b. Hướng dẫn: Nạp thông tin về nhà cung cấp (SupplierID và CompanyName) vào các nút của cây. Trong đó SupplierID nạp vào thuộc tính Key và Company nạp vào thuộc tính Text. Tuy nhiên, cần lưu ý rằng, Thuộc tính Key của mỗi nút trên cây phải không được là số, trong khi đó thuộc tính SupplierID là một số (Autonumber). Do vậy, khi thêm ta sẽ ghép thêm một xâu ký tự - ví dụ "M1" – vào thuộc tính Key. Khi người dùng click vào một nút thì ta phải xem đó có phải là click vào Tên một công ty nào đó hay không ? Nếu đúng thì lấy các sản phẩm tương ứng với công ty này và cho hiển thị trong DataGrid. Lưu ý là : trước đó, mỗi nút ta đã thêm "M1", nên khi chọn trong bảng CSDL cần phải bỏ xâu này trước khi so sánh. c. Chương trình mẫu Option Explicit Sub NapMaNhaCC() Dim strConn As String strConn="Provider=Microsoft.jet.oledb.4.0;Data Source=" & App.Path & "\Nwind.mdb" adoDSKH.ConnectionString = strConn adoMaNCC.CommandType = adCmdText adoMaNCC.RecordSource = "SELECT SupplierID, CompanyName FROM Suppliers" adoMaNCC.Refresh tvwNhaCC.Nodes.Clear '/// Xoá cây tvwNhaCC.LabelEdit = tvwManual '/// Không cho sửa đổi nhãn của nút tvwNhaCC.Nodes.Add , , "NUT_GOC", "Tên các nhà cung cấp" '/// Tạo nút gốc Do While adoMaNCC.Recordset.EOF = False tvwNhaCC.Nodes.Add "NUT_GOC", tvwChild, "M1" & adoMaNCC.Recordset!SupplierID, adoMaNCC.Recordset!CompanyName adoMaNCC.Recordset.MoveNext Loop tvwNhaCC.Nodes("NUT_GOC").Expanded = True '/// Mở rộng nút gốc End Sub '------------------------------------------------------------------------------------------------------------------------ Private Sub Form_Load() Call NapMaNhaCC '/// Nạp các nhà cung cấp vào các nút của Cây adoMaNCC.Visible = False '/// Ẩn adoMaNCC adoSanPham.Visible = False '/// Ẩn adoSanPham End Sub '------------------------------------------------------------------------------------------------------------------------ '/// Sự kiện này xuất hiện khi người dùng click lên một nút của cây Private Sub tvwNhaCC_NodeClick(ByVal Node As MSComctlLib.Node) If Node.Key = "NUT_GOC" Then Exit Sub '/// Nếu là nút gốc thì thoát Dim MaNCC As String MaNCC = Mid(Node.Key, 3) '///Bỏ xâu ký tự "M1" ở đầu đi, chỉ lấy phần Mã NCC thôi

'/// Cần phải kiểm tra nếu adoSanPham đang mở 1 bảng thì cần phải đóng lại If Not (adoSanPham.Recordset Is Nothing) Then adoSanPham.Recordset.Close

adoSanPham.ConnectionString = "Provider=Microsoft.jet.oledb.4.0; Data Source=" & App.Path & "\Nwind.mdb"

adoSanPham.CommandType = adCmdText adoSanPham.RecordSource = "SELECT * FROM Products WHERE SupplierID=" &

Page 144: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 144

MaNCC adoSanPham.Refresh Set dgrSanPham.DataSource = adoSanPham '/// Hiển thị các sản phẩm End Sub

Bài 9: Sử dụng với TreeView a. Thiết kế giao diện

Hình 5.34 - Hiển thị sản phầm trong ListView

b. Hướng dẫn: Tham khảo chương IV, phần Listview, TreeView. Trong đó, lvwSanPham.ListItems.Add để thêm một hàng (bản ghi) mới. Sau đó trỏ tới bản ghi này và thêm nội dung của các cột 2, cột 3,..) c. Chương trình mẫu

Option Explicit '------------------------------------------------------------------------------------------------------------------------ '/// Thủ tục Nạp mã nhà cung cấp vào Cây. Sub NapMaNhaCC() Dim strConn As String strConn="Provider=Microsoft.jet.oledb.4.0;Data Source=" & App.Path & "\Nwind.mdb" adoDSKH.ConnectionString = strConn adoMaNCC.CommandType = adCmdText adoMaNCC.RecordSource = "SELECT SupplierID, CompanyName FROM Suppliers" adoMaNCC.Refresh tvwNhaCC.Nodes.Clear tvwNhaCC.LabelEdit = tvwManual tvwNhaCC.Nodes.Add , , "NUT_GOC", "Tên các nhà cung cấp" Do While adoMaNCC.Recordset.EOF = False tvwNhaCC.Nodes.Add "NUT_GOC", tvwChild, "M1" & adoMaNCC.Recordset!SupplierID, adoMaNCC.Recordset!CompanyName adoMaNCC.Recordset.MoveNext Loop tvwNhaCC.Nodes("NUT_GOC").Expanded = True End Sub '------------------------------------------------------------------------------------------------------------------------ '/// Khởi tạo ListView, tạo 3 cột với các nhãn tương ứng. Sub KhoiTaoListView() lvwSanPham.ColumnHeaders.Add , , "Tên sản phẩm" lvwSanPham.ColumnHeaders.Add , , "Mã loại" lvwSanPham.ColumnHeaders.Add , , "Đơn giá"

Page 145: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 145

lvwSanPham.View = lvwReport lvwSanPham.GridLines = True End Sub Private Sub Form_Load() Call NapMaNhaCC '/// Nạp mã nhà cung cấp Call KhoiTaoListView '/// Khởi tạo ListView adoMaNCC.Visible = False '/// Ẩn 2 điều khiển này đi vì không dùng đến. adoSanPham.Visible = False End Sub '------------------------------------------------------------------------------------------------------------------------ '/// Thủ tục này được kích hoạt khi người dùng click vào một nút trên cây Private Sub tvwNhaCC_NodeClick(ByVal Node As MSComctlLib.Node) If Node.Key = "NUT_GOC" Then Exit Sub '/// Nếu là nút gốc thì không xử lý Dim MaNCC As String, Nut As ListItem If Not (adoSanPham.Recordset Is Nothing) Then adoSanPham.Recordset.Close MaNCC = Mid(Node.Key, 3) '///Bỏ xâu ký tự "M1" ở đầu đi, chỉ lấy phần Mã NCC thôi adoSanPham.ConnectionString= "Provider=Microsoft.jet.oledb.4.0;Data Source=" & _ App.Path & "\Nwind.mdb"

adoSanPham.CommandType = adCmdText adoSanPham.RecordSource = "SELECT * FROM Products WHERE SupplierID=" & MaNCC adoSanPham.Refresh lvwSanPham.ListItems.Clear Do While adoSanPham.Recordset.EOF = False With adoSanPham Set Nut=lvwSanPham.ListItems.Add(, "A" & .Recordset!ProductID, .Recordset!ProductID) Nut.SubItems(1) = .Recordset!CategoryID Nut.SubItems(2) = .Recordset!UnitPrice .Recordset.MoveNext End With Loop End Sub

Bài 10: Xây dựng cây nhiều mức để xem thông tin về những sản phẩm đã bán a. Thiết kế giao diện

Hình 5.35 – Tên của các điều khiển trong chương trình

b. Hướng dẫn

Page 146: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 146

• Thuật toán ở đây là : Nạp từng Mã nhà cung cấp và ứng với mỗi nhà cung cấp thì lại nạp các sản phẩm vào nút của nhà cung cấp đó (Tức dùng vòng lặp lồng nhau).

• Lưu ý với điều khiển Treeview: Khi thêm một nút vào cây thì giá trị Key của mỗi nút không được là SỐ. Nhưng trong CSDL, trường SupplierID lại là một trường số (Autonumber), do vậy để giải quyết sự bất tiện này thì trước khi thêm một nút thì ta thêm thuộc tính Key một xâu ký tự, ví dụ "M1", "M2".. tương ứng với các mức. Chẳng hạn với nút gốc (Mức 0) thì ta thêm xâu "M0", với mức 1 thì ta thêm xâu "M1". Điều này cũng rất thuận tiện về sau, khi người dùng click vào một nút thì chỉ cần lấy 2 ký tự đầu của thuộc tính Key ta sẽ biết ngay là nút được click thuộc mức mấy để có xử lý phù hợp !

c. Chương trình mẫu

Option Explicit Dim strConn As String '------------------------------------------------------------------------------------------------------------------------ '//// Nạp Mã nhà cung cấp và các sản phẩm của nhà cung cấp đó khi nạp form Private Sub Form_Load() strConn = "Provider=Microsoft.jet.oledb.4.0;" strConn = strConn & "Data source= " & App.Path & "\Nwind.mdb" Call NapMaNhaCC Call KhoiTaoListView adoMaNCC.Visible = False adoSanPham.Visible = False adoCTDonHang.Visible = False End Sub '------------------------------------------------------------------------------------------------------------------------ '/// Nạp mã nhà cung cấp vào cây. Khi nạp một NCC thì nạp các sản phẩm ngay vào nút đó Sub NapMaNhaCC() Dim Key As String adoMaNCC.ConnectionString = strConn adoMaNCC.CommandType = adCmdText adoMaNCC.RecordSource = "SELECT SupplierID, CompanyName FROM Suppliers" adoMaNCC.Refresh tvwNhaCC.Nodes.Clear tvwNhaCC.LabelEdit = tvwManual tvwNhaCC.Nodes.Add , , "M0NUT_GOC", "Tên các nhà cung cấp" Do While adoMaNCC.Recordset.EOF = False Key = "M1" & adoMaNCC.Recordset!SupplierID tvwNhaCC.Nodes.Add "M0NUT_GOC",tvwChild, Key,adoMaNCC.Recordset!CompanyName NapSanPhamVaoNCC Key adoMaNCC.Recordset.MoveNext Loop adoMaNCC.Recordset.Close tvwNhaCC.Nodes("M0NUT_GOC").Expanded = True End Sub

Page 147: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 147

'----------------------------------------------------------------------------------------------------------------------- '/// Nạp các sản phẩm vào nút nhà cung cấp. Nút này có mà là MaNCC '/// Vì trường Key của mỗi nút chứa xâu "M1" & SupplierID, do vậy khi Select cần phải bỏ '/// xâu "M1" đi bằng cách viết Mid(MaNCC,3). '/// Cũng giống như trường SupplierID, trường ProductID cũng là trường số, do vậy cần '/// phải thêm một xâu, ví dụ "M2" vào thuộc tính Key. '----------------------------------------------------------------------------------------------------------------------- Sub NapSanPhamVaoNCC(MaNCC As String) Dim MaSP As String, TenSP As String adoSanPham.ConnectionString = strConn adoSanPham.CommandType = adCmdText adoSanPham.RecordSource = "Select * from Products where SupplierID=" & Mid(MaNCC,3) adoSanPham.Refresh Do While adoSanPham.Recordset.EOF = False MaSP = adoSanPham.Recordset!ProductID TenSP = adoSanPham.Recordset!ProductName tvwNhaCC.Nodes.Add MaNCC, tvwChild, "M2" & MaSP, TenSP adoSanPham.Recordset.MoveNext Loop adoSanPham.Recordset.Close End Sub '------------------------------------------------------------------------------------------------------------------------ '/// Khởi tạo Listview: Tạo ra 3 cột là OrderID, UnitPrice và Quantity Sub KhoiTaoListView() lvwCTDonHang.ColumnHeaders.Add , , "Mã đơn hàng" lvwCTDonHang.ColumnHeaders.Add , , "Giá ($)" lvwCTDonHang.ColumnHeaders.Add , , "Số lượng" lvwCTDonHang.View = lvwReport lvwCTDonHang.GridLines = True End Sub '------------------------------------------------------------------------------------------------------------------------ '/// Hiển thị tất cả các hoá đơn có xuất hiện mặt hàng vừa được click chọn '/// Vì nút đang được chọn có MaSP = "M2" & ProductID, do vậy để lấy ra mã sản phẩm '/// thực sự cho câu lệnh truy vấn thì cần phải bỏ xâu "M2", tức là viết : Mid(MaSP,3) '------------------------------------------------------------------------------------------------------------------------ Sub CTDonHang(MaSP As String) Dim MucMoi As ListItem adoCTDonHang.ConnectionString = strConn adoCTDonHang.CommandType = adCmdText adoCTDonHang.RecordSource="Select *FROM [Order details] where ProductID=" &Mid(MaSP,3) adoCTDonHang.Refresh lvwCTDonHang.ListItems.Clear Do While adoCTDonHang.Recordset.EOF = False Set MucMoi = lvwCTDonHang.ListItems.Add(, , adoCTDonHang.Recordset!OrderID) MucMoi.SubItems(1) = adoCTDonHang.Recordset!UnitPrice & " $" MucMoi.SubItems(2) = adoCTDonHang.Recordset!Quantity adoCTDonHang.Recordset.MoveNext Loop adoCTDonHang.Recordset.Close End Sub '------------------------------------------------------------------------------------------------------------------------ '/// Khi người dùng click một nút thì cần trích 2 ký tự đầu để biết là người dùng click vào '/// nút gốc (M0), tên nhà cung cấp (M1) hay sản phẩm (M2) để có xử lý phù hợp. '/// Thuộc tính Node sẽ cho biết thông tin (trỏ đến) nút được chọn. Private Sub tvwNhaCC_NodeClick(ByVal Node As MSComctlLib.Node)

Page 148: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 148

Select Case Left(Node.Key, 2) '/// Lấy 2 ký tự đầu Case "M0" '/// Click vào nút gốc Case "M1" '/// Click vào Nhà cung cấp Case "M2" '/// Click vào sản phẩm lblCTDonHang.Caption="C¸c ®¬n hµng cã SP " &tvwNhaCC.SelectedItem.Parent.Text CTDonHang Node.Key End Select End Sub

d. Ghi chú:

• Khi thêm một nút vào cây thì phải đảm bảo thuộc tính Key là duy nhất, nếu không lỗi runtime sẽ xảy ra.

• Có thể truy cập đến một nút nếu biết giá trị Key của nó. Ví dụ, nếu thuộc tính Key có giá trị là "K" thì truy cập như sau: tvwNhaCC.Nodes("K").

• Nút đang được chọn được trỏ bởi : tvwNhaCC.SelectedItem, nếu không có nút nào được chọn thì nó có giá trị là Nothing.

• Xét câu lệnh SELECT ở trên: adoSanPham.RecordSource = "Select * from Products where SupplierID=" & Mid(MaNCC,3). ở đây vì trường SupplierID là một trường số nên ta không phải kèm thêm cặp dấu nháy đơn. Trong trường hợp trường đem so sánh là trường text thì phải kèm thêm cặp nháy đơn. Ví dụ nếu chọn các bản ghi có CompanyName = giá trị trong text1 thì phải viết: adoSanPham.RecordSource = "Select * from Products where CompanyName = '" & text1.text & "'".

• Trong câu lệnh SQL, nếu tên bảng (hoặc tên trường) có chứa dấu cách (Ví dụ bảng "Order details") thì cần phải đặt trong cặp ngoặc vuông. Ví dụ phải viết: SELECT * FROM [Order details]. Tổng quát, trong nhiều trường hợp, có thể giải quyết vấn đề tên chứa dấu cách bằng việc thêm cặp ngoặc [ ].

• Có 2 cách truy cập đến giá trị của một trường. Cách viết adoCTDonHang.Recordset!UnitPrice và adoCTDonHang.Recordset.Fields("UnitPrice") là 2 cách viết tương đương. Tuy nhiên cách thứ nhất được ưa dùng hơn vì ngắn gọn.

• Trong trường hợp nếu mỗi nhà sản xuất có nhiều sản phẩm thì thời gian nạp vào cây thực sự không hiệu quả. Khi đó người ta xử lý bằng cách : "Nếu người dùng click vào một nút thì lúc đó mới nạp các nút con !".

Bài 11: Bổ sung thêm một trường mới trong câu lệnh SELECT a. Thiết kế giao diện : Như bài tập 10 b. Hướng dẫn : Trong câu lệnh SELECT, chúng ta hoàn toàn có thể bổ sung hoặc thêm mới một trường. Tên trường mới có thể dẫn xuất từ các trường đã có và được đặt tên bởi từ khoá AS. Khi đó ta truy cập đến trường mới này một cách bình thường như các trường khác. Tuy nhiên, trường này không thực sự thêm vào bảng gốc. c. Chương trình mẫu : Option Explicit Dim strConn As String '------------------------------------------------------------------------------------------------------------------------ '//// Nạp Mã nhà cung cấp và các sản phẩm của nhà cung cấp đó khi nạp form Private Sub Form_Load() strConn = "Provider=Microsoft.jet.oledb.4.0;" strConn = strConn & "Data source= " & App.Path & "\Nwind.mdb" Call NapMaNhaCC

Page 149: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 149

Call KhoiTaoListView adoMaNCC.Visible = False adoSanPham.Visible = False adoCTDonHang.Visible = False End Sub '------------------------------------------------------------------------------------------------------------------------ '/// Nạp mã nhà cung cấp vào cây. Khi nạp một NCC thì nạp các sản phẩm ngay vào nút đó Sub NapMaNhaCC() Dim Key As String adoMaNCC.ConnectionString = strConn adoMaNCC.CommandType = adCmdText adoMaNCC.RecordSource = "SELECT SupplierID, CompanyName FROM Suppliers" adoMaNCC.Refresh tvwNhaCC.Nodes.Clear tvwNhaCC.LabelEdit = tvwManual tvwNhaCC.Nodes.Add , , "M0NUT_GOC", "Tên các nhà cung cấp" Do While adoMaNCC.Recordset.EOF = False Key = "M1" & adoMaNCC.Recordset!SupplierID tvwNhaCC.Nodes.Add "M0NUT_GOC",tvwChild, Key,adoMaNCC.Recordset!CompanyName NapSanPhamVaoNCC Key adoMaNCC.Recordset.MoveNext Loop adoMaNCC.Recordset.Close tvwNhaCC.Nodes("M0NUT_GOC").Expanded = True End Sub '----------------------------------------------------------------------------------------------------------------------- '/// Nạp các sản phẩm vào nút nhà cung cấp. Nút này có mà là MaNCC '/// Vì trường Key của mỗi nút chứa xâu "M1" & SupplierID, do vậy khi Select cần phải bỏ '/// xâu "M1" đi bằng cách viết Mid(MaNCC,3). '/// Cũng giống như trường SupplierID, trường ProductID cũng là trường số, do vậy cần '/// phải thêm một xâu, ví dụ "M2" vào thuộc tính Key. '----------------------------------------------------------------------------------------------------------------------- Sub NapSanPhamVaoNCC(MaNCC As String) Dim MaSP As String, TenSP As String adoSanPham.ConnectionString = strConn adoSanPham.CommandType = adCmdText adoSanPham.RecordSource = "Select * from Products where SupplierID=" & Mid(MaNCC,3) adoSanPham.Refresh Do While adoSanPham.Recordset.EOF = False MaSP = adoSanPham.Recordset!ProductID TenSP = adoSanPham.Recordset!ProductName tvwNhaCC.Nodes.Add MaNCC, tvwChild, "M2" & MaSP, TenSP adoSanPham.Recordset.MoveNext Loop adoSanPham.Recordset.Close End Sub '----------------------------------------------------------------------------------------------------------------------------------- '/// Khởi tạo Listview: Tạo ra 3 cột là OrderID, UnitPrice và Quantity Sub KhoiTaoListView() lvwCTDonHang.ColumnHeaders.Add , , "Mã đơn hàng" lvwCTDonHang.ColumnHeaders.Add , , "Giá ($)" lvwCTDonHang.ColumnHeaders.Add , , "Số lượng" lvwCTDonHang.View = lvwReport

Page 150: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 150

lvwCTDonHang.GridLines = True End Sub '----------------------------------------------------------------------------------------------------------------------------------- '/// Hiển thị tất cả các hoá đơn có xuất hiện mặt hàng vừa được click chọn '/// Vì nút đang được chọn có MaSP = "M2" & ProductID, do vậy để lấy ra mã sản phẩm '/// thực sự cho câu lệnh truy vấn thì cần phải bỏ xâu "M2", tức là viết : Mid(MaSP,3) '/// Trong câu lệnh SELECT ta đã thêm một trường mới và đặt tên là GiaTri. '----------------------------------------------------------------------------------------------------------------------------------- Sub CTDonHang(MaSP As String) Dim MucMoi As ListItem, strSQL As String strSQL = "Select OrderID, UnitPrice, Quantity, (UnitPrice * Quantity) As [GiaTri] "

strSQL = strSQL & FROM [Order details] " strSQL = strSQL & "Where ProductID = " & Mid(MaSP, 3) adoCTDonHang.ConnectionString = strConn adoCTDonHang.CommandType = adCmdText adoCTDonHang.RecordSource = strSQL adoCTDonHang.Refresh lvwCTDonHang.ListItems.Clear Do While adoCTDonHang.Recordset.EOF = False Set MucMoi = lvwCTDonHang.ListItems.Add(, , adoCTDonHang.Recordset!OrderID) MucMoi.SubItems(1) = adoCTDonHang.Recordset!UnitPrice MucMoi.SubItems(2) = adoCTDonHang.Recordset!Quantity MucMoi.SubItems(3) = adoCTDonHang.Recordset!GiaTri adoCTDonHang.Recordset.MoveNext Loop adoCTDonHang.Recordset.Close End Sub '----------------------------------------------------------------------------------------------------------------------------------- '/// Khi người dùng click một nút thì cần trích 2 ký tự đầu để biết là người dùng click vào '/// nút gốc (M0), tên nhà cung cấp (M1) hay sản phẩm (M2) để có xử lý phù hợp. '/// Thuộc tính Node sẽ cho biết thông tin (trỏ đến) nút được chọn. '-----------------------------------------------------------------------------------------------------------------------------------

Private Sub tvwNhaCC_NodeClick(ByVal Node As MSComctlLib.Node)

Select Case Left(Node.Key, 2) '/// Lấy 2 ký tự đầu

Case "M0" '/// Click vào nút gốc

Case "M1" '/// Click vào Nhà cung cấp

Case "M2" '/// Click vào sản phẩm

lblCTDonHang.Caption="C¸c ®¬n hµng cã SP " &tvwNhaCC.SelectedItem.Parent.Text

CTDonHang Node.Key

End Select End Sub

d. Ghi chú:

• Có thể thay đổi tên trường trong kết quả như sau: Select OrderID As MaDonHang, UnitPrice AS DonGia v.v...

• Hoặc bổ sung thêm giá trị vào trường trong kết quả, ví dụ: Select OrderID , (UnitPrice & ' $') As DonGia

Page 151: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 151

Bài 12: Thực hiện yêu cầu như bài tập 5 nhưng chỉ sử dụng đối tượng Connection và đối tượng Recordset để thao tác với CSDL. a. Thiết kế giao diện

Hình 5.36 – Tên các điều khiển trên Form

b. Hướng dẫn: Sử dụng đối tượng Connection và phương thức Execute của đối tượng này. Trước khi khai báo biến Connection cần phải tham chiếu đến thư viện Microsoft ActiveX Data Control 2.x. Cú pháp gọi phương thức Execute như sau:

• Set RS = Cn.Execute ("Câu lệnh SQL") --> Nếu muốn lấy kết quả trả về (Cách này thường áp dụng khi câu lệnh SQL là một câu lệnh SELECT. Kết quả trả về sẽ là một tập các bản ghi (tương đương với một bảng), do vậy có thể gán kết quả này để hiển thị trong một DataGrid control.

• Cn.Execute "Câu lệnh SQL" --> Nếu chỉ muốn thực thi một câu lệnh SQL mà không cần lấy kết quả trả về (Ví dụ câu lệnh Delete, Insert, Update).

c. Chương trình mẫu

Option Explicit Dim Cn As New ADODB.Connection '----------------------------------------------------------------------------------------------------------------------------------- Private Sub Form_Load() Dim strConn As String On Error GoTo Err strConn = "Provider=Microsoft.jet.oledb.4.0;" strConn = strConn & "Data source= " & App.Path & "\Nwind.mdb" Cn.ConnectionString = strConn Cn.CursorLocation = adUseClient Cn.Open cboDSBang.AddItem "Customers" cboDSBang.AddItem "Products" cboDSBang.AddItem "Employees" cboDSBang.AddItem "Categories" cboDSBang.AddItem "Suppliers" cboDSBang.AddItem "Orders" cboDSBang.AddItem "Order details" '/// Bảng này chứa dấu cách cboDSBang.AddItem "Shippers" Exit Sub Err:

Page 152: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 152

MsgBox "Không thể mở được CSDL ! " & Err.Description, vbCritical End Sub '----------------------------------------------------------------------------------------------------------------------------------- Private Sub cmdXem_Click() Dim RS As ADODB.Recordset Set RS = Cn.Execute("SELECT * FROM " &cboDSBang.Text ) Set dgrHienThi.DataSource = RS '/// Gắn kết quả vào Grid để hiển thị End Sub

d. Ghi chú:

• Trong một ứng dụng (Cho dù có một hay nhiều form) nếu không có gì đặc biệt thì chỉ cần một đối tượng Connection để thao tác với CSDL.

• Phương thức Execute cho phép ta thực hiện bất kỳ một câu lệnh SQL nào được trình điều khiển CSDL hỗ trợ, nhưng chắc chắn là có lệnh SELECT, INSERT, UPDATE, DELETE. Từng này lệnh cũng là quá đủ đối với chúng ta.

• Phương thức Execute khi thực hiện SELECT thì chỉ trả về dữ liệu là bản sao của bảng gốc nên sửa đổi kết quả này không tác động đến bảng gốc.

• Để biết kết nối đến Cơ sở dữ liệu có thành công hay không, chỉ cần kiểm tra xem thuộc tính State có bằng 1 hay không ? nếu bằng tức là kết nối thành công !.

• Phương thức Open chỉ được gọi khi hiện tại biến đối tượng Connection chưa mở đến CSDL nào, nếu không sẽ bị báo lỗi !. Thường được gọi trong Form_Load.

Bài tập 13: Làm lại bài 10 với sử dụng đối tượng Connection và Recordset a. Thiết kế giao diện : Như bài tập 10

Hình 5.37 – Tên các điều khiển trên Form

b. Hướng dẫn: Sử dụng phương thức Execute của đối tượng Connection c. Chương trình mẫu:

Option Explicit Dim Cn As New ADODB.Connection '/// Khai báo biến đối tượng Connection '----------------------------------------------------------------------------------------------------------------------------------- '//// Nạp Mã nhà cung cấp và các sản phẩm của nhà cung cấp đó khi form khởi động Private Sub Form_Load() On Error GoTo Err Dim strConn As String strConn = "Provider=Microsoft.jet.oledb.4.0;" strConn = strConn & "Data source= " & App.Path & "\Nwind.mdb"

Page 153: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 153

Cn.ConnectionString = strConn Cn.CursorLocation = adUseClient Cn.Open Call NapMaNhaCC Call KhoiTaoListView Exit Sub Err: MsgBox "Khô thể kết nối đến CSDL ! " & Err.Description End Sub '------------------------------------------------------------------------------------------------------------------------ '/// Nạp mã nhà cung cấp vào cây. Khi nạp một NCC thì nạp các sản phẩm ngay vào nút đó Sub NapMaNhaCC() Dim Key As String, Rs As ADODB.Recordset Set Rs = Cn.Execute("SELECT SupplierID, CompanyName FROM Suppliers") tvwNhaCC.Nodes.Clear tvwNhaCC.LabelEdit = tvwManual tvwNhaCC.Nodes.Add , , "M0NUT_GOC", "Tên các nhà cung cấp" Do While Rs.EOF = False tvwNhaCC.Nodes.Add "M0NUT_GOC", tvwChild, Key, Rs!CompanyName Key = "M1" & Rs!SupplierID NapSanPhamVaoNCC Key Rs.MoveNext Loop Rs.Close tvwNhaCC.Nodes("M0NUT_GOC").Expanded = True End Sub '----------------------------------------------------------------------------------------------------------------------- '/// Nạp các sản phẩm vào nút nhà cung cấp. Nút này có mà là MaNCC '/// Vì trường Key của mỗi nút chứa xâu "M1" & SupplierID, do vậy khi Select cần phải bỏ '/// xâu "M1" đi bằng cách viết Mid(MaNCC,3). '/// Cũng giống như trường SupplierID, trường ProductID cũng là trường số, do vậy cần '/// phải thêm một xâu, ví dụ "M2" vào thuộc tính Key. '----------------------------------------------------------------------------------------------------------------------- Sub NapSanPhamVaoNCC(MaNCC As String) Dim MaSP As String, TenSP As String, Rs As ADODB.Recordset Set Rs = Cn.Execute("Select * from Products where SupplierID=" & Mid(MaNCC, 3)) Do While Rs.EOF = False MaSP = Rs!ProductID TenSP = Rs!ProductName tvwNhaCC.Nodes.Add MaNCC, tvwChild, "M2" & MaSP, TenSP Rs.MoveNext Loop Rs.Close End Sub '----------------------------------------------------------------------------------------------------------------------------------- '/// Khởi tạo Listview: Tạo ra 3 cột là OrderID, UnitPrice và Quantity Sub KhoiTaoListView() lvwCTDonHang.ColumnHeaders.Add , , "Mã đơn hàng"

Page 154: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 154

lvwCTDonHang.ColumnHeaders.Add , , "Giá ($)" lvwCTDonHang.ColumnHeaders.Add , , "Số lượng" lvwCTDonHang.View = lvwReport lvwCTDonHang.GridLines = True End Sub '----------------------------------------------------------------------------------------------------------------------------------- '/// Hiển thị tất cả các hoá đơn có xuất hiện mặt hàng vừa được click chọn '/// Vì nút đang được chọn có MaSP = "M2" & ProductID, do vậy để lấy ra mã sản phẩm '/// thực sự cho câu lệnh truy vấn thì cần phải bỏ xâu "M2", tức là viết : Mid(MaSP,3) '----------------------------------------------------------------------------------------------------------------------------------- Sub CTDonHang(MaSP As String) Dim BanGhi As ListItem, Rs As ADODB.Recordset Set Rs = Cn.Execute("Select * FROM [Order details] where ProductID=" & Mid(MaSP, 3)) lvwCTDonHang.ListItems.Clear Do While Rs.EOF = False Set BanGhi = lvwCTDonHang.ListItems.Add(, , Rs!OrderID) BanGhi.SubItems(1) = Rs!UnitPrice & " $" BanGhi.SubItems(2) = Rs.Fields("Quantity") '/// Cach viet khac Rs.MoveNext Loop Rs.Close End Sub '----------------------------------------------------------------------------------------------------------------------------------- '/// Khi người dùng click một nút thì cần trích 2 ký tự đầu để biết là người dùng click vào '/// nút gốc (M0), tên nhà cung cấp (M1) hay sản phẩm (M2) để có xử lý phù hợp. '/// Thuộc tính Node sẽ cho biết thông tin (trỏ đến) nút được chọn. '----------------------------------------------------------------------------------------------------------------------------------- Private Sub tvwNhaCC_NodeClick(ByVal Node As MSComctlLib.Node) Select Case Left(Node.Key, 2) Case "M0" '/// Click vào nút gốc Case "M1" '/// Click vào Nhà cung cấp Case "M2" '/// Clic vào sản phẩm CTDonHang Node.Key End Select End Sub

Bài tập 14: Thao tác CSDL trên nhiều Form a. Thiết kế giao diện

Hình 5.38 – Tên các điều khiển trên form : frmMain

Page 155: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 155

Hình 5.39 – Tên các điều khiển trên form : frmNhapNCC

Hình 5.41 – Tên các điều khiển trong form : frmNhapSP

b. Hướng dẫn:

• Sử dụng một đối tượng Connection duy nhất cho tất cả các form • Thực hiện kết nối đến CSDL trong Module dùng chung. • Yêu cầu ứng dụng chạy thủ tục Sub Main thay vì nạp form mặc định.

c. Chương trình mẫu Trước hết cần tham chiếu đến thư viện Microsoft ActiveX Data Object 2.1 và thư viện Microsoft Window Common Controls 6.0 (SP4). Tạo một Module mới (Vào Project --> Add Module), đặt tên là modKetNoi và viết lệnh sau:

modKetnoi.basOption Explicit Public Cn As New ADODB.Connection '/// Khai báo biến toàn cục Connection : Cn Public TrangThaiKetNoi As Boolean '/// Dùng để lưu tình trạng kết nối

Page 156: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 156

Public strConn As String '/// Xâu chứa thông tin kết nối đến CSDL '----------------------------------------------------------------------------------------------------------------------------------- '/// Muốn thủ tục này chạy đầu tiên, vào Menu Project -> Properties-> Startup Object ->Sub main Sub Main() On Error GoTo Err strConn = "Provider=Microsoft.jet.oledb.4.0;" strConn = strConn & "Data source= " & App.Path & "\Nwind.mdb" Cn.ConnectionString = strConn Cn.CursorLocation = adUseClient Cn.Open TrangThaiKetNoi = (Cn.State = 1) '/// Đây là cách viết ngắn gọn frmMain.Show '/// Hiển thị form : frmMain Exit Sub Err: MsgBox "Không thể mở được CSDL ! " & Err.Description, vbCritical End End Sub

frmMain.frm

Option Explicit '/// Nạp mã và tên vào cây (Mã gán cho thuộc tính Key, Tên gán cho thuộc tính Text) Sub NapNhaCC() Dim RS As ADODB.Recordset, Key As String Set RS = Cn.Execute("SELECT * FROM Suppliers") tvwNhaCC.Nodes.Add , , "NUT_GOC", "Danh sách các nhà cung cấp" Do While RS.EOF = False Key = "M1" & RS!Supplierid '/// Thêm một xâu vì Key không được là số tvwNhaCC.Nodes.Add "NUT_GOC", tvwChild, Key, RS!CompanyName RS.MoveNext Loop tvwNhaCC.Nodes("NUT_GOC").Expanded = True End Sub '----------------------------------------------------------------------------------------------------------------------------------- '/// Tạo các cột cho Listview Sub KhoiTaoListView() lvwSanPham.ColumnHeaders.Add , , "Tên sản phẩm" lvwSanPham.ColumnHeaders.Add , , "Mã loại" lvwSanPham.ColumnHeaders.Add , , "Đơn giá" lvwSanPham.View = lvwReport End Sub '----------------------------------------------------------------------------------------------------------------------------------- '/// Khi form được nạp cần kiểm tra xem trước đó đã kết nối được đến CSDL chưa ? Private Sub Form_Load() If TrangThaiKetNoi = False Then Exit Sub Call KhoiTaoListView Call NapNhaCC End Sub

Page 157: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 157

'----------------------------------------------------------------------------------------------------------------------------------- '/// Mỗi khi người dùng click vào 1 nút (Tên nhà cung cấp) thì nạp thông tin sản phẩm vào Listview Private Sub tvwNhaCC_NodeClick(ByVal Node As MSComctlLib.Node) If Node.Key = "NUT_GOC" Then Exit Sub '/// Nếu click vào nút gốc thì thoát Dim RS As ADODB.Recordset, MucMoi As ListItem Set RS=Cn.Execute("SELECT * FROM Products WHERE SupplierID=" & Mid(Node.Key, 3)) lvwSanPham.ListItems.Clear Do While RS.EOF = False Set MucMoi = lvwSanPham.ListItems.Add(, , RS!ProductName) MucMoi.SubItems(1) = RS!CategoryID MucMoi.SubItems(2) = RS!UnitPrice RS.MoveNext Loop RS.Close End Sub '----------------------------------------------------------------------------------------------------------------------------------- '/// Hiển thị frmNhapNCC Private Sub cmdNhapNCC_Click() frmNhapNCC.Show End Sub '----------------------------------------------------------------------------------------------------------------------------------- '///Hiển thị frmNhapSP Private Sub cmdNhapSP_Click() frmNhapSP.Show End Sub

frmNhapSP.frm

Option Explicit '/// Nạp Mã nhà cung cấp vào một Hộp Combo Sub NapMaNCC() Dim RS As ADODB.Recordset Set RS = Cn.Execute("SELECT SupplierID FROM Suppliers") Do While RS.EOF = False cboSupplierID.AddItem RS!Supplierid RS.MoveNext Loop RS.Close Set RS = Nothing End Sub '----------------------------------------------------------------------------------------------------------------------------------- '/// Nạp mã chủng loại vào một hộp Combo Sub NapMaChungLoai() Dim RS As ADODB.Recordset Set RS = Cn.Execute("SELECT CategoryID FROM Categories") Do While RS.EOF = False cboCategoryID.AddItem RS!CategoryID RS.MoveNext Loop RS.Close Set RS = Nothing End Sub

Page 158: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 158

'----------------------------------------------------------------------------------------------------------------------------------- '/// Xoá trắng nội dung trong các Textbox Sub XoaFormNhap() Dim Obj As Object For Each Obj In Controls If (TypeOf Obj Is TextBox) Then Obj.Text = "" Next End Sub '----------------------------------------------------------------------------------------------------------------------- '/// Khi thực hiện thêm bản ghi vào Bảng cần đặt biệt lưu ý: Nếu một trường kiểu '/// Text thì dữ liệu thêm vào phải được kèm thêm 2 dấu nháy đơn ở hai đầu. '/// Còn đối với trường kiểu số thì không cần ! '----------------------------------------------------------------------------------------------------------------------- Private Sub cmdThem_Click() On Error GoTo Err Dim strSQL As String, RS As ADODB.Recordset strSQL="INSERT INTO Products (SupplierID, ProductName, CategoryID, UnitPrice)" strSQL = strSQL & "Values (" strSQL = strSQL & cboSupplierID.Text & "," strSQL = strSQL & "'" & txtProductName.Text & "'," strSQL = strSQL & cboCategoryID.Text & "," strSQL = strSQL & txtUnitPrice.Text strSQL = strSQL & ")" Cn.Execute strSQL '/// Thực thi câu lệnh SQL Set RS = Cn.Execute("SELECT * FROM Products") Set dgrSanPham.DataSource = RS Call XoaFormNhap Exit Sub Err: MsgBox "Không thể thêm bản ghi ! " & Err.Description, vbCritical, "Lỗi" End Sub '----------------------------------------------------------------------------------------------------------------------------------- Private Sub Form_Load() If TrangThaiKetNoi = False Then Exit Sub txtProductID.Text = "Mã SP được tăng tự động (vì là trường Autonumber)" txtProductID.Locked = True '/// Không cho sửa đổi. Call NapMaNCC Call NapMaChungLoai End Sub

d. Ghi chú:

• Nên sử dụng một biến Connection cho tất cả các form.

• Biến này nên được đặt trong Module (tất nhiên là Public)

• Nên có kiểm tra tình trạng kết nối trước khi thực hiện thao tác với CSDL.

• Khi thực hiện chèn dữ liệu vào bảng thì cần phải sử dụng cơ chế bắt lỗi vì lỗi rất hay xảy ra.

Page 159: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 159

Bài 15: Thiết kế báo cáo và kết xuất ra máy in danh sách các sản phẩm (ver 1) Chuẩn bị:

• Tạo một ứng dụng mới • Tạo một Data Report : Vào Project -> Data Report • Vào Menu Project -> Add Data Enviroment, nếu không có mục này thì vào

Project -> Components và chọn mục sau:

a. Thiết kế giao diện

Hình 5.42 – Đặt tên cho Data Enviroment và các thành phần trong đó

Hình 5.43 - Thiết kế báo cáo

Page 160: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 160

Hướng dẫn chi tiết <Click vào đây để xem minh hoạ>

c. Viết lệnh cho Report ở hình 43: Lưu ý là trong cửa sổ Properties, cần đặt thuộc tính cho đối tượng Connection.

Option Explicit

Private Sub DataReport_Initialize()

Dim strConn As String

strConn = "Provider=Microsoft.jet.oledb.4.0;"

strConn = strConn & "Data source= " & App.Path & "\Nwind.mdb"

DE.cnnMain.ConnectionString = strConn

DE.cnnMain.CursorLocation = adUseClient

DE.cnnMain.Open

End Sub

d. Ghi chú:

• Có thể tạo ra các báo cáo con bằng cách tạo ra các Sub Header, Subfooter và chọn thuộc tính Grouping khi tạo ra các Command.

• Thực tế, khi tạo các báo cáo, người ta thường sử dụng các điều khiển chuyên nghiệp từ các hãng thứ ba như Dynamic Report, Crystal Report v.v...

Bài 16 : Giống như bài 15 nhưng thêm các đường kẻ.

Hình 5.44 - Tạo đường viền (khung) cho báo cáo bằng đường kẻ (Line)

Page 161: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 161

C- BÀI TẬP TỰ GIẢI Bài 1. Viết chương trình nhập dữ liệu cho tất cả các bảng trong CSDL NWind. Trong quá trình nhập cần hiển thị kết quả (nội dung của bảng). Bài 2. Viết chương trình nạp tất cả các bản ghi trong bảng Customers vào một điều khiển MS FlexGrid. Bài 3. Viết chương trình tra cứu các hàm, thủ tục trong VB. Bài 4. Viết chương trình định dạng các từ khoá của VB trong tài liệu MS Word, các từ khoá được định dạng thành chữ đậm. Bài 5. Viết chương trình quản lý lý lịch của SV trong một lớp. Bài tập 6 - Bải tập lớn : Xây dựng một ứng dụng E-MAILđơn giản. Trong bài tập lớn này, bạn đọc có thể sử dụng hệ quản trị CSDL Access hoặc SQL Server đều được (vì nếu chỉ dùng để lưu trữ dữ liệu thì không có sự khác nhau nhiều). Tuy nhiên, SQL Server thường được dùng nhiều hơn trong các ứng dụng đòi hỏi tốc độ xử lý nhanh, khả năng quản lý dữ liệu lớn. Việc sử dụng SQL để tạo CSDL cũng như cách kết nối với CSDL SQL Server dành cho bạn đọc tự tham khảo thêm (vì tài liệu có rất nhiều và cũng tương đối đơn giản).

BÀI TẬP LỚN

m« pháng ch−¬ng tr×nh qu¶n lý th− ®iÖn tö, sö dông hÖ qu¶n trÞ csdl sqlserver 2000 vµ ng«n ng÷ lËp tr×nh visual basic

Giíi thiÖu chung

Nh− chóng ta ®· biÕt, thùc tÕ trong qu¸ tr×nh göi th− ®iÖn tö th× th«ng tin göi ®i th−êng bao gåm : Tiªu ®Ò th−, ®Þa chØ ng−êi nhËn, néi dung th−, file göi kÌm, ngµy göi (do hÖ thèng tù sinh ra) vµ c¸c th«ng tin nµy ®−îc l−u tr÷ trªn m¸y chñ theo mét giao thøc chuÈn (Giao thøc SMTP vµ POP3). Cßn khi nhËn th− chÝnh lµ qu¸ tr×nh chóng ta lÊy c¸c th«ng tin ë trªn vÒ tõ m¸y chñ. Nh− vËy, nÕu chóng ta sö dông SQLServer ®Ó l−u tr÷ vµ qu¶n lý th«ng tin ®ång thêi kÕt hîp dïng Visual basic ®Ó göi (Insert vµo b¶ng CSDL) vµ nhËn (Select b¶n ghi trong b¶ng) sau ®ã hiÓn thÞ cho ng−êi dïng th× hoµn toµn cã thÓ m« pháng ®−îc hÖ thèng th− ®iÖn tö nµy trong khi ng−êi dïng th× kh«ng thÓ nhËn biÕt ®−îc lµ hÖ thèng cña chóng ta chØ lµ m« pháng (tøc lµ hÖ thèng trong suèt ®èi víi ng−êi dïng).

H−íng dÉn ph©n tÝch vÒ d÷ liÖu

V× ë ®©y, do thêi gian ng¾n vµ môc ®Ých chÝnh lµ ®Ó sinh viªn thao t¸c thµnh thôc c¸c c©u lÖnh, v× vËy nªn sù ®Çy ®ñ vµ tèi −u c¸c b¶ng d÷ liÖu kh«ng ph¶i lµ yÕu tè quan träng hµng ®Çu. Chóng ta thÊy r»ng, hÖ thèng cã c¸c thùc thÓ sau : Ng−êi (NhËn/göi) (Hä_tªn, ®Þa_chØ, giíi_tÝnh) Th− ®iÖn tö (Tiªu_®Ò, Ng−êi_göi, Ng−êi_nhËn, ngµy_göi, ngµy_nhËn, t×nh_tr¹ng (xo¸ hay ch−a), néi_dung_th−, Tªn file ®Ýnh kÌm, kÝch th−íc file ®Ýnh kÌm, ®−êng dÉn file ®Ýnh kÌm trªn ®Üa)

-Do mçi ng−êi cã thÓ göi nhiÒu E-Mail nªn mèi quan hÖ Ng−êi-Th− ®iÖn tö lµ 1 – NhiÒu (Hay 1 – n)

Page 162: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 162

Nh− vËy viÕt l¹i lμ : Ng−êi (NhËn/göi) (MaNguoiDung, Hä_tªn, ®Þa_chØ, giíi_tÝnh) Th− ®iÖn tö (MaNguoiGui,Tiªu_®Ò, Ng−êi_nhËn, ngµy_göi, ngµy_nhËn, t×nh_tr¹ng (xo¸ hay ch−a), néi_dung_th−, Tªn file ®Ýnh kÌm, kÝch th−íc file ®Ýnh kÌm, ®−êng dÉn file ®Ýnh kÌm trªn ®Üa) Trong ®ã MaNguoiDung trong thùc thÓ Th− §iÖn tö lµ kho¸ ngo¹i.

- Do øng víi mçi E-Mail l¹i cã thÓ cã nhiÒu file ®Ýnh kÌm, nªn ta t¸ch ra thùc thÓ File tõ Th− ®iÖn tö, quan hÖ Th− ®iÖn tö - File khi ®ã sÏ lµ 1-n Ta ®−îc 3 thùc thÓ : Ng−êi (NhËn/göi) (MaNguoiDung*, Hä_tªn, ®Þa_chØ, giíi_tÝnh) Th− ®iÖn tö (MaNguoiGui, M·_E-Mail*, Tiªu_®Ò, Ng−êi_nhËn, ngµy_göi, ngµy_nhËn, néi_dung_th−) File (M·_E-Mail, M·_file*, Tªn_file_®Ýnh_kÌm, kÝch_th−íc_file_®Ýnh_kÌm, ®−êng_dÉn_file_®Ýnh_kÌm_trªn_®Üa)

- Do mçi mét E-Mail l¹i cã thÓ göi cho nhiÒu ng−êi, do vËy thùc thÓ Th−_§iÖn_Tö l¹i t¸ch ra mét thùc thÓ con lµ Danh s¸ch Ng−êi NhËn Ng−êi (NhËn/göi) (MaNguoiDung*, Hä_tªn, ®Þa_chØ, giíi_tÝnh) Th− ®iÖn tö (MaNguoiDung, M·_E-Mail*, Tiªu_®Ò, ngµy_göi, ngµy_nhËn, néi_dung_th−) File (M·_E-Mail, M·_file*, Tªn_file_®Ýnh_kÌm, kÝch_th−íc_file_®Ýnh_kÌm, ®−êng_dÉn_file_®Ýnh_kÌm_trªn_®Üa) Danh s¸ch Ng−êi nhËn (MaNguoiNhan*, Ma_E-Mail, Tinh_Trang) Tªn c¸c b¶ng trªn ®−îc viÕt t−¬ng øng b»ng tiÕng Anh lµ : tblUserDetail, tblEMails, tblFiles, tblReceivers.

Page 163: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 1

C¸c

b¶n

g d

÷ li

Öu

Page 164: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 1

S¥ §å LI£N KÕT GI÷A C¸C B¶NG D÷ LIÖU

Page 165: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 2

mét sè d÷ liÖu mÉu cho c¸c b¶ng

tblUserDetail Table

tblEMailes Table

Page 166: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 3

tblFiles table

tblReceivers Table

Page 167: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 1

c¸c y£U CÇU chÝnh

ViÕt mét ch−¬ng tr×nh b»ng Visual Basic thùc hiÖn c¸c c«ng viÖc sau : 1./ T¹o c¬ së d÷ liÖu trªn SQL Server cã tªn lµ TK32

2./ Form nhËp d÷ liÖu cho b¶ng tblUserDetail

3./ LÊy th− vÒ vµ hiÓn thÞ néi dung cña th− cho mét ng−êi nµo ®ã

4./ Göi mét th− ®i cho mét (hoÆc nhiÒu ng−êi)

5./ Xo¸ th−

6./ Chän c¸c th− tho¶ m·n ®iÒu kiÖn nµo ®ã (vÝ dô ®−îc göi tõ congnx, hay n¨m göi

lµ n¨m 2004 v.v...)

7./ Cho biÕt lµ nh÷ng th− nµo ch−a ®−îc ®äc, nh÷ng th− nµo ®· cã ng−êi ®äc

8./ Xo¸ vµ kh«i phôc l¹i nh÷ng th− ®· bÞ xo¸

9./ Thèng kª th«ng tin vÒ nh÷ng e-mail ®· göi ®i cña mét ng−êi nh−: Sè l−îng e-mail,

sè file attach, tæng kÝch th−íc cña tÊt c¶ c¸c file attach.

10./ Thèng kÕ sè l−îng e-mail ®−îc göi ®i tõ c¸c ®¬n vÞ

11./ Thay ®æi Password, quyÒn... ®¨ng nhËp

12./ T¹o Account míi th«ng qua ch−¬ng tr×nh.

Bài tập 1: Phân tích và thiết kế phần mềm tra cứu & nhập sách trong thư viện Bài tập 2: Phân tích và thiết kế phần mềm quản lý lịch làm việc cá nhân Bài tập 3: Phân tích và thiết kế phần mềm tra cứu từ điển tin học Bài tập 4: Phân tích và thiết kế phần mềm quản lý điểm thi của một lớp Bài tập 5: Phân tích và thiết kế phần mềm quản lý hàng hoá cho một cửa hàng. Bài tập 6: Phân tich, thiết kế và xây dựng một Website giới thiệu hàng hoá. Bài tập 7: Phân tích, thiết kế và xây dựng một Website đặt hàng (Sản phẩm có thể là quần áo, giầy dép, điện thoại….)qua mạng. Bài tập 8: Phân tích, thiết kế ứng dụng thi trắc nghiệm trên WEB Bài tập 9: Phân tích, thiết kế phần mềm dạy học trên VB Bài tập 10: Phân tích, thiết kế phần mềm chơi cờ CARO.

Page 168: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 2

MỤC LỤC

CHƯƠNG I: NGÔN NGỮ LẬP TRÌNH VISUAL BASIC A. ĐỀ BÀI TẬP

Bài tập 1: Sử dụng hàm MsgBox và InputBox ..................................................1 Bài tập 2: Minh hoạ cấu trúc If … Then. ...........................................................1 Bài tập 3-Select Case: ......................................................................................1 Bài tập 4: Hiển thị các loại thông báo sử dụng hàm MsgBox. ..........................1 Bài tập 5: Sử dụng cấu trúc Select Case..........................................................1 Bài tập 6: Sử dụng vòng lặp FOR.....................................................................2 Bài tập 7: Sử dụng vòng lặp For với điều khoản Step ......................................2 Bài tập 8: Sử dụng vòng lặp For đếm ngược “FOR … DOWNTO…”. ..............2 Bài tập 9: Sử dụng vòng lặp Do…Loop Until ....................................................2 Bài tập 10: Sử dụng cấu trúc Do While … Loop ...............................................2 Bài tập 11: Thoát khỏi vòng lặp với Exit For, Exit Do........................................2 Bài tập 12: Sự tương đương giữa các cấu trúc lặp. .........................................2 Bài tập 13: Sử dụng vòng lặp FOR...................................................................2 Bài tập 14 – Tính N !:........................................................................................2 Bài tập 15- Tính tổng 1 dãy số:.........................................................................2 Bài tập 16- Tính dãy Fibonasi...........................................................................2 Bài tập 17- Tìm Ứơc số chung lớn nhất : .........................................................2 Bài tập 18-Tối giản phân số :............................................................................2 Bài tập 19- Tìm số nguyên tố:...........................................................................3 Bài tập 20-Đếm ký tự:.......................................................................................3 Bài tập 21-Tính tổng dãy số:.............................................................................3 Bài tập 22 : Bài toán tìm phần tử lớn nhất (nhỏ nhất) trong một danh sách .....3 Bài tập 23: Liệt kê các phần tử lớn nhất (nhỏ nhất) trong danh sách. .............3 Bài tập 24: Sắp xếp một dãy số nguyên. ..........................................................3 Bài tập 25 – Quick Sort.....................................................................................3 Bài tập 26- Heap Sort: ......................................................................................3 Bài tập 27: Sắp xếp ..........................................................................................3 Bài tập 28-Chuẩn hoá xâu: ...............................................................................3 Bài tập 29-Chuẩn hoá xâu ................................................................................3 Bài tập 30-Tách số khỏi xâu: ............................................................................3 Bài tập 31-Tách Câu:........................................................................................4 Bài tập 32-Chuyển đổi Font chữ .......................................................................4 Bài tập 33-Thống kê ký tự trong xâu.................................................................4 Bài tập 34-Thay thế ký tự .................................................................................4 Bài tập 35-Cộng số nguyên lớn: .......................................................................4 Bài tập 36-Ma trận số: ......................................................................................4 Bài tập 37- Kiểm tra "đường thẳng" trong ma trận:...........................................4 Bài tập 38- Mảng bản ghi:.................................................................................4

Page 169: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 3

B. HƯỚNG DẪN, GIẢI MẪU

Bài tập 1 ...........................................................................................................5 Bài tập 2 ...........................................................................................................6 Bài tập 3 ...........................................................................................................6 Bài tập 5 ...........................................................................................................7 Bài tập 6 ...........................................................................................................8 Bài tập 7 ...........................................................................................................9 Bài tập 8 ...........................................................................................................9 Bài tập 9 ...........................................................................................................9 Bài tập 10 .......................................................................................................10 Bài tập 11 .......................................................................................................11 Bài tập 12 .......................................................................................................11 Bài tập 13 .......................................................................................................13 Bài tập 14: ......................................................................................................14 Bài tập 15: ......................................................................................................15 Bài tập 16 .......................................................................................................15 Bài tập 17: ......................................................................................................16 Bài tập 18: ......................................................................................................17 Bài tập 19: ......................................................................................................17 Bài tập 20 .......................................................................................................18 Bài tập 21: ......................................................................................................19 Bài tập 22 .......................................................................................................19 Bài tập 23 .......................................................................................................20 Bài tập 24 .......................................................................................................20 Bài tập 25 .......................................................................................................21 Bài tập 26 .......................................................................................................23 Bài tập 27 .......................................................................................................24 Bài tập 28: ......................................................................................................25 Bài tập 29 .......................................................................................................26 Bài tập 30 .......................................................................................................27 Bài tập 31 .......................................................................................................28 Bài tập 32 .......................................................................................................28 Bài tập 33 .......................................................................................................29 Bài tập 34 .......................................................................................................30 Bài tập 35 .......................................................................................................30 Bài tập 36 .......................................................................................................31 Bài tập 37 .......................................................................................................32 Bài tập 37 .......................................................................................................33

C. BÀI TẬP TỰ GIẢI

CHƯƠNG II: SỬ DỤNG CÁC ĐIỀU KHIỂN CƠ BẢN A. ĐỀ BÀI TẬP

Page 170: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 4

Bài 1: Viết chương trình giải phương trình bậc 2............................................38 Bài 2: Một form nhập .....................................................................................38 Bài 3: Viết chương trình nhập họ tên sinh viên...............................................39 Bài 4: Viết chương trình như bài số 3,............................................................39 Bài 5: Minh hoạ sử dụng điều khiển Listbox và thuộc tính đa lựa chọn..........39 Bài 6: Minh hoạ sử dụng điều khiển Listbox và hàm tách xâu Split. ...............40 Bài 7: Tách địa chỉ E-Mail sử dụng hàm Split .................................................40 Bài 8: Sắp xếp danh sách theo TÊN...............................................................41 Bài 9: Minh hoạ sử dụng điều khiển ComboBox.............................................41 Bài 10: Minh hoạ thao tác với ComboBox và việc lấy tên font của hệ thống. .42 Bài 11: Minh hoạ sử dụng điều khiển Option button.......................................43 Bài 12 – Minh hoạ sử dụng nhãn....................................................................43 Bài 13 – Minh hoạ sử dụng Label kết hợp với Frame và Timer......................44 Bài 14 : Yêu cầu như bài 13 nhưng tốc độ .....................................................44 Bài 15 - Sử dụng Label, kết hợp với Line để giả lập nút nhấn........................44 Bài 16: Minh hoạ sử dụng điều khiển Timer tạo hiệu ứng chữ chạy. .............45 Bài 17: Sử dụng Timer, viết chương trình “đồng hồ báo thức”. ......................45 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..............................................................................................................45 Bài 19: Sử dụng điều khiển Timer để ghi nhận các phím nhấn – KeyLogger .46 Bài 20: Minh hoạ sử dụng các điều khiển thao tác Tệp, Thư mục và Ổ đĩa. ..46 Bài 21: Minh hoạ khả năng kéo thả (Drag-Drop) file và thư mục....................47 Bài 22: Thao tác với điều khiển FileListbox và khả năng đa lựa chọn. ...........47 Bài 23: Sử dụng điều khiển Image làm ảnh nền cho form. .............................48 Bài 24:Sử dụng điều khiển PictureBox tạo Icon tại khay hệ thống (SystemTray) ..................................................................................................48

B. HƯỚNG DẪN, GIẢI MẪU Bài 1 ...............................................................................................................49 Bài 2: ..............................................................................................................50 Bài 3 ...............................................................................................................51 Bài 4 ...............................................................................................................52 Bài 5 ...............................................................................................................53 Bài 6 ...............................................................................................................54 Bài 7 ...............................................................................................................55 Bài 8. ..............................................................................................................56 Bài 9 ...............................................................................................................58 Bài 10 .............................................................................................................59 Bài 11 .............................................................................................................60 Bài 12 .............................................................................................................62 Bài 13 .............................................................................................................64 Bài 14 .............................................................................................................65 Bài 15 .............................................................................................................66

Page 171: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 5

Bài 16 .............................................................................................................67 Bài 17 .............................................................................................................67 Bài 18 .............................................................................................................69 Bài 19 .............................................................................................................70 Bài 20 .............................................................................................................71 Bài 21 .............................................................................................................73 Bài 22 .............................................................................................................74 Bài 23 .............................................................................................................76 Bài 24 .............................................................................................................77

C. BÀI TẬP TỰ GIẢI

CHƯƠNG III: SỬ DỤNG HỘP THOẠI CHUẨN VÀ MENU A. ĐỀ BÀI TẬP

Bài 1: Xây dựng chương trình soạn thảo văn bản sử dụng điều khiển RichText. ........................................................................................................80 Bài 2: Xây dựng chương trình như bài 1 nhưng có thêm menu "Màu chữ"....80 Bài 3: Xây dựng chương trình như bài 2, nhưng thêm khả năng hiển thị menu ngữ cảnh ........................................................................................................81 Bài 4: Xây dựng chương trình như bài 3 nhưng sử dụng cơ chế đa cửa sổ ..81 Bài 5: Xây dựng chương trình như bài 4, .......................................................81 Bài 6 : Như bài 5 nhưng chương trình có thêm thanh trạng thái ....................82

B. HƯỚNG DẪN, GIẢI MẪU Bài 1 ...............................................................................................................83 Bài 2 ...............................................................................................................85 Bài 3 ...............................................................................................................85 Bài 4 ...............................................................................................................86 Bài 5 ...............................................................................................................88 Bài 6 ...............................................................................................................92

C. BÀI TẬP TỰ GIẢI

CHƯƠNG IV: SỬ DỤNG CÁC ĐIỀU KHIỂN NÂNG CAO A. ĐỀ BÀI TẬP

Bài 1: Minh hoạ sử dụng điều khiển Carlendar (Lịch).....................................94 Bài 2: Minh hoạ sử dụng điều khiển truyền thông nối tiếp Comm Control ......95 Bài 3 : Minh hoạ điều khiển FlexGrid..............................................................95 Bài 4 : Minh hoạ sử dụng điều khiển Web brower và HTML Object Library. ..96 Bài 5: Minh hoạ sử dụng Internet Control .......................................................96 Bài 6. Sử dụng điều khiển Multimedia MCI để chơi các file nhạc và hình ......97 Bài 7: Sử dụng Script Control để tính toán biểu thức bất kỳ...........................97 Bài 8: Sử dụng điều khiển SSTab và viết chương trình cờ CARO đơn giản ..98 Bài 9: Sử dụng thanh tiến trình (Progressbar) ................................................98 Bài 10 :Sử dụng điều khiển Image Combobox ...............................................99

Page 172: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 6

Bài 11 : Sử dụng điều khiển Listview..............................................................99 Bài 12: Sử dụng điều khiển TreeView ..........................................................100 Bài 13: Sử dụng DateTimePicker để nhập trực quan ngày/tháng/năm. .......101 Bài 14: Sử dụng điều khiển Window Media Player .......................................101

B. HƯỚNG DẪN, GIẢI MẪU Bài 1 .............................................................................................................102 Bài 2 .............................................................................................................103 Bài 3 .............................................................................................................104 Bài 4 .............................................................................................................106 Bài 5 .............................................................................................................108 Bài 6 .............................................................................................................109 Bài 7 .............................................................................................................110 Bài 8 .............................................................................................................110 Bài 9 .............................................................................................................112 Bài 10 ...........................................................................................................114 Bài 11 ...........................................................................................................115 Bài 12 ...........................................................................................................117 Bài 13 ...........................................................................................................121 Bài 14 ...........................................................................................................121

C. BÀI TẬP TỰ GIẢI

CHƯƠNG V: THAO TÁC VỚI CƠ SỞ DỮ LIỆU A. ĐỀ BÀI TẬP

Bài 1: Viết chương trình xem thông tin về khách hàng (Version 1). .............129 Bài 2: Viết chương trình xem thông tin về khách hàng (Version 2) ..............130 Bài 3: Viết chương trình xem thông tin về khách hàng (Version 3) ..............130 Bài 4: Viết chương trình xem thông tin về khách hàng (Version 4) ..............130 Bài 5: Viết chương trình xem một bảng CSDL bất kỳ trong CSDL NWind....131 Bài 6: Viết chương trình nạp tất cả mã nhà cung cấp vào một hộp Combo .131 Bài 7: Viết chương trình liệt kê các sản phẩm do 1 công ty cung cấp (v1) ...131 Bài 8: Viết chương trình liệt kê các sản phẩm do 1 công ty cung cấp (v2) ...132 Bài 9: Như bài 8 nhưng các sản phẩm được hiển thị trong một ListView.....132 Bài 10: Xây dựng cây nhiều mức để xem thông tin về những sản phẩm .....133 Bài 11: Bổ sung thêm một trường mới trong câu lệnh SELECT...................133 Bài 12: Thực hiện như bài tập 5 nhưng sử dụng đối tượng Connection ......134 Bài 13: Làm lại bài 10 sử dụng đối tượng Connection và Recordset ...........134 Bài 14: Thao tác CSDL trên nhiều Form.......................................................134 Bài 15: Thiết kế báo cáo và kết xuất ra máy in danh sách sản phẩm (v1)....135 Bài 16: Thiết kế báo cáo và kết xuất ra máy in danh sách sản phẩm (v2)....136

B. HƯỚNG DẪN, GIẢI MẪU Bài 1 .............................................................................................................136

Page 173: Uploads_toan_hinh-hoc-10_Bai Tap Lap Trinh Visual Basic 60

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 7

Bài 2 .............................................................................................................137 Bài 3 .............................................................................................................138 Bài 4 .............................................................................................................139 Bài 5 .............................................................................................................140 Bài 6 .............................................................................................................141 Bài 7 .............................................................................................................141 Bài 8 .............................................................................................................142 Bài 9 .............................................................................................................144 Bài 10 ...........................................................................................................145 Bài 11 ...........................................................................................................148 Bài 12 ...........................................................................................................151 Bài 13 ...........................................................................................................152 Bài 14 ...........................................................................................................154 Bài 15 ...........................................................................................................159 Bài 16 ...........................................................................................................160 Bài tập lớn ....................................................................................................161 Giíi thiÖu chung ..................................................................................................161 H−íng dÉn ph©n tÝch vÒ d÷ liÖu ..........................................................................161

C. BÀI TẬP TỰ GIẢI