dos_compilers/Borland Turbo Pascal v6/TVDEMOS/TVBGI.PAS
2024-07-02 07:11:05 -07:00

304 lines
7.8 KiB
Plaintext

{************************************************}
{ }
{ Turbo Pascal 6.0 }
{ Turbo Vision BGI Support Demo }
{ Copyright (c) 1990 by Borland International }
{ }
{************************************************}
program TVBGI;
{$M 8192,8192,655360}
{$S-}
{ This simple Vision program shows how to use GRAPHAPP unit
to control switching back and forth to BGI routines from
inside a Turbo Vision application.
If you are running this program in the IDE, be sure to enable
the full graphics save option when you load TURBO.EXE:
turbo -g
This ensures that the IDE fully swaps video RAM and keeps
"dustclouds" from appearing on the user screen when in
graphics mode. You can enable this option permanently
via the Options|Environment|Startup dialog.
This program uses the Graph unit and its .BGI driver files to
display graphics on your system. The "PathToDrivers"
constant defined below is set to \TP\BGI, which is the default
location of the BGI files as installed by the INSTALL program.
If you have installed these files in a different location, make
sure the .BGI file for your system (EGAVGA.BGI, etc.) is in the
current directory or modify the "PathToDrivers" constant
accordingly.
}
{$X+}
uses
Dos, Graph, Objects, Drivers, Memory, Views, Menus, Dialogs,
StdDlg, MsgBox, App, GraphApp;
const
PathToDrivers = '\TP\BGI'; { Default location of *.BGI files }
cmTile = 100;
cmCascade = 101;
cmNewWin = 1000;
cmChangeDir = 1001;
cmSetBGIPath = 1002;
cmDoGraphics = 1003;
hlChangeDir = cmChangeDir; { History list ID }
hlSetBGIPath = cmSetBGIPath; { History list ID }
type
PBGIApp = ^TBGIApp;
TBGIApp = object(TApplication)
AppDriver: Integer;
AppMode: Integer;
BGIPath: PString;
constructor Init;
destructor Done; virtual;
procedure HandleEvent(var Event: TEvent); virtual;
procedure InitMenuBar; virtual;
procedure InitStatusLine; virtual;
procedure OutOfMemory; virtual;
end;
constructor TBGIApp.Init;
begin
TApplication.Init;
BGIPath := NewStr(FExpand(PathToDrivers));
AppDriver := Detect;
AppMode := 0;
if not GraphAppInit(AppDriver, AppMode, BGIPath, True) then
MessageBox('Cannot load graphics driver.',
nil, mfError or mfOkButton);
end;
destructor TBGIApp.Done;
begin
GraphAppDone;
if BGIPath <> nil then DisposeStr(BGIPath);
TApplication.Done;
end;
procedure TBGIApp.HandleEvent(var Event: TEvent);
procedure NewWin;
const
WinNum: Word = 0;
var
R: TRect;
S: string[3];
P: PWindow;
begin
Str(WinNum, S);
DeskTop^.GetExtent(R);
with DeskTop^.Size do
R.Assign(WinNum mod Pred(Y), WinNum mod Pred(Y), X, Y);
Inc(WinNum);
P := New(PWindow, Init(R, 'Window ' + S, 0));
P^.Options := P^.Options or ofTileable;
DeskTop^.Insert(ValidView(P));
end;
{ Draw random polygons with random fill styles on the screen }
procedure DoGraphics;
const
MaxPts = 5;
type
PolygonType = array[1..MaxPts] of PointType;
var
Event: TEvent;
Poly: PolygonType;
I, Color: Word;
MaxX, MaxY: Word;
begin
if not GraphicsStart then
MessageBox(GraphErrorMsg(GraphResult) + '.',
nil, mfError or mfOkButton)
else
begin
MaxX := GetMaxX;
MaxY := GetMaxY;
OutTextXY(0, MaxY - TextHeight('M'),
'Press any key to return...');
SetViewPort(0, 0, MaxX - 1, MaxY - (TextHeight('M') + 5), ClipOn);
repeat
Color := Random(GetMaxColor) + 1;
SetFillStyle(Random(11) + 1, Color);
SetColor(Color);
for I := 1 to MaxPts do
with Poly[I] do
begin
X := Random(MaxX);
Y := Random(MaxY);
end;
FillPoly(MaxPts, Poly);
GetKeyEvent(Event);
until Event.What <> evNothing;
GraphicsStop;
end;
end;
procedure SetBGIPath;
var
D: PDialog;
R: TRect;
Control: PView;
PathInput: PInputLine;
S: PathStr;
begin
R.Assign(0, 0, 35, 8);
D := New(PDialog, Init(R, 'Path to BGI Files'));
D^.Options := D^.Options or ofCentered;
{ Buttons }
R.Assign(23, 5, 33, 7);
D^.Insert(New(PButton, Init(R, 'Cancel', cmCancel, bfNormal)));
R.Assign(12, 5, 22, 7);
D^.Insert(New(PButton, Init(R, 'O~K~', cmOK, bfDefault)));
{ Input line, history list and label }
R.Assign(3, 3, 30, 4);
PathInput := New(PInputLine, Init(R, 68));
D^.Insert(PathInput);
R.Assign(30, 3, 33, 4);
Control := New(PHistory, Init(R, PathInput, hlSetBGIPath));
D^.Insert(Control);
S := FExpand(BGIPath^);
D^.SetData(S);
D := PDialog(ValidView(D));
if D <> nil then
begin
if Desktop^.ExecView(D) = cmOk then
begin
D^.GetData(S);
DisposeStr(BGIPath);
S := FExpand(S);
if (Length(S) > 0) and (S[Length(S)] <> '\') then
S := S + '\';
BGIPath := NewStr(S);
if not GraphAppInit(AppDriver, AppMode, BGIPath, True) then
MessageBox('Cannot load graphics driver.', nil,
mfError or mfOkButton);
end;
Dispose(D, Done);
end;
end;
procedure ChangeDir;
var
P: PView;
begin
P := ValidView(New(PChDirDialog, Init(0, hlChangeDir)));
if P <> nil then
begin
DeskTop^.ExecView(P);
Dispose(P, Done);
end;
end;
procedure Tile;
var
R: TRect;
begin
Desktop^.GetExtent(R);
Desktop^.Tile(R);
end;
procedure Cascade;
var
R: TRect;
begin
Desktop^.GetExtent(R);
Desktop^.Cascade(R);
end;
begin
TApplication.HandleEvent(Event);
case Event.What of
evCommand:
case Event.Command of
cmNewWin: NewWin;
cmChangeDir: ChangeDir;
cmSetBGIPath: SetBGIPath;
cmDoGraphics: DoGraphics;
cmTile: Tile;
cmCascade: Cascade;
else
Exit;
end;
else
Exit;
end;
ClearEvent(Event);
end;
procedure TBGIApp.InitMenuBar;
var
R: TRect;
begin
GetExtent(R);
R.B.Y := R.A.Y + 1;
MenuBar := New(PMenuBar, Init(R, NewMenu(
NewSubMenu('~T~est', hcNoContext, NewMenu(
NewItem('~B~GI settings...', '', kbNoKey, 0, hcNoContext,
NewItem('~G~raph', 'Alt-F5', kbAltF5, cmDoGraphics, hcNoContext,
NewItem('~S~et BGI path...', '', kbNoKey, cmSetBGIPath, hcNoContext,
NewLine(
NewItem('~C~hange dir...', '', kbNoKey, cmChangeDir, hcNoContext,
NewItem('E~x~it', 'Alt-X', kbAltX, cmQuit, hcNoContext,
nil))))))),
NewSubMenu('~W~indows', hcNoContext, NewMenu(
NewItem('~S~ize/move','Ctrl-F5', kbCtrlF5, cmResize, hcNoContext,
NewItem('~Z~oom', 'F5', kbF5, cmZoom, hcNoContext,
NewItem('~T~ile', '', kbNoKey, cmTile, hcNoContext,
NewItem('C~a~scade', '', kbNoKey, cmCascade, hcNoContext,
NewItem('~N~ext', 'F6', kbF6, cmNext, hcNoContext,
NewItem('~P~revious', 'Shift-F6', kbShiftF6, cmPrev, hcNoContext,
NewItem('~C~lose', 'Alt-F3', kbAltF3, cmClose, hcNoContext,
NewLine(
NewItem('Add ~w~indow','F4', kbF4, cmNewWin, hcNoContext,
nil)))))))))),
nil)))));
end;
procedure TBGIApp.InitStatusLine;
var
R: TRect;
begin
GetExtent(R);
R.A.Y := R.B.Y - 1;
New(StatusLine, Init(R,
NewStatusDef(0, $FFFF,
NewStatusKey('~Alt-X~ Exit', kbAltX, cmQuit,
NewStatusKey('~Alt-F5~ Graph', kbAltF5, cmDoGraphics,
NewStatusKey('', kbF10, cmMenu,
NewStatusKey('', kbAltF3, cmClose,
NewStatusKey('', kbF5, cmZoom,
NewStatusKey('', kbCtrlF5, cmResize,
NewStatusKey('', kbF6, cmNext,
nil))))))),
nil)));
end;
procedure TBGIApp.OutOfMemory;
begin
MessageBox('Out of memory.', nil, mfError or mfOkButton);
end;
var
BGIApp: TBGIApp;
begin
BGIApp.Init;
BGIApp.Run;
BGIApp.Done;
end.