[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]