home *** CD-ROM | disk | FTP | other *** search
- (****************************************************************************)
- (* REMOVABLE WINDOWS *)
- (* *)
- (* Call INITWIN before calling MKWIN or RMWIN. *)
- (* *)
- (* Uses some routines from the BASIC.INC Package. *)
- (****************************************************************************)
-
- const
- maxwin = 30; { Adjustable !!! }
-
- type
- labeltype = string[60];
- imagetype = array[1..3840] of char;
- windimtype = record
- x1,y1,x2,y2 : byte;
- scr_shade : byte;
- text_shade : byte;
- end;
- var
- win : record
- xh,yh : byte;
- dim : windimtype;
- depth : integer;
- stack : array[1..maxwin] of
- record
- images : ^imagetype;
- dim : windimtype;
- x,y : integer;
- end;
- end;
- crtmode : byte absolute $0040:$0049;
- monobuffer : imagetype absolute $B000:$0000;
- colorbuffer : imagetype absolute $B800:$0000;
- scr_color : integer;
-
- (****************************************************************************)
- (* Initial Window System *)
- (****************************************************************************)
- procedure
- initwin;
- begin
- with win.dim do begin
- x1 := 1;
- y1 := 1;
- x2 := 80;
- y2 := 24;
- scr_shade := BGcolor;
- text_shade := FGcolor;
- end;
- win.depth := 0;
- scr_color := 0;
- end;
-
- (****************************************************************************)
- (* DRAW BOX FOR WINDOW *)
- (****************************************************************************)
- procedure
- boxwin(x1,y1,x2,y2 : integer; winlabel : labeltype);
- var
- x,y : integer;
- begin
- window(x1,y1,x2,y2);
- scr_color := succ(scr_color);
- if scr_color > 6 then
- scr_color := 1;
- textcolor( white );
- textbackground( scr_color );
- clrscr;
- window(1,1,80,25);
-
- { TOP }
- gotoxy(x1,y1);
- write(#201+bstring(x2-x1-1,#205)+#187);
-
- { SIDES }
- for y := succ(y1) to pred(y2) do begin
- gotoxy(x1,y);
- write(#186);
- gotoxy(x2,y);
- write(#186);
- end;
-
- { BOTTOM }
- gotoxy(x1,y2);
- write(#200+bstring(x2-x1-1,#205)+#188);
-
- if length(winlabel)>0 then begin
- gotoxy(x1+5,y1);
- write(#175+' ',winlabel,' '+#174);
- end;
- window(x1+1,y1+1,x2-1,y2-1);
- gotoxy(1,1);
- end;
-
- (****************************************************************************)
- (* MAKE A WINDOW *)
- (****************************************************************************)
- procedure
- mkwin(x1,y1,x2,y2 : integer; winlabel : labeltype);
- begin
- with win do depth := succ(depth);
- if (win.depth > maxwin) or (memory < 5) then begin
- writeln;
- window(1,1,80,25);
- gotoxy(1,25);
- clreol;
- writeln(^G^G^M^J,' Out of Memory!!! ');
- halt;
- end;
-
- new(win.stack[win.depth].images);
- if crtmode = 7 then
- win.stack[win.depth].images^ := monobuffer
- else
- win.stack[win.depth].images^ := colorbuffer;
-
- win.stack[win.depth].dim := win.dim;
- win.stack[win.depth].x := wherex;
- win.stack[win.depth].y := wherey;
-
- boxwin(x1,y1,x2,y2,winlabel);
- win.dim.x1 := succ(x1);
- win.dim.y1 := succ(y1);
- win.dim.x2 := pred(x2);
- win.dim.y2 := pred(y2);
- win.dim.scr_shade := scr_color;
- win.dim.text_shade := white;
- end;
-
- (****************************************************************************)
- (* REMOVE THE PREVIOUS WINDOW *)
- (****************************************************************************)
- procedure
- rmwin;
- begin
- if crtmode = 7 then
- monobuffer := win.stack[win.depth].images^
- else
- colorbuffer := win.stack[win.depth].images^;
- dispose(win.stack[win.depth].images);
- with win do begin
- dim := stack[depth].dim;
- window(dim.x1,dim.y1,dim.x2,dim.y2);
- textcolor( dim.text_shade );
- textbackground( dim.scr_shade );
- gotoxy(stack[depth].x,stack[depth].y);
- depth := pred(depth);
- end;
- end;
-
- (****************************************************************************)
- (* ESCAPE FROM WINDOW *)
- (****************************************************************************)
- procedure
- escape_win;
- begin
- with win do begin
- xh:=wherex;
- yh:=wherey;
- window(1,1,80,25);
- textcolor( FGcolor );
- textbackground( BGcolor );
- end;
- end;
-
- (****************************************************************************)
- (* REENTER WINDOW PREVIOUSLY ESCAPED FROM *)
- (****************************************************************************)
- procedure
- reset_win;
- begin
- with win do begin
- window(dim.x1,dim.y1,dim.x2,dim.y2);
- textcolor( dim.text_shade );
- textbackground( dim.scr_shade );
- gotoxy(xh,yh);
- end;
- end;