home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 21 / CD_ASCQ_21_040595.iso / dos / prg / pas / tvgr70 / tinydemo.pas < prev    next >
Pascal/Delphi Source File  |  1994-09-23  |  6KB  |  227 lines

  1. {***************************************}
  2. {                                       }
  3. {     TVGraphic Library TINYDEMO.PAS    }
  4. {        RICHARD P. ANDRESEN            }
  5. {                                       }
  6. {***************************************}
  7.  
  8. {This demo program illustrates the use of the TVGraphic library.
  9.  It is part of the documentation of TVGraphic.
  10.  
  11. This program is a very simple TVGraphic program.
  12.  
  13. NOTE that in TVGraphic, your Application descends
  14.     from TProgram, not TApplication!
  15.  
  16. See TVGDemo1 for a full featured demo program.
  17.  
  18. Note: You should replace the default DOS critical error handling
  19. routine (which always returns "Abort") for any program you will use
  20. alot or distribute.  See TVGDemo1.
  21.  
  22. }
  23.  
  24. program TinyDemo;
  25.  
  26. {$F+,X+,V-}    {+X - use Extended syntax so can call a function as if
  27.                   it were a procedure.}
  28.  
  29. uses DOS, Memory, MyGraph, GObjects, GDrivers,
  30.      MCursor, GMenus,
  31.      GViews,  GDialogs, GMsgBox, GStdDlg,
  32.      GApp, GWindow, GHistLst;
  33.  
  34. const
  35.   ProgName = 'TinyDemo';
  36.   Ver      = '2.00';
  37.  
  38.   WinNum : integer = 0;
  39.   cmVersion        = 1116;
  40.  
  41. var
  42.   OldExitProc : Pointer;  { Saves exit procedure address }
  43.   Graphic  : boolean;     { true if screen is in graphic mode }
  44.  
  45.  
  46. procedure GExitProc; far;     {must be Far}
  47.   {Exit procedure - restore screen to text mode if program halts}
  48. begin
  49.   ExitProc := OldExitProc; { Restore exit procedure address }
  50.   CloseGraph;              { Shut down the graphics system }
  51. end;
  52.  
  53.  
  54. {--------------------------------}
  55. type
  56.   TDemoApp = object(TProgram)
  57.     constructor Init;
  58.     destructor Done; virtual;
  59.     procedure HandleEvent(var Event: TEvent); virtual;
  60.     procedure InitMenuBar; virtual;
  61.     procedure InitStatusLine; virtual;
  62.     procedure IntroScreen;
  63.   end;
  64.  
  65.  
  66. constructor TDemoApp.Init;
  67. var
  68.   GraphDriver,GraphMode,ErrorCode : integer;
  69. begin
  70.   Graphic := false;         {do first}
  71.  
  72.   InitMemory;
  73.   InitVideo;
  74.   InitEvents;
  75.   InitSysError;
  76.   InitHistory;
  77.  
  78.      {register linked in EGA/VGA screen driver}
  79.   RegisterBGIdriver(@EGAVGADriverProc);
  80.  
  81.   GraphDriver := Detect;                { use autodetection }
  82.      {verify graphics mode}
  83.   DetectGraph(GraphDriver, GraphMode);
  84.   if not ((GraphDriver = VGA) or (GraphDriver = EGA)) then begin
  85.     Done;
  86.     Writeln('Error - system does not support EGA or VGA graphics.');
  87.     Halt(1);
  88.   end;
  89.  
  90.     {enter graphics mode}
  91.   if GraphDriver = VGA then GraphMode := VGAHi
  92.     else GraphMode := EGAHi;
  93.   InitGraph(GraphDriver,GraphMode,'');
  94.  
  95.   ErrorCode := GraphResult;
  96.   if ErrorCode <> grOK then begin
  97.     Done;
  98.     Writeln('Graphics Error: ',GraphErrorMsg(ErrorCode));
  99.     Halt(1);
  100.   end
  101.   else begin
  102.           {install exit proc to Close graphics}
  103.     OldExitProc := ExitProc;                { save previous exit proc }
  104.     ExitProc := @GExitProc;                { insert our exit proc in chain }
  105.     Graphic := true;
  106.           {install graphic mode DOS critical error handler}
  107.     (* SysErrorFunc := GSystemError; *)
  108.           {improves look of dark gray and brown on VGA monitors,
  109.            no effect in EGA}
  110.     ImprovePaletteColors;
  111.   end;
  112.  
  113.  
  114.   TProgram.Init;   {MCur mouse initialized in TProgram.Init}
  115.       {sets default Viewport to just cover the DeskTop.
  116.        The MainMenu,MessageBar and StatusLine temporarily
  117.        reset Viewport when they draw themselves.}
  118.  
  119.  
  120.       {following items may be different for your program}
  121.  
  122.   MCur.SetSpeed(12,12);  {how fast cursor moves, "normal" is 8,8}
  123.   DoubleDelay := 6;   {time between mouse button presses for double press}
  124.                       {TV uses 8 - very slow}
  125.  
  126.   IntroScreen;
  127. end;
  128.  
  129. destructor TDemoApp.Done;
  130. begin
  131.   if Graphic then begin
  132.     TProgram.Done;         {calls MCur.Done}
  133.     CloseGraph;
  134.     Graphic := false;
  135.   end;
  136.  
  137.   DoneHistory;
  138.   DoneSysError;
  139.   DoneEvents;
  140.   DoneVideo;
  141.   DoneMemory;
  142. end;
  143.  
  144. procedure TDemoApp.HandleEvent(var Event: TEvent);
  145.   procedure ShowVersion;
  146.   var Cmd : integer;
  147.   begin
  148.     Cmd := MessageBox(^C'TVGraphic '+ProgName+' ver '+Ver,
  149.       nil, mfInformation+mfOKButton);
  150.   end;
  151.  
  152. var
  153.   PDir,FInputBox : PView;
  154.   Cmd : integer;
  155. begin
  156.   TProgram.HandleEvent(Event);    {usual call to ancestor method}
  157.  
  158.   if Event.What = evCommand then
  159.   begin
  160.     case Event.Command of
  161.       cmOpen:
  162.         begin
  163.           FInputBox := New(PFileDialog, Init('*.*', 'OPEN A FILE', '~N~ame', fdOpenButton,0));
  164.           Cmd := DeskTop^.ExecView(FInputBox);
  165.           Dispose(FInputBox, Done);
  166.         end;
  167.       cmChangeDir:
  168.         begin
  169.           PDir := New(PChDirDialog, Init(cdNormal {+ cdHelpButton},0));
  170.           Cmd := DeskTop^.ExecView(PDir);
  171.           Dispose(PDir, Done);
  172.         end;
  173.       cmVersion      : ShowVersion;
  174.     end;
  175.   end;
  176. end;
  177.  
  178. procedure TDemoApp.InitMenuBar;
  179. var
  180.   R: TRect;
  181. begin
  182.   GetExtent(R);
  183.   MenuBar := New(PMenuBar, Init(R, NewMenu(
  184.     NewSubMenu('~F~ile', hcNoContext, NewMenu(
  185.       NewItem('~O~pen...', 'F3', kbF3, cmOpen, hcOpen,
  186.       NewLine(
  187.       NewItem('~C~hange dir...', '', kbNoKey, cmChangeDir, hcChangeDir,
  188.       NewItem('E~x~it', 'Alt+X', kbAltX, cmQuit, hcExit,
  189.       nil))))),
  190.     NewSubMenu('~I~nfo', hcNoContext, NewMenu(
  191.       NewItem('~V~ersion #', '', kbNoKey, cmVersion, hcNoContext,
  192.       nil)),
  193.     nil))
  194.   )));
  195. end;
  196.  
  197. procedure TDemoApp.InitStatusLine;
  198. var
  199.   R: TRect;
  200. begin
  201.   GetExtent(R);
  202.   R.A.Y := R.B.Y - Boxheight+2;
  203.   StatusLine :=   New(PStatusLine, Init(R,
  204.     NewStatusDef(0, $FFFF,
  205.       NewStatusKey('~F6~ Next', kbF6, cmNext,
  206.       NewStatusKey('~Shift+F6~ Prev', kbShiftF6, cmPrev,
  207.       NewStatusKey('~Alt-X~ Exit', kbAltX, cmQuit,
  208.       (nil)))),
  209.        nil)));
  210.   StatusLine^.VFont := font8x8;  {select smaller font}
  211. end;
  212.  
  213. procedure TDemoApp.IntroScreen;
  214.    {^C centers following text. ^M advances to next line}
  215. begin
  216.   MessageBox(^C'HELLO'^M^M^C+ProgName, nil, mfInformation + mfOKButton);
  217. end;
  218.  
  219.  
  220. var
  221.   DemoApp: TDemoApp;
  222. begin
  223.   DemoApp.Init;
  224.   DemoApp.Run;
  225.   DemoApp.Done;
  226. end.
  227.