TURBO PASCAL |
Новости
|
1. How do I disable or capture the break key in Turbo Pascal?Q: I don't want the Break key to be able to interrupt my TP programs. How is this done? Q2: I want to be able to capture the Break key in my TP program. How is this done? Q3: How do I detect if a certain key has been pressed? (Often, how do I detect, for example, if the CursorUp key has been pressed?) Q4: How do I detect if a cursor key or a function key has been pressed? A: This set of frequently asked questions is basically a case of RTFM (read the f*ing manual). But this feature is, admittedly, not very prominently displayed in the Turbo Pascal reference. (As a general rule we should not use the newsgroups as a replacement for our possibly missing manuals, but enough of this line.) I'll only explain Q and Q2. The other two, Q3 and Q4 should be evident from the example code. There is a CheckBreak variable in the Crt unit, which is true by default. To turn it off use uses Crt; : CheckBreak := false; : Besides turning off break checking this enables you to capture the pressing of the break key as you would capture pressing ctrl-c. In other words you can use e.g. : procedure TEST; var key : char; begin repeat if KeyPressed then begin key := ReadKey; case key of #0 : begin key := ReadKey; case key of #59 : write ('F1 '); #72 : write ('CursUp '); { Deteting these } #75 : write ('CursLf '); { is often asked! } #77 : write ('CursRg '); #80 : write ('CursDn '); else write ('0 ', ord(key), ' '); end; {case} end; #3 : begin {ctrl-c or break} writeln ('Break'); halt(1); end; { Terminate the program, or whatever } #27 : begin write ('<esc> '); exit; { Exit test, continue program } end; else write (key, ' '); end; {case} end; {if} until false; end; (* test *) : IMPORTANT: Don't test the ctrl-break feature just from within the TP IDE, because it has ctlr-break handler ("interceptor") of its own and may confuse you into thinking that ctrl-break cannot be circumvented by the method given above. The above example has a double purpose. It also shows the rudiments how you can detect if a certain key has been pressed. This enables you to give input without echoing it to the screen, which is a later FAQ in this collection. This is, however, not all there can be to break checking, since the capturing is possible only at input time. It is also possible to write a break handler to interrupt a TP program at any time. For more details see Ohlsen & Stoker, Turbo Pascal Advanced Techniques, Chapter 7. (For the bibliography, see FAQPASB.TXT in this same FAQ collection). A2: This frequent question also elicits one of the most frequent false answers. It is often suggested erroneously that the relevant code would be uses dos; SetCBreak(false); This is not so. It confuses MS-DOS and TP break checking with each other. SetCBreak(false) will _*NOT*_ disable the Ctrl-Break key for your Turbo Pascal program. What it does is "Sets the state of Ctrl-Break checking in DOS. SetCBreak sets the state of Ctrl+Break checking in DOS. When off (False), DOS only checks for Ctrl+Break during I/O to console, printer, or communication devices. When on (True), checks are made at every system call." This item goes to shows how important it is carefully to check one's code and facts before claiming something. A3: Using the "CheckBreak := false;" method is not the only alternative, however. Here is an example code for disabling Ctrl-Break and Ctrl-C with interrupts uses Dos; var OldIntr1B : pointer; { Ctrl-Break address } 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); { Disable Ctrl-Break } GetIntVec ($23, OldIntr23); SetIntVec ($23, @NewIntr23); { Disable Ctrl-C } writeln ('Try breaking, disabled'); readln (answer); SetIntVec ($1B, OldIntr1B); { Enable Ctrl-Break } SetIntVec ($23, OldIntr23); { Enable Ctrl-C } writeln ('Try breaking, enabled'); readln (answer); writeln ('Done'); end. |
(с)Все права защищены По всем интересующим вопросам прошу писать на электронный адрес |