Advertisement
Eugene0091

4.1

Feb 28th, 2020
475
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 11.98 KB | None | 0 0
  1. unit Menu;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, StdCtrls, Grids, Menus;
  8.  
  9. type
  10.   TWorker = record
  11.      Name: string[20];
  12.      Department: string[30];
  13.      BirthYear: Word;
  14.      Experience: Byte;
  15.      Post: string[20];
  16.      Salary: Word;
  17.   end;
  18.   TWorkers = array of TWorker;
  19.   TCorrectOrAdd = (caCorrect, caAdd);
  20.   TEugenesDB = class(TForm)
  21.     btAddRecord: TButton;
  22.     sgDataTable: TStringGrid;
  23.     OpenFile: TOpenDialog;
  24.     btReload: TButton;
  25.     btDelete: TButton;
  26.     btCorrect: TButton;
  27.     btShowRet: TButton;
  28.     btAvrExp: TButton;
  29.     MainMenu1: TMainMenu;
  30.     N1: TMenuItem;
  31.     ItemAuthorName: TMenuItem;
  32.     ItemTask: TMenuItem;
  33.     ItemHelp: TMenuItem;
  34.     ItemFile: TMenuItem;
  35.     ItemOpen: TMenuItem;
  36.     ItemSave: TMenuItem;
  37.     SaveFile: TSaveDialog;
  38.     procedure FormCreate(Sender: TObject);
  39.     procedure btAddRecordClick(Sender: TObject);
  40.     procedure btReloadClick(Sender: TObject);
  41.     procedure btDeleteClick(Sender: TObject);
  42.     procedure sgDataTableSelectCell(Sender: TObject; ACol, ARow: Integer;
  43.       var CanSelect: Boolean);
  44.     procedure btCorrectClick(Sender: TObject);
  45.     procedure btShowRetClick(Sender: TObject);
  46.     procedure btAvrExpClick(Sender: TObject);
  47.     procedure ItemHelpClick(Sender: TObject);
  48.     procedure ItemAuthorNameClick(Sender: TObject);
  49.     procedure ItemTaskClick(Sender: TObject);
  50.     procedure ItemOpenClick(Sender: TObject);
  51.     procedure ItemSaveClick(Sender: TObject);
  52.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  53.   private
  54.    { Private declarations }
  55.   public
  56.     { Public declarations }
  57.   end;
  58.  
  59. var
  60.   EugenesDB: TEugenesDB;
  61.   Workers: TWorkers;
  62.    DbFile: File of TWorker;
  63.    CorrectOrAdd: TCorrectOrAdd;
  64.    WorkersCount: Integer;
  65.    RecNumber: Integer;
  66.    Path: string;
  67.  
  68. implementation
  69.  
  70. uses AddRecord, Unit1, CorrectRecord, ShowRetired, ShowAvrExp;
  71.  
  72. const
  73.    ThisYear = 2019;
  74.    MinBYear = 1900;
  75.    MaxBYear = 2001;
  76.  
  77. var
  78.    IsOpen: Boolean;
  79.  
  80. {$R *.dfm}
  81.  
  82. function CheckYear(BirthYear: string; var BYear: Integer): Boolean;
  83. var
  84.    Er: Integer;
  85.    IsValid: Boolean;
  86. begin
  87.    IsValid := True;
  88.    if Length(BirthYear) = 0 then
  89.    begin
  90.       IsValid := False;
  91.    end
  92.    else
  93.    begin
  94.       Val(BirthYear, BYear, Er);
  95.       if Er = 0 then
  96.          if (BYear < MinBYear) or (BYear > MaxBYear) then
  97.          begin
  98.             IsValid := False;
  99.          end
  100.          else
  101.             IsValid := True
  102.       else
  103.       begin
  104.          IsValid := False;
  105.       end;
  106.    end;
  107.    CheckYear := IsValid;
  108. end;
  109.  
  110. function CheckExperience(Experience: string; BYear: Integer): Boolean;
  111. var
  112.    Er, Exp: Integer;
  113.    IsValid: Boolean;
  114. begin
  115.    IsValid := True;
  116.    if Length(Experience) = 0 then
  117.    begin
  118.       IsValid := False;
  119.    end
  120.    else
  121.    begin
  122.       Val(Experience, Exp, Er);
  123.       if Er = 0 then
  124.          if (Exp > (ThisYear - BYear)) then
  125.          begin
  126.             IsValid := False;
  127.          end
  128.          else
  129.             IsValid := True
  130.       else
  131.       begin
  132.          IsValid := False;
  133.       end;
  134.     end;
  135.     CheckExperience := IsValid;
  136. end;
  137.  
  138. function CheckSalary(Salary: string): Boolean;
  139. var
  140.    Sal, Er: Integer;
  141.    IsValid: Boolean;
  142. begin
  143.    IsValid := True;
  144.    if Length(Salary) = 0 then
  145.    begin
  146.       IsValid := False;
  147.    end
  148.    else
  149.    begin
  150.       Val(Salary, Sal, Er);
  151.       if Er <> 0 then
  152.       begin
  153.          IsValid := False;
  154.       end
  155.    end;
  156.    CheckSalary := IsValid;
  157. end;
  158.  
  159. function IsCorrect(const Name, Department, BirthYear, Experience, Post, Salary
  160.                                                             : string): Boolean;
  161. var
  162.    BYear, Er, Sal: Integer;
  163.    Exp: Byte;
  164.    IsValid: Boolean;
  165. begin
  166.    IsValid := True;
  167.    //Проверка фамилии
  168.    if Length(Name) = 0 then
  169.    begin
  170.       IsValid := False;
  171.    end;
  172.    //Проверка года
  173.    if IsValid then
  174.       IsValid := CheckYear(BirthYear, BYear);
  175.    //Проверка стажа
  176.    if IsValid then
  177.       IsValid := CheckExperience(Experience, BYear);
  178.    //Проверка зарплаты
  179.    if IsValid then
  180.       IsValid := CheckSalary(Salary);
  181.    //Проверка отдела
  182.    if IsValid then
  183.       if Length(Department) = 0 then
  184.        begin
  185.           IsValid := False;
  186.        end;
  187.    //Проверка должности
  188.    if IsValid then
  189.       if Length(Post) = 0 then
  190.       begin
  191.          IsValid := False;
  192.       end;
  193.    IsCorrect := IsValid;
  194. end;
  195.  
  196. function DbOpen(const Path: string): Boolean;
  197. var
  198.    Temp: TWorker;
  199. begin
  200.    AssignFile(DbFile, Path);
  201.    {$I-}
  202.       Reset(DbFile);
  203.    {$I+}
  204.    if IOResult = 0 then
  205.    begin
  206.       IsOpen := True;
  207.       while not EOF(DbFile) and (IsOpen) do
  208.          try
  209.             Read(DbFile, Temp);
  210.             IsOpen := IsCorrect(Temp.Name, Temp.Department, IntToStr(Temp.BirthYear),
  211.                IntToStr(Temp.Experience), Temp.Post, IntToStr(Temp.Salary));
  212.             if not IsOpen then
  213.             begin
  214.                MessageDlg('Ошибка! Файл содержит некорректные данные', mtError, [mbOk], 0);
  215.             end;
  216.          except
  217.             IsOpen := False;
  218.             MessageDlg('Ошибка! В файле содержатся некорректные данные.', mtError, [mbOk], 0);
  219.          end;
  220.       WorkersCount := FileSize(DbFile);
  221.    end
  222.    else
  223.    begin
  224.       MessageDlg('Ошибка! Файл невозможно открыть', mtError, [mbOk], 0);
  225.       IsOpen := False;
  226.    end;
  227.    DbOpen := IsOpen;
  228. end;
  229.  
  230. procedure ReadFile();
  231. var
  232.    i: Integer;
  233. begin
  234.    SetLength(Workers, WorkersCount);
  235.    Seek(DbFile, 0);
  236.    for i := 0 to High(Workers) do
  237.       Read(DbFile, Workers[i]);
  238. end;
  239.  
  240. procedure FillTable(Table: TStringGrid);
  241. var
  242.    i: Integer;
  243. begin
  244.    Table.RowCount := WorkersCount + 1;
  245.    if Table.RowCount > 1 then
  246.       for i := 1 to Table.RowCount do
  247.       begin
  248.          Table.Cells[0, i] := IntToStr(i);
  249.          Table.Cells[1, i] := Workers[i - 1].Name;
  250.          Table.Cells[2, i] := Workers[i - 1].Department;
  251.          Table.Cells[3, i] := IntToStr(Workers[i - 1].BirthYear);
  252.          Table.Cells[4, i] := IntToStr(Workers[i - 1].Experience);
  253.          Table.Cells[5, i] := Workers[i - 1].Post;
  254.          Table.Cells[6, i] := IntToStr(Workers[i - 1].Salary);
  255.       end
  256.    else
  257.    begin
  258.       Table.RowCount := 2;
  259.       Table.Cells[0, 1] := '';
  260.       Table.Cells[1, 1] := '';
  261.       Table.Cells[2, 1] := '';
  262.       Table.Cells[3, 1] := '';
  263.       Table.Cells[4, 1] := '';
  264.       Table.Cells[5, 1] := '';
  265.       Table.Cells[6, 1] := '';
  266.    end;
  267.    Table.FixedRows := 1;
  268. end;
  269.  
  270. function CheckName(const Name: string): Boolean;
  271. var
  272.    Ending: string;
  273.    IsCorrect: Boolean;
  274. begin
  275.    Ending := Copy(Name, Length(Name) - 3, 4);
  276.    if Ending = '.dat' then
  277.       IsCorrect := True
  278.    else
  279.       IsCorrect := False;
  280.    CheckName := IsCorrect;
  281. end;
  282.  
  283.  
  284. procedure TEugenesDB.FormCreate(Sender: TObject);
  285. var
  286.    UserFile: TextFile;
  287. begin
  288.    sgDataTable.Cells[0, 0] := '№';
  289.    sgDataTable.Cells[1, 0] := 'Фамилия';
  290.    sgDataTable.Cells[2, 0] := 'Отдел';
  291.    sgDataTable.Cells[3, 0] := 'Год рождения';
  292.    sgDataTable.Cells[4, 0] := 'Стаж работы';
  293.    sgDataTable.Cells[5, 0] := 'Должность';
  294.    sgDataTable.Cells[6, 0] := 'Оклад';
  295.    IsOpen := False;
  296.    RecNumber := -1;
  297. end;
  298.  
  299. procedure TEugenesDB.btAddRecordClick(Sender: TObject);
  300. begin
  301.    CorrectOrAdd := caAdd;
  302.    AddWorker.Show;
  303. end;
  304.  
  305. procedure TEugenesDB.btReloadClick(Sender: TObject);
  306. begin
  307.    FillTable(sgDataTable);
  308. end;
  309.  
  310. procedure TEugenesDB.btDeleteClick(Sender: TObject);
  311. var
  312.    i, Choice: Integer;
  313. begin
  314.    if WorkersCount > 0 then
  315.       if RecNumber = -1 then
  316.          MessageDlg('Пожалуйста, выберите запись для удаления', mtWarning, [mbOk], 0)
  317.       else
  318.       begin
  319.          Choice := MessageDlg('Вы точно хотите удалить запись?', mtConfirmation, [mbYes, mbNo], 0);
  320.          if Choice = mrYes then
  321.          begin
  322.             for i := RecNumber to (High(Workers) - 1) do
  323.                Workers[i] := Workers[i + 1];
  324.             SetLength(Workers, High(Workers));
  325.             Dec(WorkersCount);
  326.             RecNumber := -1;
  327.             btReload.Click;
  328.          end;
  329.       end;
  330. end;
  331.  
  332. procedure TEugenesDB.sgDataTableSelectCell(Sender: TObject; ACol,
  333.   ARow: Integer; var CanSelect: Boolean);
  334. begin
  335.    RecNumber := ARow - 1;
  336. end;
  337.  
  338. procedure TEugenesDB.btCorrectClick(Sender: TObject);
  339. begin
  340.    if WorkersCount > 0 then
  341.       if RecNumber = -1 then
  342.          MessageDlg('Пожалуйста, выберите запись для корректирования', mtWarning, [mbOk], 0)
  343.       else
  344.       begin
  345.          CorrectOrAdd := caCorrect;
  346.          AddWorker.Show;
  347.       end;
  348. end;
  349.  
  350. procedure TEugenesDB.btShowRetClick(Sender: TObject);
  351. begin
  352.    ShowPensioners.Show
  353. end;
  354.  
  355. procedure TEugenesDB.btAvrExpClick(Sender: TObject);
  356. begin
  357.    ShowAverageExperience.Show;
  358. end;
  359.  
  360. procedure TEugenesDB.ItemHelpClick(Sender: TObject);
  361. const
  362.    TextA1 = 'Чтобы посмотреть список работников пенсионного возраста';
  363.    TextA2 = 'с указанием стажа работы нажмите "Пенсия"';
  364.    TextB1 = 'Чтобы посмотреть средний стаж работающих в определённом отделе';
  365.    TextB2 = 'нажмите "Ср. стаж" и далее в поле "отдел" введите название';
  366.    TextB3 = 'требуемого отдела';
  367. begin
  368.    MessageDlg(TextA1 + #10#13 + TextA2 + #10#13 + TextB1 + #10#13 + TextB2 + #10#13 + TextB3, mtInformation, [mbOk], 0);
  369. end;
  370.  
  371. procedure TEugenesDB.ItemAuthorNameClick(Sender: TObject);
  372. begin
  373.    MessageDlg('Данная программа разработана Трахановым Евгением,' + #10#13 + 'студентом группы №851001', mtInformation, [mbOk], 0);
  374. end;
  375.  
  376. procedure TEugenesDB.ItemTaskClick(Sender: TObject);
  377. const
  378.    TextA = 'Данная программа выводит список сотрудников пенсионного возраста';
  379.    TextB = 'а также средний стаж, работающих в заданном отделе';
  380. begin
  381.    MessageDlg(TextA + #10#13 + TextB, mtInformation, [mbOk], 0);
  382. end;
  383.  
  384. procedure TEugenesDB.ItemOpenClick(Sender: TObject);
  385. var
  386.    IsCorrect: Boolean;
  387. begin
  388.    if OpenFile.Execute then
  389.    begin
  390.       Path := OpenFile.FileName;
  391.       IsCorrect := CheckName(Path);
  392.       if not IsCorrect then
  393.          MessageDlg('Ошибка! Данный файл не соответсвует формату.', mtError, [mbOk], 0)
  394.       else
  395.          if DbOpen(Path) then
  396.          begin
  397.             ReadFile;
  398.             FillTable(sgDataTable);
  399.          end;
  400.    end;
  401. end;
  402.  
  403. procedure TEugenesDB.ItemSaveClick(Sender: TObject);
  404. var
  405.    i: Integer;
  406.    IsCorrect: Boolean;
  407. begin
  408.    if SaveFile.Execute then
  409.    begin
  410.       Path := SaveFile.FileName;
  411.       IsCorrect := CheckName(Path);
  412.       if IsCorrect then
  413.       begin
  414.          AssignFile(DbFile, Path);
  415.          Rewrite(DbFile);
  416.          for i := 0 to High(Workers) do
  417.             Write(Dbfile, Workers[i]);
  418.          MessageDlg('Файл сохранён', mtInformation, [mbOk], 0);
  419.       end
  420.       else
  421.       begin
  422.          AssignFile(DbFile, Path + '.dat');
  423.          Rewrite(DbFile);
  424.          for i := 0 to High(Workers) do
  425.             Write(Dbfile, Workers[i]);
  426.          MessageDlg('Файл сохранён', mtInformation, [mbOk], 0);
  427.       end;
  428.    end;
  429. end;
  430.  
  431. procedure TEugenesDB.FormClose(Sender: TObject; var Action: TCloseAction);
  432. var
  433.    Choice: Byte;
  434. begin
  435.    Choice := MessageDlg('Вы действительно хотите выйти?' + #10#13 + '(Все несохранённые данные будут утрачены)', mtConfirmation, [mbYes, mbNo], 0);
  436.    if Choice = mrNo then
  437.       Action := caNone;
  438. end;
  439.  
  440. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement