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

Program Scroll;
Uses
  Crt, Dos;
Const
  Null       = #0;
  UpArrow    = #72;
  LeftArrow  = #75;
  RightArrow = #77;
  DownArrow  = #80;
  PageUp     = #73;
  PageDown   = #81;
  ESC        = #27;

Type
  StrPtr = ^LineBuffer;

  LineBuffer = Record
    Line   : String[255];
    Next   : StrPtr;
    Prev   : StrPtr;
    Up23   : StrPtr;
    Down23 : StrPtr;
  end;
Var
  F       : Text;
  First,
  Last,
  Prev,
  Current : StrPtr;
  Line    : Byte;
  Row     : Byte;

Function PadString( S : String ) : String;
Var
  X : Byte;
begin
  if ord(S[0]) > 79 then S[0]:=Chr(80);
  For X := (Length(S) + 1) to 79 Do
    S[X] := ' ';
  S[0] := Chr(79);
  PadString := S;
end;

Procedure Normal;
begin
  TextColor(15);
  TextBackGround(0);
end;

Procedure HighLite;
begin
  TextColor(10);
  TextBackGround(7);
end;

Procedure AddString;
Var
  S : String;

begin
  if First = Nil then
  begin
    Line := 1;
    New(Current);
    Current^.Prev   := Nil;
    Current^.Next   := Nil;
    Current^.Up23   := Nil;
    Current^.Down23 := Nil;
    ReadLn(F, S);
    Current^.Line   := S;
    Last  := Current;
    First := Current;
  end
  else
  begin
    Prev := Current;
    New(Current);
    Current^.Prev:=Prev;
    Current^.Next:=Nil;
    ReadLn(F,Current^.Line);
    if Line = 23 then
    begin
      Current^.Up23 := First;
      First^.Down23 := Current;
      Current^.Down23:= Nil;
    end
    else
    begin
      if Line > 23 then
      begin
        Current^.Up23 := Prev^.Up23^.Next;
        Current^.Up23^.Down23 := Current;
        Current^.Down23:=Nil;
      end
      else
      begin
        Current^.Up23:=Nil;
        Current^.Down23:=Nil;
      end;
    end;
    Prev^.Next:=Current;
    Last:=Current;
    if Line<=60 then
      Line:=Line + 1;
  end;
end;

Procedure DrawScreen( This : StrPtr);
Var
  TRow : Byte;
begin
  TRow:=1;
  While TRow<=23 Do
   begin
     GotoXY(1,TRow);
     Write(PadString(This^.Line));
     This:=This^.Next;
     TRow:=TRow + 1;
   end;
end;

Procedure Scrolling;
Var
  InKey : Char;
begin
  While (MemAvail>272) and (not Eof(F)) Do AddString;
  if not Eof(F) then
   begin
     GotoXY(1,1);
     TextColor(10);
     Write('Entire File not Loaded');
   end;
  Current:=First;
  Window(1,1,1,79);
  ClrScr;
  HighLite;
  GotoXY(1,1);
  Write(PadString(ParamStr(1)));
  Window(2,1,24,80);
  Normal;
  DrawScreen(First);
  Row:=1;
  Window(2,1,25,80);
  While InKey<>#27 Do
  begin
    InKey:=ReadKey;
    Case InKey of
      Null :
      begin
        InKey:=ReadKey;
        Case InKey of
          UpArrow :
          begin
            if Current^.Prev = Nil then
            begin
              Sound(2000);
              Delay(50);
              NoSound;
            end
            else
            begin
              if Row = 1 then
              begin
                GotoXY(1,1);
                Normal;
                Write(PadString(Current^.Line));
                GotoXY(1,1);
                InsLine;
                Current:=Current^.Prev;
                HighLite;
                Write(PadString(Current^.Line));
              end
              else
              begin
                GotoXY(1,Row);
                Normal;
                Write(PadString(Current^.Line));
                Row:=Row - 1;
                GotoXY(1,Row);
                HighLite;
                Current:=Current^.Prev;
                Write(PadString(Current^.Line));
              end;
            end;
          end;

          DownArrow :
          begin
            if Current^.Next = Nil then
            begin
              Sound(2000);
              Delay(50);
              NoSound;
            end
            else
            begin
              if Row = 23 then
              begin
                GotoXY(1,23);
                Normal;
                Write(PadString(Current^.Line));
                GotoXY(1,1);
                DelLine;
                GotoXY(1,23);
                Current:=Current^.Next;
                HighLite;
                Write(PadString(Current^.Line));
              end
              else
              begin
                GotoXY(1,Row);
                Normal;
                Write(PadString(Current^.Line));
                Row:=Row + 1;
                GotoXY(1,Row);
                HighLite;
                Current:=Current^.Next;
                Write(PadString(Current^.Line));
              end;
            end;
          end;

          PageDown :
           begin
            if (Row = 23) and (Current = Last) then
            begin
              Sound(2000);
              Delay(50);
              NoSound;
            end
            else
            begin
              Normal;
              if Current^.Down23 = Nil then
              begin
                Current:=Last;
                DrawScreen(Last^.Up23);
                Row:=23;
                GotoXY(1,Row);
                HighLite;
                Write(PadString(Current^.Line));
              end
              else
              begin
                Current:=Current^.Down23^.Next;
                DrawScreen(Current^.Up23);
                Row:=23;
                GotoXY(1,Row);
                HighLite;
                Write(PadString(Current^.Line));
              end;
            end;
          end;

          PageUp :
          begin
            if (Row = 23) and (Current^.Up23 = Last) then
            begin
              Sound(2000);
              Delay(50);
              NoSound;
            end
            else
            begin
              Normal;
              if Current^.Up23 = Nil then
              begin
                Current:=First;
                DrawScreen(First);
                Row:=1;
                GotoXY(1,Row);
                HighLite;
                Write(PadString(First^.Line));
              end
              else
              begin
                Current:=Current^.Up23^.Prev;
                DrawScreen(Current);
                Row:=1;
                GotoXY(1,Row);
                HighLite;
                Write(PadString(Current^.Line));
              end;
            end;
          end;
        else
        begin
          Sound(2000);
          Delay(50);
          NoSound;
        end;

        end;
      end;

    else
    begin
      Sound(2000);
      Delay(50);
      NoSound;
    end;

    end;
  end;
end;

begin
  if ParamCount < 1 then
  begin
    WriteLn('Invalid Number of Parameters!!!');
    Halt(1);
  end;
  Assign(F, Paramstr(1));
  Reset(F);
  Current:=Nil;
  First:=Nil;
  Scrolling;
  GotoXY(1, 23);
  WriteLn;
  WriteLn;
end.


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