home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 9 / 09.iso / l / l044 / 4.ddi / DOCDEMOS.ZIP / TVGUID11.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1990-10-23  |  6.1 KB  |  243 lines

  1. {************************************************}
  2. {                                                }
  3. {   Turbo Pascal 6.0                             }
  4. {   Demo program from the Turbo Vision Guide     }
  5. {                                                }
  6. {   Copyright (c) 1990 by Borland International  }
  7. {                                                }
  8. {************************************************}
  9.  
  10. program TVGUID11;
  11.  
  12. uses Objects, Drivers, Views, Menus, Dialogs, App;
  13.  
  14. const
  15.   FileToRead        = 'TVGUID11.PAS';
  16.   MaxLines          = 100;
  17.   WinCount: Integer =   0;
  18.   cmFileOpen        = 100;
  19.   cmNewWin          = 101;
  20.   cmNewDialog       = 102;
  21.  
  22. var
  23.   LineCount: Integer;
  24.   Lines: array[0..MaxLines - 1] of PString;
  25.  
  26. type
  27.   TMyApp = object(TApplication)
  28.     procedure HandleEvent(var Event: TEvent); virtual;
  29.     procedure InitMenuBar; virtual;
  30.     procedure InitStatusLine; virtual;
  31.     procedure NewDialog;
  32.     procedure NewWindow;
  33.   end;
  34.  
  35.   PInterior = ^TInterior;
  36.   TInterior = object(TScroller)
  37.     constructor Init(var Bounds: TRect; AHScrollBar,
  38.       AVScrollBar: PScrollBar);
  39.     procedure Draw; virtual;
  40.   end;
  41.  
  42.   PDemoWindow = ^TDemoWindow;
  43.   TDemoWindow = object(TWindow)
  44.     RInterior, LInterior: PInterior;
  45.     constructor Init(Bounds: TRect; WinTitle: String; WindowNo: Word);
  46.     function MakeInterior(Bounds: TRect; Left: Boolean): PInterior;
  47.     procedure SizeLimits(var Min, Max: TPoint); virtual;
  48.   end;
  49.  
  50.   PDemoDialog = ^TDemoDialog;
  51.   TDemoDialog = object(TDialog)
  52.   end;
  53.  
  54. procedure ReadFile;
  55. var
  56.   F: Text;
  57.   S: String;
  58. begin
  59.   LineCount := 0;
  60.   Assign(F, FileToRead);
  61.   {$I-}
  62.   Reset(F);
  63.   {$I+}
  64.   if IOResult <> 0 then
  65.   begin
  66.     Writeln('Cannot open ', FileToRead);
  67.     Halt(1);
  68.   end;
  69.   while not Eof(F) and (LineCount < MaxLines) do
  70.   begin
  71.     Readln(F, S);
  72.     Lines[LineCount] := NewStr(S);
  73.     Inc(LineCount);
  74.   end;
  75.   Close(F);
  76. end;
  77.  
  78. procedure DoneFile;
  79. var
  80.   I: Integer;
  81. begin
  82.   for I := 0 to LineCount - 1 do
  83.     if Lines[I] <> nil then DisposeStr(Lines[i]);
  84. end;
  85.  
  86. { TInterior }
  87. constructor TInterior.Init(var Bounds: TRect; AHScrollBar,
  88.   AVScrollBar: PScrollBar);
  89. begin
  90.   TScroller.Init(Bounds, AHScrollBar, AVScrollBar);
  91.   Options := Options or ofFramed;
  92.   SetLimit(128, LineCount);
  93. end;
  94.  
  95. procedure TInterior.Draw;
  96. var
  97.   Color: Byte;
  98.   I, Y: Integer;
  99.   B: TDrawBuffer;
  100. begin
  101.   Color := GetColor(1);
  102.   for Y := 0 to Size.Y - 1 do
  103.   begin
  104.     MoveChar(B, ' ', Color, Size.X);
  105.     i := Delta.Y + Y;
  106.     if (I < LineCount) and (Lines[I] <> nil) then
  107.       MoveStr(B, Copy(Lines[I]^, Delta.X + 1, Size.X), Color);
  108.     WriteLine(0, Y, Size.X, 1, B);
  109.   end;
  110. end;
  111.  
  112. { TDemoWindow }
  113. constructor TDemoWindow.Init(Bounds: TRect; WinTitle: String; WindowNo: Word);
  114. var
  115.   S: string[3];
  116.   R: TRect;
  117. begin
  118.   Str(WindowNo, S);
  119.   TWindow.Init(Bounds, WinTitle + ' ' + S, wnNoNumber);
  120.   GetExtent(Bounds);
  121.   R.Assign(Bounds.A.X, Bounds.A.Y, Bounds.B.X div 2 + 1, Bounds.B.Y);
  122.   LInterior := MakeInterior(R, True);
  123.   LInterior^.GrowMode := gfGrowHiY;
  124.   Insert(Linterior);
  125.   R.Assign(Bounds.B.X div 2, Bounds.A.Y, Bounds.B.X, Bounds.B.Y);
  126.   RInterior := MakeInterior(R,False);
  127.   RInterior^.GrowMode := gfGrowHiX + gfGrowHiY;
  128.   Insert(RInterior);
  129. end;
  130.  
  131. function TDemoWindow.MakeInterior(Bounds: TRect; Left: Boolean): PInterior;
  132. var
  133.   HScrollBar, VScrollBar: PScrollBar;
  134.   R: TRect;
  135. begin
  136.   R.Assign(Bounds.B.X-1, Bounds.A.Y+1, Bounds.B.X, Bounds.B.Y-1);
  137.   VScrollBar := New(PScrollBar, Init(R));
  138.   VScrollBar^.Options := VScrollBar^.Options or ofPostProcess;
  139.   if Left then VScrollBar^.GrowMode := gfGrowHiY;
  140.   Insert(VScrollBar);
  141.   R.Assign(Bounds.A.X+2, Bounds.B.Y-1, Bounds.B.X-2, Bounds.B.Y);
  142.   HScrollBar := New(PScrollBar, Init(R));
  143.   HScrollBar^.Options := HScrollBar^.Options or ofPostProcess;
  144.   if Left then HScrollBar^.GrowMode := gfGrowHiY + gfGrowLoY;
  145.   Insert(HScrollBar);
  146.   Bounds.Grow(-1,-1);
  147.   MakeInterior := New(PInterior, Init(Bounds, HScrollBar, VScrollBar));
  148. end;
  149.  
  150. procedure TDemoWindow.SizeLimits(var Min, Max: TPoint);
  151. var R: TRect;
  152. begin
  153.   TWindow.SizeLimits(Min, Max);
  154.   Min.X := LInterior^.Size.X + 9;
  155. end;
  156.  
  157. { TMyApp }
  158. procedure TMyApp.HandleEvent(var Event: TEvent);
  159. begin
  160.   TApplication.HandleEvent(Event);
  161.   if Event.What = evCommand then
  162.   begin
  163.     case Event.Command of
  164.       cmNewWin: NewWindow;
  165.       cmNewDialog: NewDialog;
  166.     else
  167.       Exit;
  168.     end;
  169.     ClearEvent(Event);
  170.   end;
  171. end;
  172.  
  173. procedure TMyApp.InitMenuBar;
  174. var R: TRect;
  175. begin
  176.   GetExtent(R);
  177.   R.B.Y := R.A.Y + 1;
  178.   MenuBar := New(PMenuBar, Init(R, NewMenu(
  179.     NewSubMenu('~F~ile', hcNoContext, NewMenu(
  180.       NewItem('~O~pen', 'F3', kbF3, cmFileOpen, hcNoContext,
  181.       NewItem('~N~ew', 'F4', kbF4, cmNewWin, hcNoContext,
  182.       NewLine(
  183.       NewItem('E~x~it', 'Alt-X', kbAltX, cmQuit, hcNoContext,
  184.       nil))))),
  185.     NewSubMenu('~W~indow', hcNoContext, NewMenu(
  186.       NewItem('~N~ext', 'F6', kbF6, cmNext, hcNoContext,
  187.       NewItem('~Z~oom', 'F5', kbF5, cmZoom, hcNoContext,
  188.       NewItem('~D~ialog', 'F2', kbF2, cmNewDialog, hcNoContext,
  189.       nil)))),
  190.     nil))
  191.   )));
  192. end;
  193.  
  194. procedure TMyApp.InitStatusLine;
  195. var R: TRect;
  196. begin
  197.   GetExtent(R);
  198.   R.A.Y := R.B.Y - 1;
  199.   StatusLine := New(PStatusLine, Init(R,
  200.     NewStatusDef(0, $FFFF,
  201.       NewStatusKey('', kbF10, cmMenu,
  202.       NewStatusKey('~Alt-X~ Exit', kbAltX, cmQuit,
  203.       NewStatusKey('~F4~ New', kbF4, cmNewWin,
  204.       NewStatusKey('~Alt-F3~ Close', kbAltF3, cmClose,
  205.       nil)))),
  206.     nil)
  207.   ));
  208. end;
  209.  
  210. procedure TMyApp.NewDialog;
  211. var
  212.   Dialog: PDemoDialog;
  213.   R: TRect;
  214. begin
  215.   R.Assign(0, 0, 40, 13);
  216.   R.Move(Random(39), Random(10));
  217.   Dialog := New(PDemoDialog, Init(R, 'Demo Dialog'));
  218.   DeskTop^.Insert(Dialog);
  219. end;
  220.  
  221. procedure TMyApp.NewWindow;
  222. var
  223.   Window: PDemoWindow;
  224.   R: TRect;
  225. begin
  226.   Inc(WinCount);
  227.   R.Assign(0, 0, 45, 13);
  228.   R.Move(Random(34), Random(11));
  229.   Window := New(PDemoWindow, Init(R, 'Demo Window', WinCount));
  230.   DeskTop^.Insert(Window);
  231. end;
  232.  
  233. var
  234.   MyApp: TMyApp;
  235.  
  236. begin
  237.   ReadFile;
  238.   MyApp.Init;
  239.   MyApp.Run;
  240.   MyApp.Done;
  241.   DoneFile;
  242. end.
  243.