Thứ Năm, 2 tháng 1, 2014

Hàm GetKey



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