home *** CD-ROM | disk | FTP | other *** search
- unit GS_KeyI;
-
- { Written by Richard F Griffin
-
- 1 December 1988, (Released to the public domain)
-
- 1110 Magnolia Circle
- Papillion, Nebraska 68128
-
- CIS 75206.231
-
- This unit allows you to set data entry routines quickly and simply.
- It also gives the programmer the capability to override the entry
- routine and use another procedure to handle function keys.
-
- }
-
-
- interface
-
- uses crt, dos;
-
- type
- GS_KeyI_str80 = string[80];
-
- var
- GS_KeyI_Chr : char;
- GS_KeyI_Fuc,
- GS_KeyI_Esc : boolean;
- GS_KeyI_Hlp : pointer;
- GS_KeyI_Psn : integer;
-
- Function GS_KeyI_Get : char;
-
- procedure GS_KeyI_Key(wait : boolean;Fldcnt,x,y : integer);
-
- function GS_KeyI_T(waitcr: boolean;Fl,X,Y,B:integer;CTitl,
- CVal:GS_KeyI_str80) : GS_KeyI_str80;
-
- function GS_KeyI_I(waitcr:boolean;Fl,x,y,B:integer;
- CTitl:GS_KeyI_str80;XVal,l,h:integer) : integer;
-
- function GS_KeyI_R(waitcr:boolean;Fl,x,y,B:integer;CTitl:GS_KeyI_str80;
- XVal,l,h:real;d:integer) : real;
-
- implementation
-
- var
- Big_String : GS_KeyI_str80;
-
- {$F+}
- procedure GS_KeyI_Dum;
- begin
- write(#7);
- end;
- {$F-}
-
- {
- This procedure is an Inline far call. The address is inserted by
- GS_KeyI_Call based on the address in GS_KeyI_Hlp. This address is
- initially to GS_KeyI_Dum, but may be changed by the using program.
-
- ex: GS_KeyI_Hlp := @MyProcedure
-
- The procedure will be called when a special function key (F1, F2,
- Home, RtArrow, etc.) is pressed during data entry. The using procedure
- may then use GS_KeyI_Chr to find which key was pressed. It is up to the
- using program to ensure the screen and window sizes are properly restored.
- The programmer must ensure that the $F+ option is used in the procedure
- to force a Far Return.
-
- ----------- DO NOT MODIFY THIS ROUTINE ------------
- }
-
- procedure GS_KeyI_Jmp;
- begin
- InLine ($9A/$00/$00/$00/$00); {CALLF [GS_KeyI_Hlp]}
- end;
-
- {
- Inserts a Far Call address for GS_KeyI_Jmp.
- Works in TP 4 and 5.
- }
-
- procedure GS_KeyI_Call;
- begin
- MemW[seg(GS_KeyI_Jmp):ofs(GS_KeyI_Jmp)+11] := ofs(GS_KeyI_Hlp^);
- MemW[seg(GS_KeyI_Jmp):ofs(GS_KeyI_Jmp)+13] := seg(GS_KeyI_Hlp^);
- GS_KeyI_Jmp;
- end;
-
- Function GS_KeyI_Get : char;
- var ch: char;
- begin
- Ch := ReadKey;
- If (Ch = #0) then { it must be a function key }
- begin
- Ch := ReadKey;
- GS_KeyI_Fuc := true;
- end
- else GS_KeyI_Fuc := false;
- GS_KeyI_Get := Ch;
- end;
-
- procedure GS_KeyI_Key(wait : boolean;Fldcnt,x,y : integer);
- Var
- Big_S : GS_KeyI_str80;
- i : integer;
- begin
- Big_s := '';
- GS_KeyI_Psn := 0;
- gotoxy(x,y);
- Repeat
- GS_KeyI_Chr := GS_KeyI_Get;
- GS_KeyI_Esc := false;
- if not GS_KeyI_Fuc then
- begin
- case GS_KeyI_Chr of
- #08 : begin
- If GS_KeyI_Psn > 0 then
- begin
- GS_KeyI_Psn := GS_KeyI_Psn - 1;
- gotoxy(x+GS_KeyI_Psn,y);
- write('_');
- gotoxy(x+GS_KeyI_Psn,y);
- delete(Big_S,length(Big_S),1);
- end else
- begin
- write('_');
- gotoxy(x+GS_KeyI_Psn,y);
- end;
- end;
- ' '..'}' : begin
- if (GS_KeyI_Psn = Fldcnt) and (wait) then
- write(#7)
- else begin
- if GS_KeyI_Psn = 0 then
- begin
- for i := 1 to Fldcnt do write('_');
- gotoxy(x,y);
- end;
- GS_KeyI_Psn := GS_KeyI_Psn + 1;
- write(GS_KeyI_Chr);
- Big_S := Big_S + GS_KeyI_Chr;
- end;
- end;
- #27 : begin
- Big_S := ' ';
- GS_KeyI_Esc := true;
- end;
- end;
- end else
- begin
- GS_KeyI_Call;
- gotoxy(x+GS_KeyI_Psn,y);
- end;
- until (GS_KeyI_Chr in [#13,#27]) or ((GS_KeyI_Psn = Fldcnt) and (not wait));
- Big_String := Big_S;
- end;
-
- { The GS_KeyI_T function will process an input from the keyboard and display
- it on the screen in a specified location. The length of the input field is
- given, as well as a default entry. The default entry is optionally shown
- on the screen.
-
- Parameter descriptions are:
-
- 1 Boolean flag to determine whether to wait for a carriage return
- once the field is full.
-
- 2 Length of input field.
-
- 3 Horizontal location to start.
-
- 4 Vertical position to start.
-
- 5 Vertical line to place default value. Should be 0 to inhibit
- display of default. Will usually be the same as (4).
-
- 6 The prompt to place on the screen prior to the data entry field.
- Should be '' if no prompt.
-
- 7 Default value.
-
- }
-
-
- function GS_KeyI_T(waitcr: boolean;Fl,X,Y,B:integer;CTitl,
- CVal:GS_KeyI_str80) : GS_KeyI_str80;
- var
- i : integer;
- begin
- GS_KeyI_T := '';
- gotoxy(x,y);
- write(CTitl);
- for i := 1 to Fl do write('_');
- if B <> 0 then
- begin
- gotoxy(x+length(CTitl),B);
- write(CVal);
- end;
- GS_KeyI_Key(waitcr,FL,x+length(CTitl),y);
- if Big_String = '' then Big_String := CVal;
- if GS_KeyI_Esc then Big_String := ' ';
- gotoxy(x+length(CTitl),y);
- write(Big_String,'':Fl-length(Big_String));
- if (B <> 0) and (B <> Y) then
- begin
- gotoxy(x+length(CTitl),B);
- write('':length(CVal));
- end;
- GS_KeyI_T := Big_String;
- end;
-
- { The GS_KeyI_I function will accept an integer from the keyboard and display
- it on the screen in a specified location. The length of the input field is
- given, as well as a default entry. The default entry is optionally shown
- on the screen. A range of acceptable values is also specified.
-
- Parameter descriptions are:
-
- 1 Boolean flag to determine whether to wait for a carriage return
- once the field is full.
-
- 2 Length of input field.
-
- 3 Horizontal location to start.
-
- 4 Vertical position to start.
-
- 5 Vertical line to place default value. Should be 0 to inhibit
- display of default. Will usually be the same as (4).
-
- 6 The prompt to place on the screen prior to the data entry field.
- Should be '' if no prompt.
-
- 7 Default value.
-
- 8 Lowest value acceptable.
-
- 9 Highest value acceptable.
-
- }
-
-
- function GS_KeyI_I(waitcr:boolean;Fl,x,y,B:integer;
- CTitl:GS_KeyI_str80;XVal,l,h:integer) : integer;
- Var
- Cod, q, i : integer;
- CVal : GS_KeyI_str80;
-
- begin
- str(XVal:Fl,CVal);
- Cod := 1;
- while Cod <> 0 do
- begin
- Big_String := GS_KeyI_T(waitcr,Fl,X,Y,B,CTitl,CVal);
- if GS_KeyI_Esc then
- begin
- GS_KeyI_I := XVal;
- Exit;
- end;
- if Big_String[length(Big_String)] = ' ' then
- Big_String := 'z';
- for i := 1 to length(Big_String) do
- if Big_String[i] = ' ' then Big_String[i] := '0';
- val(Big_String,q,Cod);
- if Cod <> 0 then
- begin
- write(chr(7));
- end else
- begin
- if (q < l) or (q > h) then
- begin
- Cod := 1;
- write(chr(7));
- end;
- end;
- end;
- GS_KeyI_I := q;
- end;
-
-
- { The GS_KeyI_R function will accept a real number from the keyboard and
- display it on the screen in a specified location. The length of the
- input field is given, as well as a default entry. The default entry
- is optionally shown on the screen. A range of acceptable values is
- also specified.
-
- Parameter descriptions are:
-
- 1 Boolean flag to determine whether to wait for a carriage return
- once the field is full.
-
- 2 Length of input field.
-
- 3 Horizontal location to start.
-
- 4 Vertical position to start.
-
- 5 Vertical line to place default value. Should be 0 to inhibit
- display of default. Will usually be the same as (4).
-
- 6 The prompt to place on the screen prior to the data entry field.
- Should be '' if no prompt.
-
- 7 Default value.
-
- 8 Lowest value acceptable.
-
- 9 Highest value acceptable.
-
- 10 Number of decimal places.
-
- }
-
-
- function GS_KeyI_R(waitcr:boolean;Fl,x,y,B:integer;CTitl:GS_KeyI_str80;
- XVal,l,h:real;d:integer) : real;
- Var
- Cod, i : integer;
- CVal : GS_KeyI_str80;
- r : real;
-
- begin
- str(XVal:Fl:d,CVal);
- Cod := 1;
- while Cod <> 0 do
- begin
- Big_String := GS_KeyI_T(waitcr,Fl,X,Y,B,CTitl,CVal);
- if GS_KeyI_Esc then
- begin
- GS_KeyI_R := XVal;
- Exit;
- end;
- if Big_String[length(Big_String)] = ' ' then
- Big_String := 'z';
- for i := 1 to length(Big_String) do
- if Big_String[i] = ' ' then Big_String[i] := '0';
- val(Big_String,r,Cod);
- if Cod <> 0 then
- begin
- write(chr(7));
- end else
- begin
- if (r < l) or (r > h) then
- begin
- Cod := 1;
- write(chr(7));
- end;
- end;
- end;
- gotoxy(x+length(CTitl),y);
- str(r:Fl:d,Big_String);
- write(Big_String,'':Fl-length(Big_String));
- GS_KeyI_R := r;
- end;
-
- begin
- GS_KeyI_Hlp := @GS_KeyI_Dum;
- end.
-
- {---------------- DEMO PROGRAM ------------------------ }
-
- program KeyIDemo;
-
- uses crt, dos, GS_KeyI;
-
- var
- lin : string[80];
- numi : integer;
- numr : real;
-
- {$F+}
- procedure tst;
- begin
- window(1,20,80,24);
- ClrScr;
- gotoxy(20,1);
- case GS_KeyI_Chr of
- #59 : write('Function Key F1 Pressed');
- #60 : write('Function Key F2 Pressed');
- #61 : write('Function Key F3 Pressed');
- #62 : write('Function Key F4 Pressed');
- #71 : write('The Home Key was Pressed');
- #79 : write('The End Key was Pressed');
- else
- write(#7);
- end;
- window(1,1,80,25);
- end;
- {$F-}
-
- begin
- clrscr;
- GS_KeyI_Hlp := @tst;
- lin := GS_KeyI_T(true, 8,10,1,1,'Enter Text Field: ','empty');
- numi := GS_KeyI_I(true, 2,10,2,2,'Enter Integer Field (0-50): ',0,0,50);
- numr:= GS_KeyI_R(true, 6,10,3,3,'Enter Real Field (0-99.99): ',0,0,99.99,2);
- end.