home *** CD-ROM | disk | FTP | other *** search
/ C Programming Starter Kit 2.0 / SamsPublishing-CProgrammingStarterKit-v2.0-Win31.iso / bde / employee.pak / EMPLOYEE.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1997-07-24  |  27.0 KB  |  935 lines

  1. {$A+,B-,D+,F+,G+,I-,K+,L+,N+,P-,Q-,R-,S-,T-,V+,W+,X+,Y+}
  2. {$M 25000,8192}
  3. {************************************************}
  4. {                                                }
  5. {   Demo program                                 }
  6. {   Copyright (c) 1994 by Borland International  }
  7. {                                                }
  8. {************************************************}
  9.  
  10.  
  11. program Employee;
  12.  
  13. {$R EMPLOYEE.RES}
  14.  
  15.  
  16. uses WinTypes, WinProcs, WinDos, Strings, OWindows, ODialogs, Engine,
  17.      IDAPI, DbiTypes, DbiErrs, EmpConst, BWCC;
  18.  
  19. const
  20. { Application name }
  21.  
  22.   TableName = 'Employee.dbf';
  23.  
  24.   file_Handles = 40;
  25.  
  26.   AddMode = 1;
  27.   ModMode = 2;
  28.  
  29.  
  30.   id_FirstRec =       100;
  31.   id_PrevRec =        110;
  32.   id_NextRec =        120;
  33.   id_LastRec =        130;
  34.   id_About =          1140;
  35.   id_NewRec =         155;
  36.   id_DelRec =         165;
  37.   id_Exit =           1170;
  38.  
  39.   Id_Filter =          1180;
  40.   Id_SaveRec =         190;
  41.   Id_Order =           1200;
  42.   Id_Range =           1210;
  43.   Id_Search =          1220;
  44.   Id_UndoRec =         123;
  45.  
  46. { Edit box ID's }
  47.  
  48.   IDE_FName =       2000;
  49.   IDE_LName =       2001;
  50.   IDE_Address1 =    2002;
  51.   IDE_Address2 =    2003;
  52.   IDE_City =        2004;
  53.   IDE_State =       2005;
  54.   IDE_Zip =         2006;
  55.   IDE_HPhone =      2007;
  56.   IDE_WPhone =      2008;
  57.   IDE_EmployeeId =  2009;
  58.   IDE_StartDate  =  2010;
  59.   IDE_EndDate  =    2011;
  60.   IDE_Department =  2012;
  61.   IDE_Comments =    2013;
  62.  
  63. { Static Text fields }
  64.   St_Names = 101;
  65.   St_Dates = 102;
  66.  
  67. { OrderDialog Controls }
  68.  
  69.   IDC_OrderIdxNames  = 103;
  70.   IDC_OrderInfo      = 104;
  71.  
  72. { SearchDialog Controls }
  73.  
  74.   IDC_SearchIdxNames    = 101;
  75.   IDE_SearchInfo        = 103;
  76.  
  77. type
  78.  
  79. { PEmployee dialog window object }
  80.  
  81.   PEmployee = ^TEmployee;
  82.   TEmployee = object(TDlgWindow)
  83.     TableEmpty: boolean;
  84.     Mode: integer;
  85.     constructor Init;
  86.     procedure SetUpWindow; virtual;
  87.     procedure ChangeMode(NewMode: integer);
  88.     procedure ClearFields(Rec: PRecordType);
  89.     procedure DisplayRecord(Rec: PRecordType);
  90.     procedure DisableCommand(CommandId: Integer);
  91.     procedure EnableCommand(CommandId: Integer);
  92.     procedure EnableControls;
  93.     procedure DisableControls;
  94.     function verified: boolean;
  95.     function GetClassName: PChar; virtual;
  96.     procedure GetRec(var Rec: TRecordType);
  97.     procedure GetWindowClass(var AWndClass: TWndClass); virtual;
  98.     procedure idExit(var Msg: TMessage);
  99.        virtual cm_First + id_Exit;
  100.     procedure cmAbout(var Msg: TMessage);
  101.        virtual cm_First + id_About;
  102.     procedure idFirstRec(var Msg: TMessage);
  103.        virtual id_First + id_FirstRec;
  104.     procedure idLastRec(var Msg: TMessage);
  105.        virtual id_First + id_LastRec;
  106.     procedure idNextRec(var Msg: TMessage);
  107.        virtual id_First + id_NextRec;
  108.     procedure idPrevRec(var Msg: TMessage);
  109.        virtual id_First + id_PrevRec;
  110.     procedure idNewRec(var Msg: TMessage);
  111.        virtual id_First + id_NewRec;
  112.     procedure idDelRec(var Msg: TMessage);
  113.        virtual id_First + id_DelRec;
  114.     procedure idOrder(var Msg: TMessage);
  115.        virtual cm_First + id_Order;
  116.     procedure idSaveRec(var Msg: TMessage);
  117.        virtual id_First + id_SaveRec;
  118.     procedure idSearch(var Msg: TMessage);
  119.        virtual cm_First + id_Search;
  120.     procedure idUndoRec(var Msg: TMessage);
  121.        virtual id_First + id_UndoRec;
  122.     procedure WmDisplay(var Msg: TMessage);
  123.        virtual wm_First + wm_Display;
  124.     procedure wmCommand(var Msg: TMessage);
  125.       virtual wm_First + wm_Command;
  126.     procedure OK(var Msg: TMessage);
  127.        virtual id_First + id_OK;
  128.     procedure Cancel(var Msg: TMessage);
  129.        virtual id_First + id_Cancel;
  130.     procedure WMClose(var Msg: TMessage);
  131.       virtual wm_First + wm_Close;
  132.   end;
  133.  
  134. { Index Order Dialog Definition }
  135.  
  136.   POrderDialog = ^TOrderDialog;
  137.   TOrderDialog = object(TDialog)
  138.     constructor Init;
  139.     procedure SetupWindow; virtual;
  140.     procedure WMCommand(var Msg: TMessage);
  141.       virtual wm_First + wm_Command;
  142.   end;
  143.  
  144. { Search Dialog Definition }
  145.  
  146.   PSearchDialog = ^TSearchDialog;
  147.   TSearchDialog = object(TDialog)
  148.     constructor Init;
  149.     procedure SetupWindow; virtual;
  150.     procedure WMCommand(var Msg: TMessage);
  151.       virtual wm_First + wm_Command;
  152.   end;
  153.  
  154. { Employee application object }
  155.  
  156.   TEmployeeApp = object(TApplication)
  157.     procedure InitMainWindow; virtual;
  158.   end;
  159.  
  160. var
  161.  
  162. { Application instance }
  163.  
  164.   EmployeeApp: TEmployeeApp;
  165.   hdb: hDBIdb;
  166.   hCur: hDBICur;
  167.  
  168. function FillIndexCBox(Hw: HWND; ID: integer): integer;
  169. var
  170.   i: integer;
  171.   Off: integer;
  172.   Index: Longint;
  173. begin
  174.  
  175.   for i := 1 to NumIndexes do
  176.   begin
  177.     Off := SendDlgItemMessage(Hw, ID, CB_ADDSTRING, 0,
  178.                                LONGINT(PChar(@XIDXDesc[i].szTagName)));
  179.     SendDlgItemMessage(Hw, ID, CB_SETITEMDATA, Off,  i);
  180.   end;
  181.  
  182.   i := GetIndexNum(hCur);
  183.   { Select that index from the combo box list. }
  184.   Off := SendDlgItemMessage(Hw, ID, CB_SELECTSTRING, word(-1),
  185.                           Longint(PChar(@XIDXDesc[i].szTagName)));
  186.   Index := SendDlgItemMessage(Hw, ID, CB_GETITEMDATA, Off, 0);
  187.   { Set the description text into the static text box based upon
  188.   the index's item data. }
  189.   FillIndexCBox := Index;
  190. end;
  191.  
  192. procedure SetFieldLen(HW: HWND; ID, Index: Integer);
  193. var
  194.   LimitLen: integer;
  195. begin
  196.   case Index of
  197.     1: LimitLen := NameLen;
  198.     2: LimitLen := EmpIdLen;
  199.     3: LimitLen := DeptLen;
  200.   end; { case }
  201.   SendDlgItemMessage(HW, ID, EM_LIMITTEXT, LimitLen, 0);
  202. end;
  203.  
  204. { TOrderDialog }
  205. constructor TOrderDialog.Init;
  206. begin
  207.   inherited Init(@self, 'ORDERDLG');
  208. end;
  209.  
  210. procedure TOrderDialog.SetupWindow;
  211. var
  212.   Index: Longint;
  213. begin
  214.   inherited SetupWindow;
  215.   Index := FillIndexCBox(HWindow, IDC_OrderIdxNames);
  216.   SetWindowText(GetDlgItem(HWindow, IDC_ORDERINFO), IDXDescriptions[Index]);
  217. end;
  218.  
  219. procedure TOrderDialog.WMCommand(var Msg: TMessage);
  220. var
  221.   Sel: integer;
  222.   Index: integer;
  223. begin
  224.   case Msg.wParam of
  225.   IDC_OrderIdxNames:
  226.     if HiWord(Msg.LParam) = CBN_SELCHANGE then
  227.     begin
  228.       Sel := SendDlgItemMessage(HWindow, IDC_OrderIdxNames, CB_GETCURSEL, 0, 0);
  229.       Index := SendDlgItemMessage(HWindow, IDC_OrderIdxNames, CB_GETITEMDATA, Sel, 0);
  230.       { Put the Index description in the static text box. }
  231.       SetWindowText(GetDlgItem(HWindow, IDC_OrderInfo), IDXDescriptions[Index]);
  232.     end;
  233.   id_Cancel:
  234.       EndDialog(HWindow, id_Cancel);
  235.   ID_OK:
  236.     begin
  237.       Sel := SendDlgItemMessage(HWindow, IDC_OrderIdxNames, CB_GETCURSEL, 0, 0);
  238.       Index := SendDlgItemMessage(HWindow, IDC_OrderIdxNames, CB_GETITEMDATA, Sel, 0);
  239.       SetIndex(hCur, Index, True);
  240.       EndDialog(HWindow, ID_OK);
  241.     end;
  242.   else
  243.      inherited WMCommand(Msg);
  244.   end; { case }
  245. end;
  246.  
  247. { TSearchDialog }
  248. constructor TSearchDialog.Init;
  249. begin
  250.   inherited Init(@self, 'SEARCHDLG');
  251. end;
  252.  
  253. procedure TSearchDialog.SetupWindow;
  254. var
  255.   Index: Longint;
  256.   
  257. begin
  258.   inherited SetupWindow;
  259.   Index := FillIndexCBox(HWindow, IDC_SearchIdxNames);
  260.   SetWindowText(GetDlgItem(HWindow, IDC_ORDERINFO), IDXDescriptions[Index]);
  261.   SetFieldLen(HWindow, IDE_SearchInfo, Index);
  262.   SendDlgItemMessage(HWindow, IDE_SearchInfo, EM_LIMITTEXT, 20, 0);
  263. end;
  264.  
  265. procedure TSearchDialog.WMCommand(var Msg: TMessage);
  266. var
  267.   Sel, Result: integer;
  268.   OldIndex, Index: integer;
  269.   SearchStr: array[0..MaxFieldSize] of char;
  270.   RetVal: Boolean;
  271. begin
  272.   RetVal := false;
  273.   case Msg.wParam of
  274.   IDC_SearchIdxNames:
  275.     if HiWord(Msg.LParam) = CBN_SELCHANGE then
  276.     begin
  277.       Sel := SendDlgItemMessage(HWindow, IDC_SearchIdxNames, CB_GETCURSEL, 0, 0);
  278.       Index := SendDlgItemMessage(HWindow, IDC_SearchIdxNames, CB_GETITEMDATA, Sel, 0);
  279.       { Put the Index description in the static text box. }
  280.       SetFieldLen(HWindow, IDE_SearchInfo, Index);
  281.       SendDlgItemMessage(HWindow, IDE_SearchInfo, WM_SETTEXT, 0, Longint(PChar('')));
  282.     end;
  283.   id_Cancel:
  284.       EndDialog(HWindow, id_Cancel);
  285.   ID_OK:
  286.     begin
  287.     { Get the new index to search on. }
  288.       Sel := SendDlgItemMessage(HWindow, IDC_SearchIdxNames, CB_GETCURSEL, 0, 0);
  289.       Index := SendDlgItemMessage(HWindow, IDC_SearchIdxNames,CB_GETITEMDATA, Sel, 0);
  290.       OldIndex := GetIndexNum(hCur);
  291.       if OldIndex <> Index then
  292.           SetIndex(hCur, Index, true);
  293.       GetDlgItemText(HWindow, IDE_SearchInfo, SearchStr, MaxFieldSize);
  294.       { Search based upon a keySEARCHGEQ condition and the search string. }
  295.       Result := Search(hCur, keySEARCHGEQ, @SearchStr);
  296.  
  297.       case (Result) of
  298.         DBIERR_NONE:
  299.           begin
  300.             if AtEof(hCur) = True then
  301.             begin
  302.               BWCCMessageBox(HWindow, 'Could not find a match', 'Search Error',
  303.                              MB_ICONINFORMATION or MB_OK);
  304.               if OldIndex <> Index then
  305.                 SetIndex(hCur, OldIndex, true);
  306.               GoTop(hCur, true);
  307.               RetVal := False
  308.             end
  309.             else
  310.               RetVal := True;
  311.           end;
  312.         DBIERR_RECNOTFOUND:
  313.         begin
  314.           BWCCMessageBox(HWindow, 'Could not find a match', 'Search Error',
  315.                          MB_ICONINFORMATION or MB_OK);
  316.           if OldIndex <> Index then
  317.              SetIndex(hCur, OldIndex, true);
  318.           GoTop(hCur, true);
  319.           RetVal := false;
  320.         end;
  321.         else
  322.         begin
  323.           BWCCMessageBox(HWindow, 'Could not find a match', 'Search Error',
  324.                          MB_ICONINFORMATION or MB_OK);
  325.  
  326.           if OldIndex <> Index then
  327.              SetIndex(hCur, OldIndex, true);
  328.           GoTop(hCur, true);
  329.           RetVal := false;
  330.         end;
  331.       end;
  332.       EndDialog(HWindow, word(RetVal));
  333.    end;
  334.   else
  335.      inherited WMCommand(Msg);
  336.   end; { case }
  337. end;
  338.  
  339. { TEmployee }
  340. constructor TEmployee.Init;
  341. begin
  342.   inherited Init(nil, 'EmployeeDLG');
  343.   if SetHandleCount(file_Handles) <> file_Handles then
  344.   begin
  345.     BWCCMessageBox(0, 'Not Enough File handles available', 'ERROR', mb_Ok);
  346.     PostQuitMessage(0);
  347.   end;
  348.   SetPrivateDir;
  349. end;
  350.  
  351. procedure TEmployee.SetupWindow;
  352. var
  353.   CurrentRec: PRecordType;
  354.   TblExist: boolean;
  355.   SearchRec: TSearchRec;
  356.   RetVal: DBIResult;
  357.   D: Double;
  358.   TableDir: PChar;
  359. begin
  360.   inherited SetupWindow;
  361.  
  362.   Mode := ModMode;
  363.   if DBInit <> DBIERR_NONE then
  364.   begin
  365.     BWCCMessageBox(0, 'DataBase could not be initialized', 'Message', mb_ok);
  366.     PostQuitMessage(0);
  367.   end;
  368.  
  369.  
  370.   GetMem(TableDir, dbiMAXPATHLEN + 1);
  371.   FindTablesDir(TableDir, 3);
  372.   StrCat(TableDir, '\');
  373.   StrCat(TableDir, TableName);
  374.   FindFirst(TableDir, faAnyFile, SearchRec);
  375.   if DosError <> 0 then
  376.   begin
  377.     if CreateTable <> DBIERR_NONE then
  378.     begin
  379.       BWCCMessageBox(0, 'Error Creating DataBase', 'Error!', mb_ok);
  380.       PostQuitMessage(0);
  381.     end
  382.   end;
  383.   FreeMem(TableDir, dbiMAXPATHLEN + 1);
  384.   { Now a Table has been created or one already exists. Get the table's database
  385.   / and cursor handles
  386.   }
  387.   if GetTable(hDb, hCur) = DBIERR_NONE then
  388.   begin
  389.     { Set the table index to either: NameIndex, EmpIDIndex or DeptIndex }
  390.     SetIndex(hCur, NameIndex, false);
  391.     if (GetRecordCount(hCur) = 0) then
  392.     begin
  393.       TableEmpty := true;
  394.       AddInitialRecords(hCur);
  395.     end;
  396.  
  397.     { When we move to the top we are sitting on a crack before the
  398.     / first record. If the table is not Empty go to the first record and
  399.     / display the first Record.
  400.     }
  401.     TableEmpty := false;
  402.     GoTop(hCur, TRUE);
  403.     SendMessage(hWindow, wm_Display, 0, 0);
  404.     EnableWindow(GetDlgItem(HWindow, id_Cancel), false);
  405.     EnableWindow(GetDlgItem(HWindow, id_SaveRec), false);
  406.     ShowWindow(GetDlgItem(HWindow, id_Ok), sw_Hide);
  407.   end
  408.   else
  409.     BWCCMessageBox(0, 'Table could not be opened', 'Message', mb_ok);
  410. end;
  411.  
  412. procedure TEmployee.ChangeMode(NewMode: integer);
  413. begin
  414.   if NewMode = AddMode then
  415.   begin
  416.     ShowWindow(GetDlgItem(HWindow, id_FirstRec), sw_Hide);
  417.     ShowWindow(GetDlgItem(HWindow, id_PrevRec), sw_Hide);
  418.     ShowWindow(GetDlgItem(HWindow, id_LastRec), sw_Hide);
  419.     ShowWindow(GetDlgItem(HWindow, id_NextRec), sw_Hide);
  420.     ShowWindow(GetDlgItem(HWindow, id_NewRec), sw_Hide);
  421.     ShowWindow(GetDlgItem(HWindow, id_DelRec), sw_Hide);
  422.     ShowWindow(GetDlgItem(HWindow, id_SaveRec), sw_Hide);
  423.     ShowWindow(GetDlgItem(HWindow, id_UndoRec), sw_Hide);
  424.     ShowWindow(GetDlgItem(HWindow, id_Ok), sw_Normal);
  425.     ShowWindow(GetDlgItem(HWindow, id_Cancel), sw_Normal);
  426.     ShowWindow(GetDlgItem(HWindow, St_Names), sw_Normal);
  427.     ShowWindow(GetDlgItem(HWindow, St_Dates), sw_Normal);
  428.     Mode := AddMode;
  429.   end
  430.   else if NewMode = ModMode then
  431.   begin
  432.     ShowWindow(GetDlgItem(HWindow, id_FirstRec), sw_Normal);
  433.     ShowWindow(GetDlgItem(HWindow, id_PrevRec), sw_Normal);
  434.     ShowWindow(GetDlgItem(HWindow, id_LastRec), sw_Normal);
  435.     ShowWindow(GetDlgItem(HWindow, id_NextRec), sw_Normal);
  436.     ShowWindow(GetDlgItem(HWindow, id_NewRec), sw_Normal);
  437.     ShowWindow(GetDlgItem(HWindow, id_DelRec), sw_Normal);
  438.     ShowWindow(GetDlgItem(HWindow, id_SaveRec), sw_Normal);
  439.     ShowWindow(GetDlgItem(HWindow, id_UndoRec), sw_Normal);
  440.     ShowWindow(GetDlgItem(HWindow, id_Ok), sw_Hide);
  441.     ShowWindow(GetDlgItem(HWindow, id_Cancel), sw_Hide);
  442.     ShowWindow(GetDlgItem(HWindow, St_Names), sw_Hide);
  443.     ShowWindow(GetDlgItem(HWindow, St_Dates), sw_Hide);
  444.     Mode := ModMode;
  445.   end
  446. end;
  447.  
  448. procedure TEmployee.ClearFields(Rec: PRecordType);
  449. begin
  450.   with Rec^ do
  451.   begin
  452.     StrCopy(FName, '');
  453.     StrCopy(LName, '');
  454.     StrCopy(Address1, '');
  455.     StrCopy(Address2, '');
  456.     StrCopy(City, '');
  457.     StrCopy(State, '');
  458.     StrCopy(Zip, '');
  459.     StrCopy(HPhone, '');
  460.     StrCopy(WPhone, '');
  461.     EmpID := 0.0;
  462.     StrCopy(StartDate, '');
  463.     StrCopy(EndDate, '');
  464.     StrCopy(Department, '');
  465.     StrCopy(Comments, '');
  466.   end;
  467. end;
  468.  
  469.  
  470. procedure TEmployee.DisableCommand(commandID: Integer);
  471. begin
  472.   EnableMenuItem(GetMenu(HWindow), CommandID, mf_ByCommand or mf_Grayed);
  473.   EnableWindow(GetDlgItem(HWindow, CommandId), false)
  474. end;
  475.  
  476. procedure TEmployee.DisplayRecord(Rec: PRecordType);
  477. var
  478.   S: array[0..10] of char; {string[10]; }
  479.  
  480. begin
  481.   SetDlgItemText(HWindow, IDE_FName, Rec^.FName);
  482.   SetDlgItemText(HWindow, IDE_LName, Rec^.LName);
  483.   SetDlgItemText(HWindow, IDE_Address1, Rec^.Address1);
  484.   SetDlgItemText(HWindow, IDE_Address2, Rec^.Address2);
  485.   SetDlgItemText(HWindow, IDE_City, Rec^.City);
  486.   SetDlgItemText(HWindow, IDE_State, Rec^.State);
  487.   SetDlgItemText(HWindow, IDE_Zip, Rec^.Zip);
  488.   SetDlgItemText(HWindow, IDE_HPhone, Rec^.HPhone);
  489.   SetDlgItemText(HWindow, IDE_WPhone, Rec^.WPhone);
  490.   SetDlgItemText(HWindow, IDE_StartDate, Rec^.StartDate);
  491.   SetDlgItemText(HWindow, IDE_EndDate, Rec^.EndDate);
  492.   str(trunc(Rec^.EmpId), S);
  493.   SetDlgItemText(HWindow, IDE_EmployeeID, S);
  494.   SetDlgItemText(HWindow, IDE_Department, Rec^.Department);
  495.   SetDlgItemText(HWindow, IDE_Comments, Rec^.Comments);
  496.   UpdateWindow(HWindow);
  497. end;
  498.  
  499.  
  500. procedure TEmployee.EnableCommand(commandID: Integer);
  501. begin
  502.   EnableMenuItem(GetMenu(HWindow), CommandID, mf_ByCommand or mf_Enabled);
  503.   EnableWindow(GetDlgItem(HWindow, CommandId), true)
  504. end;
  505.  
  506. procedure TEmployee.EnableControls;
  507. begin
  508.   EnableWindow(GetDlgItem(HWindow, IDE_FName), true);
  509.   EnableWindow(GetDlgItem(HWindow, IDE_LName), true);
  510.   EnableWindow(GetDlgItem(HWindow, IDE_Address1), true);
  511.   EnableWindow(GetDlgItem(HWindow, IDE_Address2), true);
  512.   EnableWindow(GetDlgItem(HWindow, IDE_City), true);
  513.   EnableWindow(GetDlgItem(HWindow, IDE_State), true);
  514.   EnableWindow(GetDlgItem(HWindow, IDE_Zip), true);
  515.   EnableWindow(GetDlgItem(HWindow, IDE_HPhone), true);
  516.   EnableWindow(GetDlgItem(HWindow, IDE_WPhone), true);
  517.   EnableWindow(GetDlgItem(HWindow, IDE_EmployeeId), true);
  518.   EnableWindow(GetDlgItem(HWindow, IDE_StartDate), true);
  519.   EnableWindow(GetDlgItem(HWindow, IDE_EndDate), true);
  520.   EnableWindow(GetDlgItem(HWindow, IDE_Department), true);
  521.   EnableWindow(GetDlgItem(HWindow, IDE_Comments), true);
  522.   EnableWindow(GetDlgItem(HWindow, id_DelRec), true);
  523. end;
  524.  
  525. Procedure TEmployee.DisableControls;
  526. begin
  527.   EnableWindow(GetDlgItem(HWindow, IDE_FName), false);
  528.   EnableWindow(GetDlgItem(HWindow, IDE_LName), false);
  529.   EnableWindow(GetDlgItem(HWindow, IDE_Address1), false);
  530.   EnableWindow(GetDlgItem(HWindow, IDE_Address2), false);
  531.   EnableWindow(GetDlgItem(HWindow, IDE_City), false);
  532.   EnableWindow(GetDlgItem(HWindow, IDE_State), false);
  533.   EnableWindow(GetDlgItem(HWindow, IDE_Zip), false);
  534.   EnableWindow(GetDlgItem(HWindow, IDE_HPhone), false);
  535.   EnableWindow(GetDlgItem(HWindow, IDE_WPhone), false);
  536.   EnableWindow(GetDlgItem(HWindow, IDE_EmployeeId), false);
  537.   EnableWindow(GetDlgItem(HWindow, IDE_StartDate), false);
  538.   EnableWindow(GetDlgItem(HWindow, IDE_EndDate), false);
  539.   EnableWindow(GetDlgItem(HWindow, IDE_Department), false);
  540.   EnableWindow(GetDlgItem(HWindow, IDE_Comments), false);
  541.   EnableWindow(GetDlgItem(HWindow, id_DelRec), false);
  542. end;
  543.  
  544. procedure TEmployee.GetRec(var Rec: TRecordType);
  545. var
  546.   S: array[0..10] of char;
  547.   Code: integer;
  548. begin
  549.   GetDlgItemText(HWindow, IDE_FName, Rec.FName, NameLen);
  550.   GetDlgItemText(HWindow, IDE_LName, Rec.LName, NameLen);
  551.   GetDlgItemText(HWindow, IDE_Address1, Rec.Address1, AddressLen);
  552.   GetDlgItemText(HWindow, IDE_Address2, Rec.Address2, AddressLen);
  553.   GetDlgItemText(HWindow, IDE_City, Rec.City, CityLen);
  554.   GetDlgItemText(HWindow, IDE_State, Rec.State, StateLen);
  555.   GetDlgItemText(HWindow, IDE_Zip, Rec.Zip, ZipLen);
  556.   GetDlgItemText(HWindow, IDE_HPhone, Rec.HPhone, PhoneLen);
  557.   GetDlgItemText(HWindow, IDE_WPhone, Rec.WPhone, PhoneLen);
  558.   GetDlgItemText(HWindow, IDE_StartDate, Rec.StartDate, DateLen);
  559.   GetDlgItemText(HWindow, IDE_EndDate, Rec.EndDate, DateLen);
  560.   GetDlgItemText(HWindow, IDE_EmployeeID, S, EmpIDLen);
  561.   val(S, Rec.EmpID, Code);
  562.   GetDlgItemText(HWindow, IDE_Department, Rec.Department, DeptLen);
  563.   GetDlgItemText(HWindow, IDE_Comments, Rec.Comments, CommentLen);
  564. end;
  565.  
  566. function TEmployee.GetClassName: PChar;
  567. begin
  568.   GetClassName := 'bordlg_employee';
  569. end;
  570.  
  571. procedure TEmployee.GetWindowClass(var AWndClass: TWndClass);
  572. begin
  573.   TDlgWindow.GetWindowClass(AWndClass);
  574.   AWndClass.hIcon := LoadIcon(HInstance, PChar(9999));
  575. end;
  576.  
  577. function TEmployee.Verified: boolean;
  578.  
  579.   function CheckDate(CkDate: Pchar): boolean;
  580.   var
  581.     DateNum: integer;
  582.     Month, Day, Year: array[0..3] of char;
  583.     code1, Code2, Code3: integer;
  584.     RetVal: boolean;
  585.   begin
  586.      RetVal := false;
  587.      if strComp(CkDate, '') = 0 then
  588.        RetVal := true
  589.      else begin
  590.        if (CkDate[2] = '-') and (CkDate[5] = '-') then
  591.        begin
  592.          strlcopy(Month, CkDate, 2);
  593.          strlcopy(Day, @CkDate[3], 2);
  594.          strlcopy(Year, @CkDate[6], 2);
  595.        end;
  596.        val(Month, DateNum, code1);
  597.        val(Day, DateNum, code2);
  598.        val(Year, DateNum, code3);
  599.        if (code1 = 0) and (code2 = 0) and (code3 = 0) then
  600.          RetVal := true;
  601.      end;
  602.  
  603.      CheckDate := retval;
  604.   end;
  605.  
  606. var
  607.   Name: array[0..NameLen] of char;
  608.   FNameLen, LNameLen, Dt1Len, Dt2Len: integer;
  609.   Date1, Date2: array[0..DateLen] of char;
  610.   ValidDates: boolean;
  611. begin
  612.    verified := false;
  613.    FNameLen := GetDlgItemText(HWindow, IDE_FName, Name, NameLen);
  614.    LNameLen := GetDlgItemText(HWindow, IDE_LName, Name, NameLen);
  615.    Dt1Len := GetDlgItemText(HWindow, IDE_StartDate, Date1, DateLen);
  616.    Dt2len := GetDlgItemText(HWindow, IDE_EndDate, Date2, DateLen);
  617.  
  618.    ValidDates := ((Dt1Len = 8) and ((Dt2Len = 8) or (Dt2Len = 0)));
  619.  
  620.    if (FNameLen > 0) and (ValidDates) then
  621.      if (CheckDate(Date2) and CheckDate(Date1)) then
  622.          verified := true
  623.      else
  624.        verified := false;
  625. end;
  626.  
  627. procedure TEmployee.cmAbout(var Msg: TMessage);
  628. var
  629.   PDlg: PDialog;
  630. begin
  631.   PDlg := new(PDialog, init(@self, 'ABOUTDLG'));
  632.   PDlg^.Execute;
  633.   PDlg^.Done;
  634. end;
  635.  
  636. procedure TEmployee.idExit(var Msg: TMessage);
  637. begin
  638.   CloseDb(hdb, hCur);
  639.   CloseWindow;
  640. end;
  641.  
  642. procedure TEmployee.idFirstRec(var Msg: TMessage);
  643. begin
  644.   GoTop(hCur, True);
  645.   PostMessage(hWindow, wm_Display, 0, 0);
  646. end;
  647.  
  648. procedure TEmployee.idLastRec(var Msg: TMessage);
  649. begin
  650.   GoBottom(hCur, True);
  651.   PostMessage(hWindow, wm_Display, 0, 0);
  652. end;
  653.  
  654. procedure TEmployee.idNextRec(var Msg: TMessage);
  655. begin
  656.   if not AtEOF(HCur) then
  657.   begin
  658.    GetNextRec(hCur);
  659.    PostMessage(hWindow, wm_Display, 0, 0);
  660.   end;
  661. end;
  662.  
  663. procedure TEmployee.idPrevRec(var Msg: TMessage);
  664. begin
  665.   if not AtBOF(HCur) then
  666.   begin
  667.     GetPrevRec(HCur);
  668.     PostMessage(hWindow, wm_Display, 0, 0);
  669.   end;
  670. end;
  671.  
  672. procedure TEmployee.idNewRec(var Msg: TMessage);
  673. var
  674.   NewRec: PRecordType;
  675. begin
  676.   EnableControls;
  677.   EnableMenuItem(GetMenu(HWindow), 0, mf_ByPosition or mf_Grayed);
  678.   EnableMenuItem(GetMenu(HWindow), 1, mf_ByPosition or mf_Grayed);
  679.   DrawMenuBar(HWindow);
  680.   new(NewRec);
  681.   ClearFields(NewRec);
  682.   ChangeMode(AddMode);
  683.   DisplayRecord(NewRec);
  684.   EnableWindow(GetDlgItem(HWindow, IDOK), false);
  685.   EnableWindow(GetDlgItem(HWindow, IDCancel), true);
  686.   Dispose(NewRec);
  687. end;
  688.  
  689. procedure TEmployee.idDelRec(var Msg: TMessage);
  690. var
  691.   Rec: PRecordType;
  692. begin
  693.   if BWCCMessageBox(HWindow, 'Delete this record?', 'Message',
  694.       mb_YesNo or mb_IconQuestion) = idYes then
  695.   begin
  696.     DeleteRec(hCur);
  697.     if GetRecordCount(hCur) = 0 then
  698.       TableEmpty := true;
  699.     GoTop(hCur, not TableEmpty);
  700.     Postmessage(HWindow, wm_Display, 0, 0)
  701.   end;
  702. end;
  703.  
  704. procedure TEmployee.WMCommand(var Msg: TMessage);
  705. begin
  706.   case Msg.wParam of
  707.   IDE_FName,
  708.   IDE_LName,
  709.   IDE_Address1,
  710.   IDE_Address2,
  711.   IDE_City,
  712.   IDE_State,
  713.   IDE_Zip,
  714.   IDE_HPhone,
  715.   IDE_WPhone,
  716.   IDE_EmployeeId,
  717.   IDE_StartDate,
  718.   IDE_EndDate,
  719.   IDE_Department,
  720.   IDE_Comments:
  721.   begin
  722.     if (HIWORD(Msg.lParam) = EN_UPDATE) then
  723.       if Verified then
  724.         case Mode of
  725.           AddMode:
  726.             begin
  727.               EnableWindow(GetDlgItem(HWindow, idOK), true);
  728.               EnableWindow(GetDlgItem(HWindow, idCancel), true)
  729.             end;
  730.           ModMode:
  731.             begin
  732.               EnableWindow(GetDlgItem(HWindow, id_SaveRec), true);
  733.               EnableWindow(GetDlgItem(HWindow, id_UndoRec), true)
  734.             end;
  735.         end { case }
  736.       else
  737.         case Mode of
  738.           AddMode:
  739.             begin
  740.               EnableWindow(GetDlgItem(HWindow, idOK), false);
  741.               EnableWindow(GetDlgItem(HWindow, idCancel), true)
  742.             end;
  743.           ModMode:
  744.             begin
  745.               EnableWindow(GetDlgItem(HWindow, id_SaveRec), false);
  746.               EnableWindow(GetDlgItem(HWindow, id_UndoRec), true)
  747.             end;
  748.         end;
  749.      inherited WMCommand(Msg);
  750.   end
  751.   else
  752.     inherited WMCommand(Msg);
  753.  end;
  754. end;
  755.  
  756. procedure TEmployee.OK(var Msg: TMessage);
  757. var
  758.   CurrentRec: PRecordType;
  759. begin
  760.   { Get the data from the main Window and put it into the record structure. }
  761.   if TableEmpty then
  762.   begin
  763.     TableEmpty := false;
  764.     DisableControls;
  765.   end;
  766.   New(CurrentRec);
  767.   GetRec(CurrentRec^);
  768.   { Insert the record into the table }
  769.   if AddRecord(hCur, CurrentRec, true) = DBIERR_NONE
  770.   then begin
  771.     ChangeMode(ModMode);
  772.     PostMessage(HWindow, wm_Display, 0, 0);
  773.     EnableMenuItem(GetMenu(HWindow), 0, mf_ByPosition or mf_Enabled);
  774.     EnableMenuItem(GetMenu(HWindow), 1, mf_ByPosition or mf_Enabled);
  775.     DrawMenuBar(HWindow);
  776.   end { then }
  777.   else
  778.     BWCCMessageBox(HWindow, 'Record could not be added', 'Error', mb_Ok);
  779.  
  780.   dispose(CurrentRec);
  781. end;
  782.  
  783. procedure TEmployee.IdOrder(var Msg: TMessage);
  784. begin
  785.   if Application^.ExecDialog(New(POrderDialog, Init)) = ID_OK then
  786.       PostMessage(hWindow, wm_Display, 0, 0);
  787. end;
  788.  
  789. procedure TEmployee.IdSearch(var Msg: TMessage);
  790. begin
  791.   if Application^.ExecDialog(New(PSearchDialog, Init)) = ID_OK then
  792.   begin
  793.     GetNextRec(hCur);
  794.     PostMessage(hWindow, wm_Display, 0, 0);
  795.   end
  796.   else
  797.   begin
  798.     if AtBof(hCur) = True then
  799.     begin
  800.       PostMessage(hWindow, wm_Display, 0, 0);
  801.     end;
  802.   end;
  803. end;
  804.  
  805. procedure TEmployee.IdSaveRec(var Msg: TMessage);
  806. var
  807.   CurrentRec: PRecordType;
  808. begin
  809.   { Get the data from the main Window and put it into the record structure. }
  810.   New(CurrentRec);
  811.   GetRec(CurrentRec^);
  812.   { Insert the record into the table }
  813.   AddRecord(hCur, CurrentRec, false);
  814.   PostMessage(HWindow, wm_Display, 0, 0);
  815.   dispose(CurrentRec);
  816.   EnableMenuItem(GetMenu(HWindow), 0, mf_ByPosition or mf_Enabled);
  817.   EnableMenuItem(GetMenu(HWindow), 1, mf_ByPosition or mf_Enabled);
  818.   DrawMenuBar(HWindow);
  819. end;
  820.  
  821. procedure TEmployee.idUndoRec(var Msg: Tmessage);
  822. var
  823.  l: longint;
  824.  
  825. begin
  826.   SendMessage(HWindow, wm_Display, 0, 0);
  827.   EnableWindow(GetDlgItem(HWindow, id_SaveRec), false);
  828.   EnableWindow(GetDlgItem(HWindow, id_UndoRec), false);
  829.   setfocus(GetDlgItem(HWindow, IDE_FName));
  830.   PostMessage(GetDlgItem(HWindow, IDE_FName), em_SetSel, 1, MakeLong(0, word(-1)));
  831. end;
  832.  
  833.  
  834. procedure TEmployee.Cancel(var Msg: TMessage);
  835. var
  836.   CurrentRec: PRecordType;
  837. begin
  838.   New(CurrentRec);
  839.   if TableEmpty then
  840.     DisableControls
  841.   else
  842.     GetData(hCur, CurrentRec);
  843.   ClearFields(CurrentRec);
  844.   DisplayRecord(CurrentRec);
  845.   dispose(CurrentRec);
  846.   ChangeMode(ModMode);
  847.   EnableMenuItem(GetMenu(HWindow), 0, mf_ByPosition or mf_Enabled);
  848.   EnableMenuItem(GetMenu(HWindow), 1, mf_ByPosition or mf_Enabled);
  849.   DrawMenuBar(HWindow);
  850. end;
  851.  
  852. procedure TEmployee.WMClose(var Msg: TMessage);
  853. begin
  854.   CloseDb(hdb, hCur);
  855.   CloseWindow;
  856. end;
  857.  
  858. procedure TEmployee.wmDisplay(var Msg: TMessage);
  859. var
  860.   Rec: PRecordType;
  861. begin
  862.   if TableEmpty then
  863.   begin
  864.     DisableCommand(id_PrevRec);
  865.     DisableCommand(id_FirstRec);
  866.     DisableCommand(id_NextRec);
  867.     DisableCommand(id_LastRec);
  868.     DisableControls;
  869.     Rec := new(PRecordType);
  870.     ClearFields(Rec);
  871.     DisplayRecord(Rec);
  872.     dispose(Rec);
  873.   end
  874.   else
  875.   begin
  876.     EnableControls;
  877.     Rec := new(PRecordType);
  878.     GetData(hCur, Rec);
  879.     DisplayRecord(Rec);
  880.  
  881.     { Only one record exists in table }
  882.     if (AtEOF(HCur) and AtBOF(hCur))then
  883.     begin
  884.       DisableCommand(id_PrevRec);
  885.       DisableCommand(id_FirstRec);
  886.       DisableCommand(id_NextRec);
  887.       DisableCommand(id_LastRec);
  888.       DisableCommand(id_SaveRec);
  889.     end
  890.     else { At beginning of file with more than one record. }
  891.     begin
  892.       if (AtBOF(HCur) and not AtEOF(hCur))then
  893.       begin
  894.         DisableCommand(id_PrevRec);
  895.         DisableCommand(id_FirstRec)
  896.       end
  897.       else
  898.       begin
  899.         EnableCommand(id_PrevRec);
  900.         EnableCommand(id_FirstRec)
  901.       end;
  902.  
  903.       { At end of file with more than one record }
  904.       if (AtEOF(HCur) and not AtBOF(hCur))then
  905.       begin
  906.         DisableCommand(id_NextRec);
  907.         DisableCommand(id_LastRec);
  908.       end
  909.       else
  910.       begin
  911.         EnableCommand(id_NextRec);
  912.         EnableCommand(id_LastRec);
  913.       end;
  914.     end;
  915.  
  916.     { Disable the buttons and menu options for Undo and Commit and set focus to
  917.     / first name}
  918.  
  919.     DisableCommand(id_SaveRec);
  920.     DisableCommand(id_UndoRec);
  921.     Dispose(Rec);
  922.   end { else }
  923. end;
  924.  
  925. procedure TEmployeeApp.InitMainWindow;
  926. begin
  927.   MainWindow := New(PEmployee, Init);
  928. end;
  929.  
  930. begin
  931.   EmployeeApp.Init(AppName);
  932.   EmployeeApp.Run;
  933.   EmployeeApp.Done;
  934. end.
  935.