home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / Pascal / TP.7_1 / TP / EXAMPLES / DOCDEMOS / TUTOR11B.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1992-10-05  |  10.9 KB  |  437 lines

  1. {************************************************}
  2. {                                                }
  3. {   Turbo Vision 2.0 Demo                        }
  4. {   Copyright (c) 1992 by Borland International  }
  5. {                                                }
  6. {************************************************}
  7.  
  8. program Tutor11b;
  9.  
  10. uses Memory, TutConst, Drivers, Objects, Views, Menus, App, Dialogs,
  11.   Editors, StdDlg, Validate;
  12.  
  13. type
  14.   POrder = ^TOrder;
  15.   TOrder = record
  16.     OrderNum: string[8];
  17.     OrderDate: string[8];
  18.     StockNum: string[8];
  19.     Quantity: string[5];
  20.     Payment, Received, MemoLen: Word;
  21.     MemoText: array[0..255] of Char;
  22.   end;
  23.  
  24.   POrderObj = ^TOrderObj;
  25.   TOrderObj = object(TObject)
  26.     TransferRecord: TOrder;
  27.     constructor Load(var S: TStream);
  28.     procedure Store(var S: TStream);
  29.   end;
  30.  
  31.   POrderWindow = ^TOrderWindow;
  32.   TOrderWindow = object(TDialog)
  33.     constructor Init;
  34.     destructor Done; virtual;
  35.     procedure HandleEvent(var Event: TEvent); virtual;
  36.   end;
  37.  
  38.   TTutorApp = object(TApplication)
  39.     ClipboardWindow: PEditWindow;
  40.     OrderWindow: POrderWindow;
  41.     constructor Init;
  42.     destructor Done; virtual;
  43.     procedure DoAboutBox;
  44.     procedure HandleEvent(var Event: TEvent); virtual;
  45.     procedure InitMenuBar; virtual;
  46.     procedure InitStatusLine; virtual;
  47.     procedure LoadDesktop;
  48.     procedure NewWindow;
  49.     procedure OpenOrderWindow;
  50.     procedure OpenWindow;
  51.     procedure SaveDesktop;
  52.     procedure SaveOrderData;
  53.     procedure ShowOrder(AOrderNum: Integer);
  54.   end;
  55.  
  56. var
  57.   ResFile: TResourceFile;
  58.   OrderInfo: TOrder;
  59.   OrderColl: PCollection;
  60.   CurrentOrder: Integer;
  61.  
  62. const
  63.   ROrderObj: TStreamRec = (
  64.      ObjType: 15000;
  65.      VmtLink: Ofs(TypeOf(TOrderObj)^);
  66.      Load:    @TOrderObj.Load;
  67.      Store:   @TOrderObj.Store
  68.   );
  69.  
  70.  
  71. procedure TutorStreamError(var S: TStream); far;
  72. var
  73.   ErrorMessage: String;
  74. begin
  75.   case S.Status of
  76.     stError: ErrorMessage := 'Stream access error';
  77.     stInitError: ErrorMessage := 'Cannot initialize stream';
  78.     stReadError: ErrorMessage := 'Read beyond end of stream';
  79.     stWriteError: ErrorMessage := 'Cannot expand stream';
  80.     stGetError: ErrorMessage := 'Unregistered type read from stream';
  81.     stPutError: ErrorMessage := 'Unregistered type written to stream';
  82.     end;
  83.   DoneVideo;
  84.   PrintStr('Error: ' + ErrorMessage);
  85.   Halt(Abs(S.Status));
  86. end;
  87.  
  88. procedure LoadOrders;
  89. var
  90.   OrderFile: TBufStream;
  91. begin
  92.   OrderFile.Init('ORDERS.DAT', stOpenRead, 1024);
  93.   OrderColl := PCollection(OrderFile.Get);
  94.   OrderFile.Done;
  95. end;
  96.  
  97. procedure SaveOrders;
  98. var
  99.   OrderFile: TBufStream;
  100. begin
  101.   OrderFile.Init('ORDERS.DAT', stOpenWrite, 1024);
  102.   OrderFile.Put(OrderColl);
  103.   OrderFile.Done;
  104. end;
  105.  
  106. constructor TOrderObj.Load(var S: TStream);
  107. begin
  108.   inherited Init;
  109.   S.Read(TransferRecord, SizeOf(TransferRecord));
  110. end;
  111.  
  112. procedure TOrderObj.Store(var S: TStream);
  113. begin
  114.   S.Write(TransferRecord, SizeOf(TransferRecord));
  115. end;
  116.  
  117. constructor TOrderWindow.Init;
  118. var
  119.   R: TRect;
  120.   Field: PInputLine;
  121.   Cluster: PCluster;
  122.   Memo: PMemo;
  123. begin
  124.   R.Assign(0, 0, 60, 17);
  125.   inherited Init(R, 'Orders');
  126.   Options := Options or ofCentered;
  127.   HelpCtx := $F000;
  128.  
  129.   R.Assign(13, 2, 23, 3);
  130.   Field := New(PInputLine, Init(R, 8));
  131.   Field^.SetValidator(New(PRangeValidator, Init(1, 99999)));
  132.   Insert(Field);
  133.   R.Assign(2, 2, 12, 3);
  134.   Insert(New(PLabel, Init(R, '~O~rder #:', Field)));
  135.  
  136.   R.Assign(43, 2, 53, 3);
  137.   Field := New(PInputLine, Init(R, 8));
  138.   Field^.SetValidator(New(PPXPictureValidator,
  139.     Init('{#[#]}/{#[#]}/{##[##]}', True)));
  140.   Insert(Field);
  141.   R.Assign(26, 2, 41, 3);
  142.   Insert(New(PLabel, Init(R, '~D~ate of order:', Field)));
  143.  
  144.   R.Assign(13, 4, 23, 5);
  145.   Field := New(PInputLine, Init(R, 8));
  146.   Field^.SetValidator(New(PPXPictureValidator, Init('&&&-####', True)));
  147.   Insert(Field);
  148.   R.Assign(2, 4, 12, 5);
  149.   Insert(New(PLabel, Init(R, '~S~tock #:', Field)));
  150.  
  151.   R.Assign(46, 4, 53, 5);
  152.   Field := New(PInputLine, Init(R, 5));
  153.   Field^.SetValidator(New(PRangeValidator, Init(1, 99999)));
  154.   Insert(Field);
  155.   R.Assign(26, 4, 44, 5);
  156.   Insert(New(PLabel, Init(R, '~Q~uantity ordered:', Field)));
  157.  
  158.   R.Assign(3, 7, 57, 8);
  159.   Cluster := New(PRadioButtons, Init(R,
  160.     NewSItem('Cash   ',
  161.     NewSItem('Check  ',
  162.     NewSItem('P.O.   ',
  163.     NewSItem('Account', nil))))));
  164.   Insert(Cluster);
  165.   R.Assign(2, 6, 21, 7);
  166.   Insert(New(PLabel, Init(R, '~P~ayment method:', Cluster)));
  167.  
  168.   R.Assign(22, 8, 37, 9);
  169.   Cluster := New(PCheckBoxes, Init(R, NewSItem('~R~eceived', nil)));
  170.   Insert(Cluster);
  171.  
  172.   R.Assign(3, 10, 57, 13);
  173.   Memo := New(PMemo, Init(R, nil, nil, nil, 255));
  174.   Insert(Memo);
  175.   R.Assign(2, 9, 9, 10);
  176.   Insert(New(PLabel, Init(R, 'Notes:', Memo)));
  177.  
  178.   R.Assign(2, 14, 12, 16);
  179.   Insert(New(PButton, Init(R, '~N~ew', cmOrderNew, bfNormal)));
  180.   R.Assign(13, 14, 23, 16);
  181.   Insert(New(PButton, Init(R, '~S~ave', cmOrderSave, bfDefault)));
  182.   R.Assign(24, 14, 34, 16);
  183.   Insert(New(PButton, Init(R, 'Re~v~ert', cmOrderCancel, bfNormal)));
  184.   R.Assign(35, 14, 45, 16);
  185.   Insert(New(PButton, Init(R, 'N~e~xt', cmOrderNext, bfNormal)));
  186.   R.Assign(46, 14, 56, 16);
  187.   Insert(New(PButton, Init(R, '~P~rev', cmOrderPrev, bfNormal)));
  188.   SelectNext(False);
  189. end;
  190.  
  191. destructor TOrderWindow.Done;
  192. begin
  193.   DisableCommands([cmOrderNext, cmOrderPrev, cmOrderSave]);
  194.   inherited Done;
  195. end;
  196.  
  197. procedure TOrderWindow.HandleEvent(var Event: TEvent);
  198. begin
  199.   inherited HandleEvent(Event);
  200.   if (Event.What = evBroadcast) and
  201.     (Event.Command = cmFindOrderWindow) then
  202.     ClearEvent(Event);
  203. end;
  204.  
  205. constructor TTutorApp.Init;
  206. var
  207.   R: TRect;
  208. begin
  209.   MaxHeapSize := 8192;
  210.   EditorDialog := StdEditorDialog;
  211.   StreamError := @TutorStreamError;
  212.   RegisterMenus;
  213.   RegisterObjects;
  214.   RegisterViews;
  215.   RegisterApp;
  216.   RegisterEditors;
  217.   RegisterDialogs;
  218.   RegisterValidate;
  219.   RegisterType(ROrderObj);
  220.   ResFile.Init(New(PBufStream, Init('TUTORIAL.TVR', stOpenRead, 1024)));
  221.   inherited Init;
  222.   DisableCommands([cmStockWin, cmSupplierWin]);
  223.   Desktop^.GetExtent(R);
  224.   ClipboardWindow := New(PEditWindow, Init(R, '', wnNoNumber));
  225.   if ValidView(ClipboardWindow) <> nil then
  226.   begin
  227.     ClipboardWindow^.Hide;
  228.     InsertWindow(ClipboardWindow);
  229.     Clipboard := ClipboardWindow^.Editor;
  230.     Clipboard^.CanUndo := False;
  231.   end;
  232.   LoadOrders;
  233.   CurrentOrder := 0;
  234.   OrderInfo := POrderObj(OrderColl^.At(CurrentOrder))^.TransferRecord;
  235.   DisableCommands([cmOrderNext, cmOrderPrev, cmOrderCancel, cmOrderSave]);
  236. end;
  237.  
  238. destructor TTutorApp.Done;
  239. begin
  240.   ResFile.Done;
  241.   inherited Done;
  242. end;
  243.  
  244. procedure TTutorApp.DoAboutBox;
  245. begin
  246.   ExecuteDialog(PDialog(ResFile.Get('ABOUTBOX')), nil);
  247. end;
  248.  
  249. procedure TTutorApp.HandleEvent(var Event: TEvent);
  250. var
  251.   R: TRect;
  252. begin
  253.   inherited HandleEvent(Event);
  254.   if Event.What = evCommand then
  255.   begin
  256.     case Event.Command of
  257.       cmOrderNext:
  258.         begin
  259.           ShowOrder(CurrentOrder + 1);
  260.           ClearEvent(Event);
  261.         end;
  262.       cmOrderPrev:
  263.         begin
  264.           ShowOrder(CurrentOrder - 1);
  265.           ClearEvent(Event);
  266.         end;
  267.       cmOrderSave:
  268.         begin
  269.           SaveOrderData;
  270.           ClearEvent(Event);
  271.         end;
  272.       cmOrderWin:
  273.         begin
  274.           OpenOrderWindow;
  275.           ClearEvent(Event);
  276.         end;
  277.       cmOptionsLoad:
  278.         begin
  279.           LoadDesktop;
  280.           ClearEvent(Event);
  281.         end;
  282.       cmOptionsSave:
  283.         begin
  284.           SaveDesktop;
  285.           ClearEvent(Event);
  286.         end;
  287.       cmClipShow:
  288.         with ClipboardWindow^ do
  289.         begin
  290.           Select;
  291.           Show;
  292.           ClearEvent(Event);
  293.         end;
  294.       cmNew:
  295.         begin
  296.           NewWindow;
  297.           ClearEvent(Event);
  298.         end;
  299.       cmOpen:
  300.         begin
  301.           OpenWindow;
  302.           ClearEvent(Event);
  303.         end;
  304.       cmOptionsVideo:
  305.         begin
  306.           SetScreenMode(ScreenMode xor smFont8x8);
  307.           ClearEvent(Event);
  308.         end;
  309.       cmAbout:
  310.         begin
  311.           DoAboutBox;
  312.           ClearEvent(Event);
  313.         end;
  314.     end;
  315.   end;
  316. end;
  317.  
  318. procedure TTutorApp.InitMenuBar;
  319. begin
  320.   MenuBar := PMenuBar(ResFile.Get('MAINMENU'));
  321. end;
  322.  
  323. procedure TTutorApp.InitStatusLine;
  324. var
  325.   R: TRect;
  326. begin
  327.   StatusLine := PStatusLine(ResFile.Get('STATUS'));
  328.   GetExtent(R);
  329.   StatusLine^.MoveTo(0, R.B.Y - 1);
  330. end;
  331.  
  332. procedure TTutorApp.LoadDesktop;
  333. var
  334.   DesktopFile: TBufStream;
  335.   TempDesktop: PDesktop;
  336.   R: TRect;
  337. begin
  338.   DesktopFile.Init('DESKTOP.TUT', stOpenRead, 1024);
  339.   TempDesktop := PDesktop(DesktopFile.Get);
  340.   DesktopFile.Done;
  341.   if ValidView(TempDesktop) <> nil then
  342.   begin
  343.     Desktop^.Delete(ClipboardWindow);
  344.     Delete(Desktop);
  345.     Dispose(Desktop, Done);
  346.     Desktop := TempDesktop;
  347.     Insert(Desktop);
  348.     GetExtent(R);
  349.     R.Grow(0, -1);
  350.     Desktop^.Locate(R);
  351.     InsertWindow(ClipboardWindow);
  352.   end;
  353. end;
  354.  
  355. procedure TTutorApp.NewWindow;
  356. var
  357.   R: TRect;
  358.   TheWindow: PEditWindow;
  359. begin
  360.   R.Assign(0, 0, 60, 20);
  361.   TheWindow := New(PEditWindow, Init(R, '', wnNoNumber));
  362.   InsertWindow(TheWindow);
  363. end;
  364.  
  365. procedure TTutorApp.OpenOrderWindow;
  366. begin
  367.   if Message(Desktop, evBroadcast, cmFindOrderWindow, nil) = nil then
  368.   begin
  369.     OrderWindow := New(POrderWindow, Init);
  370.     InsertWindow(OrderWindow);
  371.   end
  372.   else
  373.     if PView(OrderWindow) <> Desktop^.TopView then OrderWindow^.Select;
  374.   ShowOrder(0);
  375. end;
  376.  
  377. procedure TTutorApp.OpenWindow;
  378. var
  379.   R: TRect;
  380.   FileDialog: PFileDialog;
  381.   TheFile: FNameStr;
  382. const
  383.   FDOptions: Word = fdOKButton or fdOpenButton;
  384. begin
  385.   TheFile := '*.*';
  386.   New(FileDialog, Init(TheFile, 'Open file', '~F~ile name',
  387.     FDOptions, 1));
  388.   if ExecuteDialog(FileDialog, @TheFile) <> cmCancel then
  389.   begin
  390.     R.Assign(0, 0, 75, 20);
  391.     InsertWindow(New(PEditWindow, Init(R, TheFile, wnNoNumber)));
  392.   end;
  393. end;
  394.  
  395. procedure TTutorApp.SaveDesktop;
  396. var
  397.   DesktopFile: TBufStream;
  398. begin
  399.   Desktop^.Delete(ClipboardWindow);
  400.   DesktopFile.Init('DESKTOP.TUT', stCreate, 1024);
  401.   DesktopFile.Put(Desktop);
  402.   DesktopFile.Done;
  403.   InsertWindow(ClipboardWindow);
  404. end;
  405.  
  406. procedure TTutorApp.SaveOrderData;
  407. begin
  408.   if OrderWindow^.Valid(cmClose) then
  409.   begin
  410.     OrderWindow^.GetData(OrderInfo);
  411.     POrderObj(OrderColl^.At(CurrentOrder))^.TransferRecord := OrderInfo;
  412.     SaveOrders;
  413.   end;
  414.   EnableCommands([cmOrderPrev, cmOrderNew]);
  415. end;
  416.  
  417. procedure TTutorApp.ShowOrder(AOrderNum: Integer);
  418. begin
  419.   CurrentOrder := AOrderNum;
  420.   OrderInfo := POrderObj(OrderColl^.At(CurrentOrder))^.TransferRecord;
  421.   OrderWindow^.SetData(OrderInfo);
  422.   if CurrentOrder > 0 then EnableCommands([cmOrderPrev])
  423.   else DisableCommands([cmOrderPrev]);
  424.   if OrderColl^.Count > 0 then EnableCommands([cmOrderNext]);
  425.   if CurrentOrder >= OrderColl^.Count - 1 then DisableCommands([cmOrderNext]);
  426.   EnableCommands([cmOrderSave, cmOrderNew]);
  427. end;
  428.  
  429. var
  430.   TutorApp: TTutorApp;
  431.  
  432. begin
  433.   TutorApp.Init;
  434.   TutorApp.Run;
  435.   TutorApp.Done;
  436. end.
  437.