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

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