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

    {
    >   Okay...it works fine, but I want to somehow be able to kindo of remove t
    > Window.  I'm not sure if there is any way of doing this?

    You need to save the screen data at the location you wish to make
    a Window, then after you're done With the Window simply restore
    the screen data back to what it was.  Here's some example
    routines of what you can do, you must call InitWindows once at
    the begining of the Program before using the OpenWindow
    Procedure, then CloseWindow to restore the screen.
    }

    Uses
      Crt;

    Type
      ShadeType = (Shading, NoShading);
      ScreenBlock = Array [1..2000] of Integer;
      ScreenLine  = Array [1..80] of Word;
      ScreenArray = Array [1..25] of ScreenLine;
      WindowLink  = ^WindowControlBlock;
      WindowControlBlock = Record
        X,Y      : Byte;          { start position }
        Hight    : Byte;          { Menu Hight     }
        Width    : Byte;          { Menu width     }
        ID       : Byte;          { Menu number    }
        BackLink : WindowLink;    { previous block }
        MenuItem : Byte;          { select item    }
        ScreenData : ScreenBlock; { saved screen data }
      end;
      String30 = String[30];
      ScreenPtr = ^ScreenRec;
      ScreenRec = Array [1..25,1..80] of Integer;

    Var
      Screen       : ScreenPtr;
      ActiveWindow : Pointer;

    Procedure InitWindows;
    begin
      If LastMode = Mono Then
        Screen := Ptr($B000,0)
      Else
        Screen := Ptr($B800,0);
      ActiveWindow := Nil;
    end;

    Procedure OpenWindow(X, Y, Lines, Columns, FrameColor,
                         ForeGround, BackGround : Byte;
                         Title : String30; Shade : ShadeType);
    Var
      A, X1, X2,
      Y1, Y2        : Integer;
      OldAttr       : Integer;
      WindowSize    : Integer;
      Block         : WindowLink;
    begin
      OldAttr := TextAttr;

      WindowSize := (Lines + 3) * (Columns + 5) * 2 +
                     Sizeof(WindowControlBlock) - Sizeof(ScreenBlock);

      If MemAvail < WindowSize Then
      begin
        WriteLn;WriteLn('Program out of memory');
        Halt;
      end;

      GetMem(Block,WindowSize);
      Block^.X := X - 2;
      Block^.Y := Y - 1;
      Block^.Hight := Lines + 3;
      Block^.Width := Columns + 5;
      Block^.BackLink := ActiveWindow;

      ActiveWindow := Block;
      A := 1;
      For Y1 := Block^.Y to Block^.Y+Block^.Hight-1 Do
      begin
        Move(Screen^[Y1, Block^.X], Block^.ScreenData[A], Block^.Width * 2);
        A := A + Block^.Width;
      end;

      TextColor(FrameColor);
      If BackGround = Black Then
        TextBackGround(LightGray)    { This will keep exploding Window visable }
      Else
        TextBackground(BackGround);

      X1 := X + Columns Div 2;
      X2 := X1 + 1;
      Y1 := Y + Lines Div 2;
      Y2 := Y1 + 1;

      Repeat
        Window(X1, Y1, X2, Y2);
        ClrScr;
        If Columns < 20 Then
          Delay(20);
        If X1 > X Then
          Dec(X1);
        If X2 < X + Columns Then
          Inc(X2);
        If Y1 > Y Then
          Dec(Y1);
        If Y2 < Y + Lines Then
          Inc(Y2);
      Until (X2 - X1 >= Columns ) And (Y2 - Y1 >= Lines);

      Window(X - 1, Y, X + Columns, Y + Lines);
      TextBackground(BackGround);
      ClrScr;
      TextColor(FrameColor);
      Window(1, 1, 80, 24);
      GotoXY(X - 2, Y - 1);
      Write('Ú');
      For A := 1 to Columns + 2 Do
        Write('Ä');

      Write('¿');
      For A := 1 to Lines Do
      begin
        GotoXY(X - 2, Y + A - 1);
        Write('³');
        GotoXY(X + Columns + 1, Y + A - 1);
        Write('³');
      end;
      GotoXY(X - 2, Y + Lines);
      Write('À');
      For A := 1 to Columns + 2 Do
        Write('Ä');
      Write('Ù');
      If Shade = Shading Then
      begin
        For A := Y to Y + Lines + 1 Do
          Screen^[A, X + Columns + 2] := Screen^[A, X + Columns + 2] And $07FF;
        For A := X - 1 to X + Columns + 1 Do
          Screen^[Y + Lines + 1, A] := Screen^[Y + Lines + 1, A] And $07FF;
      end;
      If Title <> '' Then
      begin
        TextColor(FrameColor);
        GotoXY(X + ((Columns - Length(Title)) div 2) - 1, Y - 1);
        Write(' ', Title, ' ');
      end;
      Window(1, 1, 80, 24);
    end;

    Procedure CloseWindow;
    Var
      Block   : WindowLink;
      A       : Integer;
      Y1      : Integer;
      WindowSize : Integer;
    begin
      If ActiveWindow = Nil Then
        Exit;
      Block := ActiveWindow;
      WindowSize := (Block^.Hight) * (Block^.Width) * 2 +
                     Sizeof(WindowControlBlock) - Sizeof(ScreenBlock);
      A := 1;
      For Y1 := Block^.Y to Block^.Y+Block^.Hight - 1 Do
        begin
        Move(Block^.ScreenData[A], Screen^[Y1, Block^.X], Block^.Width * 2);
        A := A + Block^.Width;
        end;
      ActiveWindow := Block^.BackLink;
      FreeMem(Block, WindowSize);
    end;

    begin
      InitWindows;
      OpenWindow(10, 5, 10, 50, LightGreen, LightBlue, Magenta,
                         'Test Window', Shading);
      ReadKey;
      OpenWindow(20, 6, 6, 30, Green, Yellow, Blue,
                         'Test Window 2', Shading);
      ReadKey;
      CloseWindow;
      ReadKey;
      CloseWindow;
      ReadKey;
      GotoXY(1,24);

    end.

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