Hàm GetKey
Mỗi khi ta nhấn một phím, trong
vùng đệm 2 byte sẽ được nạp 1 hoặc 2 byte tuỳ theo kiểu phím đã nhấn. Nếu là
phím thường như a, b, c, %, $,... trong vùng đệm sẽ được nạp 1 byte chứa mã
ASCII của kí tự tương ứng. Nếu ta nhấn phím mở rộng như F1,..., F10, các phím
dịch chuyển con trỏ, , ®, ¬, ¯, Ins (chèn), Del (xoá), PageUp/PgUp (lên một trang), PageDown/PgDn
(xuống một trang),... trong vùng đệm sẽ được nạp hai byte, byte thứ nhất có giá
trị 0, byte thứ hai chứa mã riêng của phím đã nhấn. Mã riêng này có thể trùng
với mã của các kí tự thường. Thí dụ, khi ta nhấn phím mở rộng F10 trong vùng
đệm sẽ được nạp 2 byte (0, 68). Mã riêng 68 trùng với mã của kí tự D. Hàm
ReadKey cho ta kí tự của phím đã nhấn và không hiển thị kí tự đó (trên màn
hình), ta gọi là hàm nhận thầm một kí tự. ReadKey trước hết kiểm tra vùng đệm
bàn phím xem còn byte nào chưa được đọc không. Nếu còn, ReadKey sẽ đọc byte đó.
Ngược lại, nếu vùng đệm trống, ReadKey sẽ chờ để ta nhấn một phím rồi sau đó
đọc 1 byte từ vùng đệm.
Hãy viết hàm GetKey cho ra mã
ASCII của phím thường đã nhấn và cho ra mã riêng của phím mở rộng cộng thêm 128
nhằm phân biệt được phím thường với phím mở rộng.
Chú ý:
Hàm GetKey ở
bài 3.3 cho mã của một số phím mở rộng dùng để điều khiển con trỏ màn hình như
sau:
LEN: 200 Mũi tên trỏ lên
XUONG: 208
Mũi tên trỏ xuống ¯
PHAI: 205
Mũi tên trỏ qua phải ®
TRAI: 203
Mũi tên trỏ qua trái ¬
ESC (27) và ENTER/RETURN (13) là những
phím thường.
Gợi ý - gia sư tin học
Trước hết gọi hàm c:= ReadKey rồi kiểm tra giá trị của kí tự c. Nếu c có mã 0 tức là đã nhấn phím
mở rộng, ta cần đọc tiếp byte thứ hai và gán cho hàm giá trị của byte đó cộng
thêm dấu hiệu nhận biết phím mở rộng là 128. Nếu c có mã khác 0, ta gán cho hàm giá trị đó.
(* Pascal *)
(* -----------------------
Ham GetKey
-------------------------*)
program Conio;
uses crt;
const Esc = 27;
Function GetKey: integer;
var c: char;
begin
c:= ReadKey;
if c <> #0 then GetKey := Ord(c)
else GetKey := Ord(ReadKey) + 128;
end;
Procedure Test;
var k: integer;
begin
repeat
write(' Nhan Phim (Bam ESC de thoat): ');
k:= GetKey;
if k > 128 then
writeln(' Phim mo rong (0, ',k-128,') ==> ',k)
else
writeln(' Phim thuong ',chr(k), '(',k,')');
until k = Esc;
readln;
end;
BEGIN
Test;
END.
Không có nhận xét nào:
Đăng nhận xét