207 lines
4.2 KiB
Plaintext
207 lines
4.2 KiB
Plaintext
|
|
|||
|
{ 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.
|
|||
|
|