home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Lion Share
/
lionsharecd.iso
/
dos_misc
/
holmes.zip
/
HOLMES.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1992-04-27
|
8KB
|
295 lines
program Holmes;
uses Objects, Drivers, Views, Menus, App;
const
MaxLines = 11000;
WinCount: Integer = 0;
cmChapter1_1 = 101;
cmChapter1_2 = 102;
cmChapter1_3 = 103;
cmChapter1_4 = 104;
cmChapter1_5 = 105;
cmChapter1_6 = 106;
cmChapter1_7 = 107;
cmChapter2_1 = 108;
cmChapter2_2 = 109;
cmChapter2_3 = 110;
cmChapter2_4 = 111;
cmChapter2_5 = 112;
cmChapter2_6 = 113;
cmChapter2_7 = 114;
cmAbout = 115;
var
LineCount: Integer;
Lines: array[0..MaxLines - 1] of PString;
type
TMyApp = object(TApplication)
procedure HandleEvent(var Event: TEvent); virtual;
procedure InitMenuBar; virtual;
procedure InitStatusLine; virtual;
procedure NewWindow;
end;
PInterior = ^TInterior;
TInterior = object(TScroller)
constructor Init(var Bounds: TRect; AHScrollBar,
AVScrollBar: PScrollBar);
procedure Draw; virtual;
end;
PDemoWindow = ^TDemoWindow;
TDemoWindow = object(TWindow)
constructor Init(Bounds: TRect; WinTitle: String; WindowNo: Word);
procedure MakeInterior(Bounds: TRect);
end;
procedure ReadFile (FileToRead : string);
var
F: Text;
S: String;
begin
LineCount := 0;
Assign(F, FileToRead);
{$I-}
Reset(F);
{$I+}
if IOResult <> 0 then
begin
Writeln('Cannot open ', FileToRead);
Halt(1);
end;
while not Eof(F) and (LineCount < MaxLines) do
begin
Readln(F, S);
Lines[LineCount] := NewStr(S);
Inc(LineCount);
end;
Close(F);
end;
procedure DoneFile;
var
I: Integer;
begin
for I := 0 to LineCount - 1 do
if Lines[I] <> nil then DisposeStr(Lines[i]);
end;
{ TInterior }
constructor TInterior.Init(var Bounds: TRect; AHScrollBar,
AVScrollBar: PScrollBar);
begin
TScroller.Init(Bounds, AHScrollBar, AVScrollBar);
GrowMode := gfGrowHiX + gfGrowHiY;
Options := Options or ofFramed;
SetLimit(128, LineCount);
end;
procedure TInterior.Draw;
var
Color: Byte;
I, Y: Integer;
B: TDrawBuffer;
begin
Color := GetColor(1);
for Y := 0 to Size.Y - 1 do
begin
MoveChar(B, ' ', Color, Size.X);
i := Delta.Y + Y;
if (I < LineCount) and (Lines[I] <> nil) then
MoveStr(B, Copy(Lines[I]^, Delta.X + 1, Size.X), Color);
WriteLine(0, Y, Size.X, 1, B);
end;
end;
{ TDemoWindow }
constructor TDemoWindow.Init(Bounds: TRect; WinTitle: String;
WindowNo: Word);
var
S: string[3];
begin
Str(WindowNo, S);
TWindow.Init(Bounds, WinTitle + ' ' + S, wnNoNumber);
MakeInterior(Bounds);
end;
procedure TDemoWindow.MakeInterior(Bounds: TRect);
var
HScrollBar, VScrollBar: PScrollBar;
Interior: PInterior;
R: TRect;
begin
VScrollBar := StandardScrollBar(sbVertical + sbHandleKeyboard);
HScrollBar := StandardScrollBar(sbHorizontal + sbHandleKeyboard);
GetExtent(Bounds);
Bounds.Grow(-1,-1);
Interior := New(PInterior, Init(Bounds, HScrollBar, VScrollBar));
Insert(Interior);
end;
{ TMyApp }
procedure TMyApp.HandleEvent(var Event: TEvent);
begin
TApplication.HandleEvent(Event);
if Event.What = evCommand then
begin
case Event.Command of
cmAbout : BEGIN
ReadFile ('ABOUT.TXT');
WinCount := 0;
NewWindow;
END;
cmChapter1_1: BEGIN
ReadFile ('STUDY11.TXT');
WinCount := 1;
NewWindow;
END;
cmChapter1_2: BEGIN
ReadFile ('STUDY12.TXT');
WinCount := 2;
NewWindow;
END;
cmChapter1_3: BEGIN
ReadFile ('STUDY13.TXT');
WinCount := 3;
NewWindow;
END;
cmChapter1_4: BEGIN
ReadFile ('STUDY14.TXT');
WinCount := 4;
NewWindow;
END;
cmChapter1_5: BEGIN
ReadFile ('STUDY15.TXT');
WinCount := 5;
NewWindow;
END;
cmChapter1_6: BEGIN
ReadFile ('STUDY16.TXT');
WinCount := 6;
NewWindow;
END;
cmChapter1_7: BEGIN
ReadFile ('STUDY17.TXT');
WinCount := 7;
NewWindow;
END;
cmChapter2_1: BEGIN
ReadFile ('STUDY21.TXT');
WinCount := 1;
NewWindow;
END;
cmChapter2_2: BEGIN
ReadFile ('STUDY22.TXT');
WinCount := 2;
NewWindow;
END;
cmChapter2_3: BEGIN
ReadFile ('STUDY23.TXT');
WinCount := 3;
NewWindow;
END;
cmChapter2_4: BEGIN
ReadFile ('STUDY24.TXT');
WinCount := 4;
NewWindow;
END;
cmChapter2_5: BEGIN
ReadFile ('STUDY25.TXT');
WinCount := 5;
NewWindow;
END;
cmChapter2_6: BEGIN
ReadFile ('STUDY26.TXT');
WinCount := 6;
NewWindow;
END;
cmChapter2_7: BEGIN
ReadFile ('STUDY27.TXT');
WinCount := 7;
NewWindow;
END;
else
Exit;
end;
ClearEvent(Event);
end;
end;
procedure TMyApp.InitMenuBar;
var R: TRect;
begin
GetExtent(R);
R.B.Y := R.A.Y + 1;
MenuBar := New(PMenuBar, Init(R, NewMenu(
NewSubMenu('~I~nfo ', hcNoContext, NewMenu(
NewItem('~A~ Study in Scarlet', '', kbNoKey, cmAbout, hcNoContext,
NewLine(
NewItem('E~x~it', '', kbAltX, cmQuit, hcNoContext, nil)))),
NewSubMenu(' Part ~1~ ', hcNoContext, NewMenu(
NewItem('Chapter ~1~', '', kbNoKey, cmChapter1_1, hcNoContext,
NewItem('Chapter ~2~', '', kbNoKey, cmChapter1_2, hcNoContext,
NewItem('Chapter ~3~', '', kbNoKey, cmChapter1_3, hcNoContext,
NewItem('Chapter ~4~', '', kbNoKey, cmChapter1_4, hcNoContext,
NewItem('Chapter ~5~', '', kbNoKey, cmChapter1_5, hcNoContext,
NewItem('Chapter ~6~', '', kbNoKey, cmChapter1_6, hcNoContext,
NewItem('Chapter ~7~', '', kbNoKey, cmChapter1_7, hcNoContext,
nil)))))))),
NewSubMenu(' Part ~2~ ', hcNoContext, NewMenu(
NewItem('Chapter ~1~', '', kbNoKey, cmChapter2_1, hcNoContext,
NewItem('Chapter ~2~', '', kbNoKey, cmChapter2_2, hcNoContext,
NewItem('Chapter ~3~', '', kbNoKey, cmChapter2_3, hcNoContext,
NewItem('Chapter ~4~', '', kbNoKey, cmChapter2_4, hcNoContext,
NewItem('Chapter ~5~', '', kbNoKey, cmChapter2_5, hcNoContext,
NewItem('Chapter ~6~', '', kbNoKey, cmChapter2_6, hcNoContext,
NewItem('Chapter ~7~', '', kbNoKey, cmChapter2_7, hcNoContext,
nil)))))))),
NewSubMenu(' ~W~indows ', hcNoContext, NewMenu(
NewItem('~R~esize/move','Ctrl-F5', kbCtrlF5, cmResize, hcNoContext,
NewItem('~Z~oom', 'F5', kbF5, cmZoom, hcNoContext,
NewItem('~N~ext', 'F6', kbF6, cmNext, hcNoContext,
NewItem('~C~lose', 'Alt-F3', kbAltF3, cmClose, hcNoContext,
nil))))),
nil))
)))));
end;
procedure TMyApp.InitStatusLine;
var R: TRect;
begin
GetExtent(R);
R.A.Y := R.B.Y - 1;
StatusLine := New(PStatusLine, Init(R,
NewStatusDef(0, $FFFF,
NewStatusKey('', kbF10, cmMenu,
NewStatusKey('~Alt-X~ Exit', kbAltX, cmQuit,
NewStatusKey('~Alt-F3~ Close', kbAltF3, cmClose,
nil))),
nil)
));
end;
procedure TMyApp.NewWindow;
var
Window: PDemoWindow;
R: TRect;
begin
R.Assign(0, 0, 80, 23);
Window := New(PDemoWindow, Init(R, 'Chapter', WinCount));
DeskTop^.Insert(Window);
end;
var
MyApp: TMyApp;
begin
MyApp.Init;
MyApp.Run;
MyApp.Done;
DoneFile;
end.