QuangTuan
10-09-2005, 05:04 PM
1. Tôi phải làm thế nào để ngăn hoặc bắt phím ngắt (break key) trong Turbo Pascal để chương trình của tôi không bị ngắt?
Có một biến CheckBreak trong unit Crt, luôn được đặt mặc định là true. Muốn tắt nó ta dùng lệnh
uses Crt;
:
CheckBreak := false;
:
Ngoài ra việc tắt kiểm tra ngắt cho phép bạn bắt phím mỗi khi phím ngắt được bấm xuống như là tổ hợp phím Ctrl-C
Cách khác bạn có thế dùng chương trình bắt phím sau:
procedure TEST;
var key : char;
begin
repeat
if KeyPressed then
begin
key := ReadKey;
if key=#3 then
begin {ctrl-c or break}
writeln ('Break');
halt(1);
end; { Terminate the program, or whatever }
end; {if}
until false;
end; (* test *)
Một cách khác, bạn có thể ngăn cấm Ctrl-Break và Ctrl-C bằng ngắt. Sau đây là một ví dụ:
uses Dos;
var OldIntr1B : pointer; { Ctrl-Break ađress }
OldIntr23 : pointer; { Ctrl-C interrupt handler }
answer : string; { For readln test }
{$F+}
procedure NewIntr1B (flags,cs,ip,ax,bx,cx,dx,si,di,ds,es,bp : word);
Interrupt;
{$F-} begin end;
{$F+}
procedure NewIntr23 (flags,cs,ip,ax,bx,cx,dx,si,di,ds,es,bp : word);
Interrupt;
{$F-} begin end;
begin
GetIntVec ($1B, OldIntr1B);
SetIntVec ($1B, @NewIntr1B); { Cấm Ctrl-Break }
GetIntVec ($23, OldIntr23);
SetIntVec ($23, @NewIntr23); { Cấm Ctrl-C }
writeln ('Try breaking, disabled');
readln (answer);
SetIntVec ($1B, OldIntr1B); { Cho phép Ctrl-Break }
SetIntVec ($23, OldIntr23); { Cho phép Ctrl-C }
writeln ('Try breaking, enabled');
readln (answer);
writeln ('Doné);
end.
2. Làm thế nào để kiểm tra xem máy in có sẵn sàng hay không?
Bạn có thể dùng ngắt 17H, với hàm dịch vụ 02H
regs.dx := PrinterNumber; (* LPT1 = 0 *)
regs.ah := $02;
Intr ($17,regs);
status := regs.ah
3. Tôi muốn viết một chương trình khi nhập vào ngày tháng năm thì sẽ in ra ngày đó là ngày thứ mấy trong tuần.
Bạn chỉ cần dùng một thuật toán đơn giản: bạn chọn một mốc thời gian, ví dụ ngày 7-9-1999 là ngày thứ Ba, sau đó bạn tính khoảng cách ngày từ mốc đến thời điểm muốn kiểm tra. Kết quả thu được bạn đem lấy số dư trong phép chia cho 7 là có thể xác định được đó là ngày thứ mấy. Tất nhiên khi tính khoảng cách ngày, bạn phải để ý đến tiêu chuẩn năm nhuận vì năm nhuận chỉ có 365 ngày.
Bạn có thể tìm một chương trình như trên tại địa chỉ ftp://garbo.uwasa.fi/pc/ts/tspa3470.zip
4.Tại sao tôi không thể đọc hay viết lên các cổng COM
Việc lập trình đối với cổng COM (thường gọi là viết chương trình truyền thông - telecommunication programs ) khó hơn rất nhiều so với việc cố sử dụng câu lệnh
write (com, whatever);
read (com, whatever);
Nó đòi hỏi các kĩ năng sử dụng ngắt, thu phát dữ liệu, các chuẩn dữ liệu. Hiện có rất nhiều tài liệu nói về vấn đề này, bạn có thể kiếm chúng tại các quầy sách với những tên như là "Lập trình truyền thông", "Lập trình cho cổng COM"...
Có một biến CheckBreak trong unit Crt, luôn được đặt mặc định là true. Muốn tắt nó ta dùng lệnh
uses Crt;
:
CheckBreak := false;
:
Ngoài ra việc tắt kiểm tra ngắt cho phép bạn bắt phím mỗi khi phím ngắt được bấm xuống như là tổ hợp phím Ctrl-C
Cách khác bạn có thế dùng chương trình bắt phím sau:
procedure TEST;
var key : char;
begin
repeat
if KeyPressed then
begin
key := ReadKey;
if key=#3 then
begin {ctrl-c or break}
writeln ('Break');
halt(1);
end; { Terminate the program, or whatever }
end; {if}
until false;
end; (* test *)
Một cách khác, bạn có thể ngăn cấm Ctrl-Break và Ctrl-C bằng ngắt. Sau đây là một ví dụ:
uses Dos;
var OldIntr1B : pointer; { Ctrl-Break ađress }
OldIntr23 : pointer; { Ctrl-C interrupt handler }
answer : string; { For readln test }
{$F+}
procedure NewIntr1B (flags,cs,ip,ax,bx,cx,dx,si,di,ds,es,bp : word);
Interrupt;
{$F-} begin end;
{$F+}
procedure NewIntr23 (flags,cs,ip,ax,bx,cx,dx,si,di,ds,es,bp : word);
Interrupt;
{$F-} begin end;
begin
GetIntVec ($1B, OldIntr1B);
SetIntVec ($1B, @NewIntr1B); { Cấm Ctrl-Break }
GetIntVec ($23, OldIntr23);
SetIntVec ($23, @NewIntr23); { Cấm Ctrl-C }
writeln ('Try breaking, disabled');
readln (answer);
SetIntVec ($1B, OldIntr1B); { Cho phép Ctrl-Break }
SetIntVec ($23, OldIntr23); { Cho phép Ctrl-C }
writeln ('Try breaking, enabled');
readln (answer);
writeln ('Doné);
end.
2. Làm thế nào để kiểm tra xem máy in có sẵn sàng hay không?
Bạn có thể dùng ngắt 17H, với hàm dịch vụ 02H
regs.dx := PrinterNumber; (* LPT1 = 0 *)
regs.ah := $02;
Intr ($17,regs);
status := regs.ah
3. Tôi muốn viết một chương trình khi nhập vào ngày tháng năm thì sẽ in ra ngày đó là ngày thứ mấy trong tuần.
Bạn chỉ cần dùng một thuật toán đơn giản: bạn chọn một mốc thời gian, ví dụ ngày 7-9-1999 là ngày thứ Ba, sau đó bạn tính khoảng cách ngày từ mốc đến thời điểm muốn kiểm tra. Kết quả thu được bạn đem lấy số dư trong phép chia cho 7 là có thể xác định được đó là ngày thứ mấy. Tất nhiên khi tính khoảng cách ngày, bạn phải để ý đến tiêu chuẩn năm nhuận vì năm nhuận chỉ có 365 ngày.
Bạn có thể tìm một chương trình như trên tại địa chỉ ftp://garbo.uwasa.fi/pc/ts/tspa3470.zip
4.Tại sao tôi không thể đọc hay viết lên các cổng COM
Việc lập trình đối với cổng COM (thường gọi là viết chương trình truyền thông - telecommunication programs ) khó hơn rất nhiều so với việc cố sử dụng câu lệnh
write (com, whatever);
read (com, whatever);
Nó đòi hỏi các kĩ năng sử dụng ngắt, thu phát dữ liệu, các chuẩn dữ liệu. Hiện có rất nhiều tài liệu nói về vấn đề này, bạn có thể kiếm chúng tại các quầy sách với những tên như là "Lập trình truyền thông", "Lập trình cho cổng COM"...