Програма відповідає поставленій задачі. Всі функції та процедури працюють правильно і без помилок. Сортування даних виконується правильно без будь-яких помилок. Пошук проходить правильно, а також пошук серед вже знайдених робітників теж правильний і не містить помилок.
Для розробки даного проекту потрібно було спочатку проаналізувати реалізацію програми визначити структури даних, функціональні можливості програми. Для створення програми використовувалось середовище програмування BorlandDelphi7. Дані про робітників зберігаються в типізований файл, а при завантажені файлу в програму дані записуються в масив записів, а вже програма працює з цим масивом.
В програмі є такі функції як:
1. Завантаження
2. Збереження
3. Додавання нових робітників
4. Зміна інформації про вже існуючих робітників
5. Видалення робітників
6. Сортування робітників за багатьма критеріями
7. Пошук працівників за багатьма критеріями, який виконано в вигляді фільтру.
В кожного працівника є багато полів з інформацією про нього, що спрощує облік робітників і пошук серед інших робітників.
В ході розробки було оптимізовано роботу програми та максимально спрощено інтерфейс програми.
Було досягнуто досить непоганої функціональності програми відносно аналогів.
unit KadrUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls, Menus, XPMan;
type
Data=record
D: Byte;
M: Byte;
Y: Integer;
end;
TForm1 = class(TForm)
StringGrid1: TStringGrid;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
GroupBox1: TGroupBox;
GroupBox2: TGroupBox;
Button1: TButton;
Button2: TButton;
Button3: TButton;
OpenDialog: TOpenDialog;
SaveDialog: TSaveDialog;
Button4: TButton;
GroupBox3: TGroupBox;
ComboBox1: TComboBox;
Button5: TButton;
GroupBox4: TGroupBox;
CheckBox1: TCheckBox;
Button6: TButton;
Button7: TButton;
ComboBox2: TComboBox;
ComboBox3: TComboBox;
XPManifest1: TXPManifest;
function GetData(S: String): Data;
procedure SaveToFile(FileName: String);
procedure LoadFromFile(FileName: String);
function DataToStr(D: Data): String;
procedure FormCreate(Sender: TObject);
procedure RecToRow(Index,Row: Integer);
procedure RefreshList;
procedure Button1Click(Sender: TObject);
procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure StringGrid1DblClick(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
procedure CheckBox1Click(Sender: TObject);
procedure Button7Click(Sender: TObject);
procedure ComboBox3KeyPress(Sender: TObject; var Key: Char);
procedure ComboBox3Change(Sender: TObject);
procedure ComboBox2Change(Sender: TObject);
procedure ComboBox2KeyPress(Sender: TObject; var Key: Char);
function FindInRec(Index: Integer): Integer;
procedure Button6Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
Kadr=record
TabN: Integer; // Табельний номер
LastName: String [255] ; // Прізвище
Name: String [255] ; // Ім’я
Patronymic: String [255] ; // По Батькові
BirthData: Data; // Дата народження
BirthPlace: String [255] ; // Місце народження
Stat: Boolean; // Стать
IndCode: String [10] ; // Ідентифікаційний код
ReceptionData: Data; // Дата прийому на роботу
Experience: Integer; // Стаж
Exempt: Boolean; // Звільнений
LiberationData: Data; // Дата звільнення
PositionName: String [255] ; // Назва посади
DepartmentName: String [255] ; // Назва відділу
DepartmentLeader: Boolean; // Керівник відділу
SubsectionName: String [255] ; // Назва підрозділу
SubsectionLeader: Boolean; // Керівник підрозділу
end;
var
Form1: TForm1;
F: File of Kadr;
Worker,Rezerv: array of Kadr;
CurFileName: String='';
WorkersCount: Integer=0;
RezervCount: Integer=0;
CurWorker: Integer=0;
ADD: Boolean;
implementation
uses WorkerUnit, RegUnit;
{$R *. dfm}
function TForm1. GetData(S: String): Data;
var i,j,P: Integer;
begin
Result. D: =0;
Result. M: =0;
Result. Y: =0;
P: =0; j: =1;
for i: =1 to Length(S) do
if S [i] ='. ' then begin
if P=1 then begin
Result. M: =Form2. STI(Copy(S,j, i-j));
j: =i+1;
if Copy(S,j,Length(S) - i-1) <>'' then
Result. Y: =Form2. STI(Copy(S,j,Length(S) - i));
end;
if P=0 then begin
Result. D: =Form2. STI(Copy(S,j, i-1));
INC(P); j: =i+1;
end;
end;
end;
procedure TForm1. SaveToFile(FileName: String);
var i: Integer;
begin
CurFileName: =FileName;
Caption: ='Кадровий облік - '+ExtractFileName(FileName);
AssignFile(F,FileName); ReWrite(F);
for i: =0 to WorkersCount-1 do
Write(F,Worker [i]);
CloseFile(F);
end;
procedure AddToCombo(S: Kadr);
var i: Integer;
A: Boolean;
begin
A: =True;
for i: =0 to Form2. ComboBox2. Items. Count-1 do
if S. SubsectionName=Form2. ComboBox2. Items. Strings [i] then begin
A: =False; Break;
end;
if A then Form2. ComboBox2. Items. Add(S. SubsectionName);
A: =True;
for i: =0 to Form2. ComboBox3. Items. Count-1 do
if S. DepartmentName=Form2. ComboBox3. Items. Strings [i] then begin
A: =False; Break;
end;
if A then Form2. ComboBox3. Items. Add(S. DepartmentName);
A: =True;
for i: =0 to Form2. ComboBox4. Items. Count-1 do
if S. PositionName=Form2. ComboBox4. Items. Strings [i] then begin
A: =False; Break;
end;
if A then Form2. ComboBox4. Items. Add(S. PositionName);
end;
procedure TForm1. LoadFromFile(FileName: String);
begin
WorkersCount: =0;
CurWorker: =WorkersCount-1;
SetLength(Worker,WorkersCount);
Form2. ComboBox2. Clear; Form2. ComboBox3. Clear; Form2. ComboBox4. Clear;
Form3. ListBox1. Clear; Form3. ListBox2. Clear; Form3. ListBox3. Clear;
CurFileName: =FileName;
Caption: ='Кадровий облік - '+ExtractFileName(FileName);
AssignFile(F,FileName); Reset(F);
while not EOF(F) do begin
INC(WorkersCount);
SetLength(Worker,WorkersCount);
Form2. ClearWorker(WorkersCount-1);
Read(F,Worker [WorkersCount-1]);
AddToCombo(Worker [WorkersCount-1]);
end;
Form3. ListBox1. Items: =Form2. ComboBox4. Items;
Form3. ListBox2. Items: =Form2. ComboBox3. Items;
Form3. ListBox3. Items: =Form2. ComboBox2. Items;
if WorkersCount>0 then
CurWorker: =0;
RefreshList;
CloseFile(F);
end;
function TForm1. DataToStr(D: Data): String;
begin
Result: =IntToStr(D. D) +'. '+IntToStr(D. M) +'. '+IntToStr(D. Y);
end;
procedure TForm1. FormCreate(Sender: TObject);
begin
StringGrid1. Cells [0,0]: ='№';
StringGrid1. Cells [1,0]: ='Таб. №';
StringGrid1. Cells [2,0]: ='Прізвище';
StringGrid1. Cells [3,0]: ='Ім’я';
StringGrid1. Cells [4,0]: ='По Батькові';
StringGrid1. Cells [5,0]: ='Ідн. код';
StringGrid1. Cells [6,0]: ='Дата прийому на роботу';
StringGrid1. Cells [7,0]: ='Стаж роботи';
StringGrid1. Cells [8,0]: ='Дата звільнення';
StringGrid1. Cells [9,0]: ='Назва посади';
StringGrid1. Cells [10,0]: ='Назва відділу';
StringGrid1. Cells [11,0]: ='Назва підрозділу';
end;
procedure TForm1. RecToRow(Index,Row: Integer);
begin
if Row<1 then Exit;
StringGrid1. Rows [Row]. Clear;
StringGrid1. Cells [0,Row]: =IntToStr(Row);
StringGrid1. Cells [1,Row]: =IntToStr(Worker [Index]. TabN);
StringGrid1. Cells [2,Row]: =Worker [Index]. LastName;
StringGrid1. Cells [3,Row]: =Worker [Index]. Name;
StringGrid1. Cells [4,Row]: =Worker [Index]. Patronymic;
StringGrid1. Cells [5,Row]: =Worker [Index]. IndCode;
StringGrid1. Cells [6,Row]: =DataToStr(Worker [Index]. ReceptionData);
StringGrid1. Cells [7,Row]: =IntToStr(Worker [Index]. Experience);
if Worker [Index]. Exempt then
StringGrid1. Cells [8,Row]: =DataToStr(Worker [Index]. LiberationData);
StringGrid1. Cells [9,Row]: =Worker [Index]. PositionName;
StringGrid1. Cells [10,Row]: =Worker [Index]. DepartmentName;
StringGrid1. Cells [11,Row]: =Worker [Index]. SubsectionName;
end;
procedure TForm1. RefreshList;
var i: Integer;
begin
if WorkersCount=0 then begin
StringGrid1. RowCount: =WorkersCount+2;
StringGrid1. Rows [1]. Clear;
Button2. Enabled: =False;
Button3. Enabled: =False;
Exit;
end;
Button2. Enabled: =True;
if not CheckBox1. Checked then
Button3. Enabled: =True;
StringGrid1. RowCount: =WorkersCount+1;
for i: =0 to WorkersCount-1 do begin
StringGrid1. Rows [i+1]. Clear;
StringGrid1. Cells [0, i+1]: =IntToStr(i+1);
StringGrid1. Cells [1, i+1]: =IntToStr(Worker [i]. TabN);
StringGrid1. Cells [2, i+1]: =Worker [i]. LastName;
StringGrid1. Cells [3, i+1]: =Worker [i]. Name;
StringGrid1. Cells [4, i+1]: =Worker [i]. Patronymic;
StringGrid1. Cells [5, i+1]: =Worker [i]. IndCode;
StringGrid1. Cells [6, i+1]: =DataToStr(Worker [i]. ReceptionData);
StringGrid1. Cells [7, i+1]: =IntToStr(Worker [i]. Experience);
if Worker [i]. Exempt then
StringGrid1. Cells [8, i+1]: =DataToStr(Worker [i]. LiberationData);
StringGrid1. Cells [9, i+1]: =Worker [i]. PositionName;
StringGrid1. Cells [10, i+1]: =Worker [i]. DepartmentName;
StringGrid1. Cells [11, i+1]: =Worker [i]. SubsectionName;
end;
end;
procedure TForm1. Button1Click(Sender: TObject);
begin
INC(WorkersCount);
SetLength(Worker,WorkersCount);
CurWorker: =WorkersCount-1;
Form2. ClearWorker(CurWorker);
if WorkersCount>=StringGrid1. RowCount then begin
StringGrid1. RowCount: =WorkersCount+1;
StringGrid1. Rows [WorkersCount]. Clear;
end;
ADD: =True;
Form2. ClearField;
Form2. Show;
end;
procedure TForm1. StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
CurWorker: =ARow-1;
end;
procedure TForm1. Button2Click(Sender: TObject);
begin
ADD: =False;
Form2. RecToForm(CurWorker);
Form2. Show;
end;
procedure TForm1. Button3Click(Sender: TObject);
begin
Form2. DelWorker(CurWorker);
end;
procedure TForm1. N2Click(Sender: TObject);
begin
if OpenDialog. Execute then
LoadFromFile(OpenDialog. FileName);
end;
procedure TForm1. N4Click(Sender: TObject);
begin
if SaveDialog. Execute then
SaveToFile(SaveDialog. FileName);
end;
procedure TForm1. Button4Click(Sender: TObject);
begin
Form3. Show;
end;
procedure TForm1. StringGrid1DblClick(Sender: TObject);
begin
if Button2. Enabled then
Button2. OnClick(Button2);
end;
procedure TForm1. N3Click(Sender: TObject);
begin
if CurFileName<>'' then
SaveToFile(CurFileName)
else N4. OnClick(N4);
end;
procedure TForm1. N5Click(Sender: TObject);
begin
Close;
end;
procedure TForm1. Button5Click(Sender: TObject);
var i,L: Integer;
A: Kadr;
begin
if WorkersCount<=1 then Exit;
L: =Trunc((WorkersCount-1) / 2);
for i: =0 to L do begin
A: =Worker [i] ;
Worker [i]: =Worker [WorkersCount-1-i] ;
Worker [WorkersCount-1-i]: =A;
end;
RefreshList;
end;
procedure SortByTabN; // Сортування за табельним номером
var i,j: Integer;
A: Kadr;
begin
for i: =0 to WorkersCount-2 do
for j: =i+1 to WorkersCount-1 do
if Worker [i]. TabN>Worker [j]. TabN then begin
A: =Worker [i] ;
Worker [i]: =Worker [j] ;
Worker [j]: =A;
end;
Form1. RefreshList;
end;
procedure SortByLastName; // Сортування за прізвищем
var i,j: Integer;
A: Kadr;
begin
for i: =0 to WorkersCount-2 do
for j: =i+1 to WorkersCount-1 do
if Worker [i]. LastName>Worker [j]. LastName then begin
A: =Worker [i] ;
Worker [i]: =Worker [j] ;
Worker [j]: =A;
end;
Form1. RefreshList;
end;
procedure SortByName; // Сортування за ім’ям
var i,j: Integer;
A: Kadr;
begin
for i: =0 to WorkersCount-2 do
for j: =i+1 to WorkersCount-1 do
if Worker [i]. Name>Worker [j]. Name then begin
A: =Worker [i] ;
Worker [i]: =Worker [j] ;
Worker [j]: =A;
end;
Form1. RefreshList;
end;
procedure SortByPatronymic; // Сортування по Батькові
var i,j: Integer;
A: Kadr;
begin
for i: =0 to WorkersCount-2 do
for j: =i+1 to WorkersCount-1 do
if Worker [i]. Patronymic>Worker [j]. Patronymic then begin
A: =Worker [i] ;
Worker [i]: =Worker [j] ;
Worker [j]: =A;
end;
Form1. RefreshList;
end;
function DataToInt(A: Data): Integer; // Переведення дати в дні
begin
Result: =A. Y*365+A. M*31+A. D;
end;
procedure SortByBirdthDay; // Сортування за датою народження
var i,j: Integer;
A: Kadr;
begin
for i: =0 to WorkersCount-2 do
for j: =i+1 to WorkersCount-1 do
if DataToInt(Worker [i]. BirthData) >DataToInt(Worker [j]. BirthData) then begin
A: =Worker [i] ;
Worker [i]: =Worker [j] ;
Worker [j]: =A;
end;
Form1. RefreshList;
end;
procedure SortByIndCode; // Сортування за ідентифікаційним кодом
var i,j: Integer;
A: Kadr;
begin
for i: =0 to WorkersCount-2 do
for j: =i+1 to WorkersCount-1 do
if Worker [i]. IndCode>Worker [j]. IndCode then begin
A: =Worker [i] ;
Worker [i]: =Worker [j] ;
Worker [j]: =A;
end;
Form1. RefreshList;
end;
procedure SortByReceptionData; // Сортування за датою прийому на роботу
var i,j: Integer;
A: Kadr; begin
for i: =0 to WorkersCount-2 do
for j: =i+1 to WorkersCount-1 do
if DataToInt(Worker [i]. ReceptionData) >DataToInt(Worker [j]. ReceptionData) then begin
A: =Worker [i] ;
Worker [i]: =Worker [j] ;
Worker [j]: =A;
end;
Form1. RefreshList;
end;
procedure SortByExperience; // Сортування за стажем