home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / Pascal / BPASCAL.700 / D11 / DDOCDEMO.ZIP / TUTOR11C.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1992-10-01  |  11.9 KB  |  477 lines

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