home *** CD-ROM | disk | FTP | other *** search
- procedure Beep(Tone,Duration : integer);
- begin
- Sound(Tone); Delay(Duration); NoSound;
- end;
-
- procedure Say_Cap_Num;
- { Display Caps, Num, Insert in inverse video on line 25 of Video }
- var Value : integer;
- begin
- Value := Mem[0000:1047]; { test for caps, numbers, & cursor cntrl }
- gotoXY(65,25);
- Case Value of
- 0 : begin LowVideo; write(' '); Inserton:= false; end;
- 32 : begin LowVideo; write(' '); InvVideo('NUM');
- Clreol; InsertOn:= false; end;
- 64 : begin InvVideo('CAPS'); Clreol;
- InsertOn:= false; end;
- 96 : begin InvVideo('CAPS'); write(' '); InvVideo('NUM');
- Clreol; InsertOn:=false; end;
- 128 : begin LowVideo; write(' ');
- InvVideo('Insert');InsertOn:=true; end;
- 160 : begin LowVideo; write(' '); InvVideo('NUM');write(' ');
- InvVideo('Insert'); InsertOn:=true; end;
- 192 : begin InvVideo('CAPS'); write(' ');
- InvVideo('Insert'); InsertOn:=true; end;
- 224 : begin InvVideo('CAPS'); write(' ');InvVideo('NUM'); write(' ');
- InvVideo('Insert'); InsertOn:= true; end;
- end; { Case }
- end;
-
- procedure Set_Cap_Num(Caps,Num,Insert : Char);
- { Set the Cap Lock, Number Lock, and Ins Keys as desired }
- var J : integer;
- begin
- if Insert='I' then J:=128 else J:=0;
- Case Caps of
- 'C': begin if Num='N' then MemW[0000:1047]:= 96+J
- else MemW[0000:1047]:= 64+J;
- end;
- ' ': begin if Num='N' then MemW[0000:1047]:= 32+J
- else MemW[0000:1047]:= 0+J;
- end;
- end; { Case }
- end;
-
- {.pa}
- procedure Ck_edit_key(var Ch: Char);
- { test for an IBM Cursor control or Function key }
- begin
- read(kbd,Ch);
- begin {see if IBM specific key pressed}
- case Ch of
- 'H': Ch:=^E ; { up-arrow }
- 'P': Ch:=^X ; { dn-arrow }
- 'M': Ch:=^D ; { rt-arrow }
- 'K': Ch:=^S ; { left-arr }
- 'S': Ch:=#127 ; { Del }
- 'R': Ch:=^V ; { insert }
- 'G': Ch:=^G ; { Home }
- 'O': Ch:=^O ; { End }
- 'I': Ch:=^R ; { Pg-Up }
- 'Q': Ch:=#00 ; { Pg-Dn }
- ';': Ch:=^a ; { F1 }
- '<': Ch:=^b ; { F2 }
- '=': Ch:=^c ; { F3 }
- '>': Ch:=^d ; { F4 }
- '?': Ch:=^e ; { F5 }
- '@': Ch:=^f ; { F6 }
- 'A': Ch:=^g ; { F7 }
- 'B': Ch:=^h ; { F8 }
- 'C': Ch:=^i ; { F9 }
- 'D': Ch:=^j ; { F10 }
- end; {Case Ch}
- end; {IBM check}
- end; {Ck_edit_key}
-
- procedure Get_Template(Template_num:integer; var template: str80);
- { Templates are specified by the Programmer }
- begin
- Case Template_num of
- 1 : template := '(___) ___-____';
- 2 : template := '__/__/__';
- end;
- end;
-
- procedure Input(Typ: Char ; { Type of input }
- Default: str255 ; { Default string }
- Col,Row: integer ; { Where start line }
- Mlen: integer ; { Max length }
- UpperCase:Boolean ; { True if auto Upcase }
- var F1,F10 : boolean); { Returned true if F1 or F10 }
-
- {-- requires
- Global procedures:
- Say_Cap_Num, Set_Cap_Num, Color, Ck_edit_key, Beep, Get_template }
- var
- X,J,LastValue: integer;
- OkChars,temp : set of Char;
- DF : boolean;
-
- {.pa}
- {-------------------------- local procedures ---------------------------}
- procedure GotoX;
- begin
- GotoXY(X+Col-1,Row);
- end;
-
- procedure Ck_Cap_Num; { test for caps, numbers, & cursor cntrl }
- var Value : integer;
- begin
- repeat
- Value := Mem[0000:1047];
- if LastValue<>value then
- begin LastValue:=Value; Say_Cap_Num; GotoX; end;
- until keypressed;
- end;
-
- procedure PosX;
- begin
- while copy(template,X,1)<>#95 do
- begin
- Answer:=Answer + copy(template,X,1); X:=X+1; GotoX;
- end;
- end;
-
- procedure Del_Ans;
- begin
- Answer:=''; X:=1; GotoX;
- write(template); GotoX; PosX;
- end;
- {------------------------ end local procedures ------------------------}
-
- begin
- if Typ='A'then OKChars:=[' '..'}']
- else OKChars:=['0'..'9','+','-','.'];
- Temp := OKChars; color(7,0); DF:= false;
- Case Typ of
- 'A','N','$': begin fillchar(template,80,#95);
- template:=copy(template,1,Mlen);
- if Typ='$' then
- begin
- X:=0; GotoX; HighVideo; write('$');
- end;
- end;
- 'F': begin
- Get_template(Mlen,template); Mlen := length(template);
- if copy(template,1,1)<>#95 then DF:= true;
- end;
-
- end;
-
- if Typ = 'A' then if uppercase then Set_Cap_Num('C',' ','I')
- else Set_Cap_Num(' ',' ','I')
- else Set_Cap_Num(' ','N',' ');
- Color(7,0);
- Answer := ''; F1:=false; F10:=false;
- if Default<>'' then
- begin
- X:=1; GotoX; write(template); GotoX; write(default);
- Answer:=Default;
- end
- else Del_Ans;
- LastValue:=Mem[0000:1047]; Say_Cap_Num; GotoX;
-
- repeat
- Ck_Cap_Num; read(kbd,Ch); Color(7,0);
- if (keypressed) and (Ch<>'p') and (Ch<>'q') then Ck_edit_key(Ch);
- if (Typ='F') and (X=1) and (Default<>'') and (Ch<>^1) and (Ch<>#13)
- then Del_Ans;
- case Ch of
- ^[: begin Del_Ans end; { ESC pressed }
-
- ^D: begin { Move cursor right : rt-arr }
- X:=X+1;
- if (X>length(Answer)+1) or (X>Mlen) then X:=X-1;
- GotoX;
- end;
-
- ^S: begin { Move cursor left : left-arr }
- if Typ='F' then Del_Ans else
- begin
- X:=X-1; if X<1 then X:=1;
- GotoX;
- end;
- end;
- ^O: begin { Move cursor to end of line }
- X:=Length(Answer)+1; if X>Mlen then X:=Mlen; GotoX;
- end;
- ^G: begin { Move cursor to beginning of line }
- X:=1; GotoX;
- end;
- ^H: begin { Delete left char: BS }
- if Typ='F' then Del_Ans
- else
- begin
- X:=X-1;
- if (Length(Answer)>0) and (X>0) then
- begin
- Delete(Answer,X,1); GotoX;
- Write(copy(Answer,X,(Length(Answer)-X+1)),#95);
- GotoX;
- end
- else X:=1;
- end; { Typ <> 'F' }
- end;
- #127: begin { Delete }
- Delete(Answer,X,1);
- Write(copy(Answer,X,Length(Answer)-X+1),#95); GotoX;
- end;
- ^a : begin { F1 pressed }
- F1 := true; Exit := true; Answer:= default;
- end;
- ^M : Exit := true;
- ^j : begin F10 := true; Exit := true; Answer := default; end;
-
- else
- if (length(Answer)+1 <= Mlen) or (not InsertOn) then
- begin { non-IBM char }
- if Ch in OkChars then
- begin
- if InsertOn then
- begin
- if length(Answer) < Mlen then
- begin { OK to insert }
- insert(Ch,Answer,X);
- Case Typ of
- 'A','N','$' : write(copy(Answer,X,Length(Answer)-X+1));
- 'F' : Write(Ch);
- end; {Case}
- end; { OK to insert }
- end else { end InsertOn }
- if X <= Mlen then
- begin
- write(Ch);
- if X>length(Answer) then Answer:=Answer+Ch
- else Answer[X]:=Ch;
- end; { processing this key }
- if X+1 <= Mlen then X:=X+1;
- if (X > Length(Answer)) and (template[X]<>#95) then PosX;
- end { OkChars }
- else if (Ch<> ^V) then Beep(300,150);
- { beep if invalid char and ch is not Insert key }
- GotoX;
- end; { non IBM key }
- if (typ<>'F') and (length(Answer)+1 > Mlen) and (Ch <> ^V)
- then Beep(600,100);
- end; { CASE!!! }
- until Exit = true;
- Color(0,15); X:=1; gotoX; write(Answer);
- { erase part of template that is left }
- X:=length(Answer)+1; GotoX;
- for J:= 1 to Mlen-x+1 do write(' ');
- Exit := false; Color(0,7);
- if (DF) and (length(Answer)=1) then
- begin
- gotoXY(col,row); write(' '); Answer:='';
- end;
- end; { end Input Procedure }