[Back to ENTRY SWAG index] [Back to Main SWAG index] [Original]

    (****************************************************************)
    (*                         N_EditLn                             *)
    (*                                                              *)
    (*    General Purpose line editor, based on EDITLN by Borland   *)
    (*          Modified for use with multiple lines by             *)
    (*                 Bob Gibson of BGShareWare                    *)
    (*                                                              *)
    (****************************************************************)

    unit N_EditLn;
    {$D-,I-,S-}
    interface
    uses Scrn;

    const
      NULL = #0;
      BS = #8;
      LF = #10;
      CR = #13;
      ESC = #27;
      Space = #32;
      Tab = ^I;

      { The following constants are based on the scheme used by the scan key
        function to convert a two key scan code sequence into one character
        by adding 128 to the ordinal value of the second character.
      }
      F1 = #187;
      F2 = #188;
      F3 = #189;
      F4 = #190;
      F5 = #191;
      F6 = #192;
      F7 = #193;
      F8 = #194;
      F9 = #195;
      F10 = #196;
      UpKey = #200;
      DownKey = #208;
      LeftKey = #203;
      RightKey = #205;
      PgUpKey = #201;
      PgDnKey = #209;
      HomeKey = #199;
      EndKey = #207;
      InsKey = #210;
      DelKey = #211;
      M : Word = 0;
    var
      O, N, R, P : byte;
      Ch : Char;
      T : String;

    type
      CharSet = set of char;

    procedure EditLine(var S     : String;
                           Len, X, Y : byte;
                           LegalChars,
                           Term  : CharSet;
                       var TC    : Char    );
    {  EditLn implements a line editor that supports WordStar commands
       as well as left-right arrow keys , Home, End, back space, etc.
       Paramaters:
         S : String to be edited
         Len : Maximum characters allowed to be edited
         X, Y : Starting x an y cordinates
         LegalChars : Set of characters that will be accepted
         Term : Set of characters that will cause EditLine to Exit
                (Note LegalChars need not contain Term)
         TC : Character that caused EditLn to exit
    }

    function ScanKey : char;
    { Reads a key from the keyboard and converts 2 scan code escape
      sequences into 1 character. }

    implementation
    {$L keys}
    Function KeyPressed : Boolean ; External;
    Function ReadKey : Char ; External;

    function ScanKey : char;
    { Reads a key from the keyboard and converts 2 scan code escape
      sequences into 1 character. }

    var
      Ch : Char;
    begin
      Ch := ReadKey;
      if (Ch = #0) {and KeyPressed} then
      begin
        Ch := ReadKey;
        if ord(Ch) < 128 then
          Ch := Chr(Ord(Ch) + 128);
      end;
      ScanKey := Ch;
    end; { ScanKey }

    procedure EditLine(var S : String;
                       Len, X, Y : byte;
                       LegalChars, Term  : CharSet;
                       var TC    : Char);
    {  EditLn implements a line editor that supports WordStar commands
       as well as left-right arrow keys , Home, End, back space, etc.
       Paramaters:
         S : String to be edited
         Len : Maximum characters allowed to be edited
         X, Y : Starting x an y cordinates
         LegalChars : Set of characters that will be accepted
         Term : Set of characters that will cause EditLine to Exit
                (Note LegalChars need not contain Term)
         TC : Character that caused EditLn to exit
    }
    {$V-}

    begin
      PXY(X,Y);
      PWrite(S);
      P := Y - 1;
      N := Y;
      O := X;
      Y := 1;
      M := 0;
      Mem[$40:$17] := (Mem[$40:$17] AND $7F);
      repeat
        If ((Mem[$40:$17] AND $80) = $80) Then SetCursor(0,7) Else SetCursor(6,7);
        If (Y+P) > 80 Then Begin
           Inc(X);
           P := 0;
           End;
        PXY(X,Y+P);
        Ch := ScanKey;
        if not (Upcase(Ch) in Term) then
          case Ch of
            #32..#126 : if (M < Len) and
                           (ch in LegalChars) then
                        begin
                          P := succ(P);
                          M := succ(M);
                          If ((Mem[$40:$17] AND $80) = $80) Then
                            Delete(S,M,1);
                          If ((Mem[$40:$17] AND $80) <> $80) Then
                             If Length(S) = Len Then Delete(S,Len,1);
                          Insert(Ch,S,M);
                          T := Copy(S,M,Len);
                          PWrite(T);
                        end
                        Else Writeln(^G);
            ^S, LeftKey : if M > 0 then Begin
                            If P < 1 Then Begin
                               P := 80;
                               Dec(X);
                               End;
                            P := pred(P);
                            M := pred(M);
                            End;
            ^D, RightKey : if M < Length(S) then Begin
                             P := succ(P);
                             M := succ(M);
                             End;
             HomeKey : Begin
                            M := M - P;
                            P := 0;
                            End;
             EndKey : Begin
                            M := M + (79 - P);
                            P := 79;
                            If M > Length(S) Then Begin
                               P := P - (M - Length(S));
                               M := Length(S);
                               End;
                            End;
             UpKey : If X > O Then Begin
                            Dec(X);
                            M := M - 80;
                            End;
             DownKey : If (M+80) < Length(S) Then Begin
                            Inc(X);
                            M := M + 80;
                            If M > Length(S) Then Begin
                               P := P - (M - Length(S));
                               M := Length(S);
                               End;
                            End;
             DelKey  : if M < Length(S) then
                           begin
                             Delete(S,M + 1,1);
                             T := Copy(S,M+1,Len);
                             T := T + ' ';
                             PWrite(T);
                           end;
             BS : if M > 0 then
                     begin
                       Delete(S,M,1);
                       T := Copy(S,M,Len);
                       If (Y+P-1) < 1 Then Begin
                          Dec(X);
                          P := (81-Y);
                          PXY(X,P);
                          End
                       Else PXY(X,Y+P-1);
                       T := T + ' ';
                       PWrite(T);
                       P := pred(P);
                       M := pred(M);
                     end;
             F9 : Begin
                      X := O;
                      Y := 1;
                      For R := 1 To Len Do PWrite(' ');
                      P := 0;
                      S := '';
                      M := 0;
                      End;
          else;
        end;  {of case}
      until UpCase(Ch) in Term;
      SetCursor(6,7);
      PXY(X,Y+P);
      M := Length(S);
      For R := 1 To (Len-M) Do PWrite('');
      TC := Upcase(Ch);
    end; { EditLine }

    end.

    USE XX34 to decode this object code.  You MUST Have it to use this unit
    Also, you will need the SCRN.PAS from the SCREEN.SWG packet.

    *XX3401-000092-070293--68--85-59342--------KEYS.OBJ--1-OF--1
    U+M+-2h3KJAuZUQ+++F1HoF3F7U5+0UI++6-+G4E5++++Ed9FJZEIYJHIoJ2++++-p73
    EIF9FJY7+++pc-U++E++h+5B3bHug+51JMjgh+TB6MjZLQD6WU6++5E+
    ***** END OF XX-BLOCK *****

[Back to ENTRY SWAG index] [Back to Main SWAG index] [Original]