CHƯƠNG 8 XỬ LÝ PHÍM1 Khái niệm Khi người dùng nhấn một phím trong một cửa sổ đang có focus, luôn sinh ra ba biến cố là biến cố KeyDown, KeyUp, và KeyPress.. → Nếu phím được nhấn là một p
Trang 1CHƯƠNG 8 XỬ LÝ PHÍM
1) Khái niệm
Khi người dùng nhấn một phím trong một cửa sổ đang có focus, luôn sinh ra ba biến cố là biến cố
KeyDown, KeyUp, và KeyPress
→ Khi một phím được nhấn, thì hệ thống xảy ra biến cố đầu tiên là KeyDown
→ Nếu phím được nhấn là một phím ký tự bình thường, thì hệ thống sinh ra tiếp biến cố KeyPress
→ Khi thả phím ra, sẽ sinh ra biến cố KeyUp
Bạn có thể viết thủ tục xử lý cho các biến cố này Thường là xử lý việc nhập chuỗi cho textbox
2) Các biến cố
2.1) Biến cố KeyDown
2.2) Biến cố KeyUp
Các thủ tục xử lý cho hai sự kiện Keydown và KeyUp có dạng sau
Private Sub KeyDown (keycode As Integer, shift As Integer) Private Sub KeyUp (keycode As Integer, shift As Integer)
Trong đó:
Keycode Là mã của phím được nhấn Mã này không phải là mã ASCII của ký tự
→ Nhiều phím trên bàn phím có thể dùng để gõ hai ký tự khác nhau: chẳng hạn như chữ cái
có thể là chữ hoa hoặc chữ thường, hoặc phím số 1 dùng để gõ số 1 hay kí tự ! ….còn
keycode ở đây là một mã duy nhất cho từng phím.
→ Ví dụ bạn nhận được keycode của phím A ,bạn biết phím A được nhấn nhưng bạn không biết là A thường hay A hoa Muốn xét xem A thường hay A hoa, bạn phải xét trạng thái của phím CAPSLOCK và phím SHIFT hiện thời Chính vì vậy, với những phím ký tự cần có thêm sự kiện Keypress để chúng ta xét các kí tự này
Shift Tham số này cho chúng ta biết trạng thái của các phím Shift , Ctrl, Alt khi phím được
nhấn Bạn xét trạng thái của phím đó thông qua các hằng :
Hằng Giá trị Ý nghĩa
Giống như trước đây khi xét trong sự kiện MouseMove, khi một phím được nhấn có thể lúc đó phím Shift cũng được nhấn, hay phím Ctrl được nhấn hoặc có thể hai phím Shift, Ctrl đều nhấn.Vì vậy để xét xem phím nào có nhấn bạn dùng phép toán And để xét Ví dụ:
If Shift And vbShiftMask <> 0 Then ‘nếu có nhấn phím Shift thì ……
Để xét Keycode trong sự kiện KeyDown và KeyUp bạn dùng các hằng sau :
Hằng Giá trị Tương ứng các phím
Trang 2VbKeyTab 9 Phím Tab
Các mã tương ứng với các phím kí tự :
Hằng Giá trị Tương ứng với phím
Trang 3VbKeyL 76 Phím L
Mã của cacù phím từ 0 đến 9:
Hằng Giá trị Tương ứng với phím
Mã của các phím số nằm trên phần keypad (NumLock)
Hằng Giá trị tương ứng với phím
Trang 4VbKeyNumpad 4 100 Phím số 4
Mã của phím chức năng:
Hằng Giá trị Tương ứng với phím
2.3) Biến cố KeyPress
Như được nói ở trên, biến cố này xảy ra khi nhấn các phím ký tự ( tức những phím có mặt trong bảng
mã ASCII chứ không phải chỉ những ký tự từ A đến Z) Thủ tục xử lý sự kiện này có dạng:
Private Sub KeyPress ( KeyAscii As Integer )
KeyAscii : Chính là mã ASCII của phím ký tự vừa được nhấn
Nếu lúc xử lý biến cố này bạn gán lại giá trị mới cho KeyAscii cũng có nghĩa là bạn sửa phím được nhấn trong đối tượng
Trang 5Ví du 1ï : giả sử bạn muốn các ký tự được gõ trong một TextBox luôn luôn là chữ hoa cho dù người
dùng gõ chữ thường vào trong nó, bạn có thể xử lý sự kiện KeyPress của TextBox như thế này:
Private Sub Text1_KeyPress ( KeyAscii As Integer )
Dim Kytu As Integer
Kytu = Chr(KeyAscii) 'Đổi mã ASCII sang ký tự tương ứng
Kytu = UCase(Kytu) 'Đổi ký tự sang chữ hoa
KeyAscii = Asc(Kytu) 'Gán lại mã phím mới
End Sub
Ví dụ 2 : giả sử bạn muốn TextBox chỉ nhận những ký tự số từ 0 đến 9 ( có mã từ 48 đến 57) bạn xử
lý biến cố KeyPress của nó như sau:
Private Sub Text1_KeyPress ( KeyAscii As Integer )
If (KeyAscii < 48) Or (KeyAscii > 57) Then
'Nếu ký tự không phải từ 0 đến 9 (nằm ngoài khoảng từ 48 đến 57)
KeyAscii = 0 'Gán bằng 0 tức xóa phím
End If
End Sub
3) Hàm lấy số ngẫu nhiên RND
Trong chương trình đôi khi bạn muốn lấy một con số ngẫu nhiên nào đó, nhất là trong chương trình
trò chơi, bạn sẽ dùng các hàm ngẫu nhiên này
Hàm Rnd
Dùng để phát ra một con số ngẫu nhiên bất kỳ
Giá trị trả về là một số thực (single) luôn luôn lớn hơn hoặc bằng 0 và nhỏ hơn 1
Như vậy muốn lấy một số ngẫu nhiên trong khoảng từ A đến B bạn dùng công thức tính:
Số = Int ( A + B * Rnd )
Ví dụ: Bạn có một Form, trên form có một đối tượng Timer tên là Time1 Bạn muốn rằng mỗi khi
biến cố thời gian xảy ra, chương trình sẽ vẽ ngẫu nhiên một điểm bất kỳ trên formvới một màu sắc cũng ngẫu nhiên, bạn sẽ viết lệnh cho biến cố thời gian như sau:
Private Sub Timer1_Timer()
DrawWidth = 3 'Đặt độ lớn của điểm là 3
X = Int ( ScaleWidth * Rnd ) 'Lấy một số ngẫu nhiên nhỏ hơn bề rộng form
Y = Int ( ScaleHeight * Rnd ) 'Lấy một số ngẫu nhiên nhỏ hơn bề cao của form
Color = QBColor ( Int (1 6 * Rnd ) ) ‘chọn màu sắc ngẫu nhiên
PSet (X, Y), Color 'Vẽ điểm trên form
End Sub
Tóm tắt Chương 8
1 Khi nhấn phím, thường sinh ra 3 biến cố KeyDown, KeyPress, KeyUp
Trang 6Các thủ tục xử lý các biến cố trên có dạng:
Private Sub KeyDown (keycode As Integer, shift As Integer) Private Sub KeyUp (keycode As Integer, shift As Integer)
Private Sub KeyPress ( KeyAscii As Integer )
2 Hàm Rnd dùng lấy số ngẫu nhiên