dos_compilers/Borland Turbo Pascal v55/WINDEMO.PAS
2024-07-02 06:49:04 -07:00

207 lines
4.2 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{ Turbo Windows }
{ Copyright (c) 1989 by Borland International, Inc. }
program WinDemo;
{ Turbo Pascal 5.5 example.
This program demonstrates use of the new WIN unit.
}
{$S-}
uses Crt, Win;
const
CClose = ^C;
CRight = ^D;
CUp = ^E;
CEnter = ^M;
CInsLin = ^N;
COpen = ^O;
CRandom = ^R;
CLeft = ^S;
CDown = ^X;
CDelLin = ^Y;
CExit = ^[;
type
TitleStrPtr = ^TitleStr;
WinRecPtr = ^WinRec;
WinRec = record
Next: WinRecPtr;
State: WinState;
Title: TitleStrPtr;
TitleAttr, FrameAttr: Byte;
Buffer: Pointer;
end;
var
TopWindow: WinRecPtr;
WindowCount: Integer;
Done: Boolean;
Ch: Char;
procedure ActiveWindow(Active: Boolean);
begin
if TopWindow <> nil then
begin
UnFrameWin;
with TopWindow^ do
if Active then
FrameWin(Title^, DoubleFrame, TitleAttr, FrameAttr)
else
FrameWin(Title^, SingleFrame, FrameAttr, FrameAttr);
end;
end;
procedure OpenWindow(X1, Y1, X2, Y2: Byte; T: TitleStr;
TAttr, FAttr: Byte);
var
W: WinRecPtr;
begin
ActiveWindow(False);
New(W);
with W^ do
begin
Next := TopWindow;
SaveWin(State);
GetMem(Title, Length(T) + 1);
Title^ := T;
TitleAttr := TAttr;
FrameAttr := FAttr;
Window(X1, Y1, X2, Y2);
GetMem(Buffer, WinSize);
ReadWin(Buffer^);
FrameWin(T, DoubleFrame, TAttr, FAttr);
end;
TopWindow := W;
Inc(WindowCount);
end;
procedure CloseWindow;
var
W: WinRecPtr;
begin
if TopWindow <> nil then
begin
W := TopWindow;
with W^ do
begin
UnFrameWin;
WriteWin(Buffer^);
FreeMem(Buffer, WinSize);
FreeMem(Title, Length(Title^) + 1);
RestoreWin(State);
TopWindow := Next;
end;
Dispose(W);
ActiveWindow(True);
Dec(WindowCount);
end;
end;
procedure Initialize;
begin
CheckBreak := False;
if (LastMode <> CO80) and (LastMode <> BW80) and
(LastMode <> Mono) then TextMode(CO80);
TextAttr := Black + LightGray * 16;
Window(1, 2, 80, 24);
FillWin(#178, LightGray + Black * 16);
Window(1, 1, 80, 25);
GotoXY(1, 1);
Write(' Turbo Pascal 5.5 Window Demo');
ClrEol;
GotoXY(1, 25);
Write(' Ins-InsLine Del-DelLine Alt-O-Open ' +
' Alt-C-Close Alt-R-Random Esc-Exit ');
ClrEol;
Randomize;
TopWindow := nil;
WindowCount := 0;
end;
procedure CreateWindow;
var
X, Y, W, H: Integer;
S: string[15];
Color: Byte;
begin
W := Random(50) + 10;
H := Random(15) + 5;
X := Random(80 - W) + 1;
Y := Random(23 - H) + 2;
Str(WindowCount + 1, S);
if LastMode <> CO80 then
Color := Black else Color := WindowCount mod 6 + 1;
OpenWindow(X, Y, X + W - 1, Y + H - 1, ' Window ' + S + ' ',
Color + LightGray * 16, LightGray + Color * 16);
TextAttr := LightGray;
ClrScr;
end;
procedure RandomText;
begin
repeat
Write(Chr(Random(95) + 32));
until KeyPressed;
end;
function ReadChar: Char;
var
Ch: Char;
begin
Ch := ReadKey;
if Ch = #0 then
case ReadKey of
#19: Ch := CRandom; { Alt-R }
#24: Ch := COpen; { Alt-O }
#45: Ch := CExit; { Alt-X }
#46: Ch := CClose; { Alt-C }
#72: Ch := CUp; { Up }
#75: Ch := CLeft; { Left }
#77: Ch := CRight; { Right }
#80: Ch := CDown; { Down }
#82: Ch := CInsLin; { Ins }
#83: Ch := CDelLin; { Del }
end;
ReadChar := Ch;
end;
procedure Beep;
begin
Sound(500); Delay(25); NoSound;
end;
begin
Initialize;
Done := False;
repeat
Ch := ReadChar;
if WindowCount = 0 then
if (Ch <> COpen) and (Ch <> CExit) then Ch := #0;
case Ch of
#32..#255: Write(Ch);
COpen: CreateWindow;
CClose: CloseWindow;
CUp: GotoXY(WhereX, WhereY - 1);
CLeft: GotoXY(WhereX - 1, WhereY);
CRight: GotoXY(WhereX + 1, WhereY);
CDown: GotoXY(WhereX, WhereY + 1);
CRandom: RandomText;
CInsLin: InsLine;
CDelLin: DelLine;
CEnter: WriteLn;
CExit: Done := True;
else
Beep;
end;
until Done;
Window(1, 1, 80, 25);
NormVideo;
ClrScr;
end.