Кадровий облік

8



Зміст



	Вступ	2

	1. Аналітичний розділ	3

	2. Побудова інформаційно-математичної моделі задачі	3

	3. Алгоритм задачі	4

	4. Визначення структури даних	8

	5. Розробка інтерфейсу програми	10

	6. Складання коду програми	13

	7. Реалізація проекту у візуальному середовищі	15

	8. Аналіз програми	16

	9. Тестування програми	17

	10. Інструкції з експлуатації програми	19

	11. Аналіз отриманих результатів	20

	Висновок	23

	Додатки	24




Вступ



Сучасне життя важко зараз уявити без основи наукового прогресу, тобто комп’ютера. Комп’ютер стрімко увірвався в наше життя, швидкими темпами витісняючи раніше винайдені досягнення людства, причому такими ж самими швидкими темпами весь час змінюючись і удосконалюючись. Але комп’ютер це просто машина, яка не може працювати сама, для роботи комп’ютера використовують програми. 

Всі програми написані в тому чи іншому середовищі програмування. Складні програми великого об’єму пише не один програміст, а великі компанії де спеціалістів в галузі програмування деколи понад тисячу. В наш час існує багато різних середовищ програмування, тому невеликі програми можуть писати прості програмісти, або люди які володіють мовою будь якого середовища програмування. Зараз існує дуже багато програм написані такими людьми. 

Delphi - це одна з мов програмування. Через її простоту та функціональність вона є дуже популярною, до того ж в неї дуже зручний інтерфейс, що спрощує процес програмування. В Delphi є дуже багато стандартних компонентів за допомогою яких можна створювати програми для різних сфер життя. Від бухгалтерських програм до ігор. Ігри можуть бути любої складності і напрямку. До того ж Delphi дає змогу створювати компоненти самостійно потрібно тільки вміти. Середовище програмування Delphi дає змогу без великих зусиль писати великі та складні програми тому що це мова програмування високого рівня. Delphi є кількох версій: 2.0 це найстаріша версія, найновішою версією є Delphi 2007 випущена в цьому році. До речі Windows Commander який був перейменований на Total Commander був написаний на Delphi 2.0. 


1. Аналітичний розділ



Завдання цього курсового проекту розробити програму "Кадровий облік". Вона має багато відомих і невідомих аналогів. Із знайдених аналогів розробці даного курсового проекту найбільше підходить програма "Кадри плюс 2", а отже програма курсового проекту буде розроблятись спираючись на цю програму. Інтерфейс та функції програми частино буде взято з "Кадри плюс 2". 

В програмі буде здійснена можливість редагування файлу, а також його збереження і подальше завантаження. Під редагуванням розуміється збільшення персоналу підприємства, тобто додавання нових працівників, зміна даних про вже доданих (існуючих) працівників, якщо дані про деяких з них вже застарілі, а також видалення працівників, чи їх звільнення. 

Так як кожен працівник має свою посаду чи належить до певного відділу чи підрозділу то для створення нових або редагування існуючих категорій буде передбачено окреме вікно. 

Також в програмі має бути передбачено сортування та пошук працівників за декількома критеріями, чим більше цих параметрів тим краще сортування і точніший пошук. Програми такого роду дуже потрібні на підприємствах для обліку працюючого персоналу. 



2. Побудова інформаційно-математичної моделі задачі



1) Постановка задачі: 

Дані зберігати в типизованому файлі. Сортування та пошук за декількома критеріями. 

Для функціонування програми буде створено новий тип даних, який буде вміщати в себе всю інформацію про робітника (табельний номер, ПІБ, дата народження, дата прийняття на роботу, стаж, і т.д.). Стаж роботи визначається різницею між поточною датою і датою прийняття на роботу, якщо працівник звільнений то стаж визначається як різниця між датою звільнення і датою прийняття на роботу. Має бути передбачена фільтрація натиснених клавіш для деяких полів вводу, н. д.: Дата народження, табельний номер. 

Програма повинна зберігати дані в поточний файл якщо він вже існує, натисканням кнопки збереження в головному меню, або зберігати дані в довільний файл, який вибере користувач натисканням кнопки "Зберегти як", також користувач зможе завантажити раніше збережений файл для перегляду або зміни його вмісту. 

Кожному працівнику можна буде назначити будь яку посаду, відділ чи підрозділ. Для цього буде передбачена можливість створення нових посад, відділів чи підрозділів, зміна чи видалення існуючих. 

Сортування персоналу можна буде здійснювати за багатьма критеріями. Сортувати можна буде як по зростанню так і по спаданню. 

Пошук працівника серед всього персоналу буде виконаний в вигляді покрокового фільтру, тобто спочатку наприклад пошук по табельному номері, а потім пошук серед знайденого ще по якомусь критерію і так поки не залишаться бажані працівники. 



3. Алгоритм задачі



Алгоритм розв'язання задачі графічно відображає логіку програми і наводиться у вигляді спрощеної схеми алгоритму та блок-схем етапів. 

	

Очищення 

результату

2

Від 1 до довжини рядка

3

Вхід

1

Якщо символ крапка

4

Це друга крапка

5

Так

Записуємо номер

 місяця і рік

6

Так

Це перша крапка

7

Записуємо номер

 дня

8

Так

Вихід

9

Ні

Ні

Ні

Блок-схема 1 - Процедура переведення рядка в дату. 






Вхід

1

Від i=0 до кількості робітників-2

2

Від 

j=i+1 до кількості робітників-1

3

1-ий таб. номер  більший ніж 2-ий

4

Поміняти робітників місцями

5

Вихід

6

Так

Ні

Блок-схема 2 - Процедура сортування за табельним номером. 






Вхід

1

Поки І менше рівне кількості працівників-1

3

І=0

Починаємо пошук робітників з першого

2

Ім’я робітника відповідає шуканому

4



Видаляємо робітника

із списку

5

Вихід

6

Так

Ні

Блок-схема 3 - Процедура пошуку працівника за ім’ям. 






Вхід

1



Збільшуємо кількість робітників

2



Робимо останнього

робітника поточним

3

Рядків в таблиці вистачає

4



Додаємо рядки в таблицю

5



Очищуємо останній рядок в таблиці

6



Показуємо вікно редагування

7

Вихід

8

Так

Ні

Блок-схема 4 - Процедура додавання нового робітника. 



4. Визначення структури даних



В програмі були використані змінні типів наведених в Таблиці 1



Таблиця 1. Типи змінних та їх призначення. 

Тип

Опис типу

Byte

Цілочисельний тип діапазоном від 0 до 255

Integer

Цілочисельний тип діапазоном від - 32768 до 32767

Data

Власний тип для збереження дати (день, місяць, рік) 

Kadr

Власний тип для збереження інформації про робітника

File of Kadr

Використовується типизований файл

Boolean

Логічний тип, який має два значення: true або false

String

Рядок символів діапазоном від 1 до 255 символів



Деякі змінні, що використовуються в програмі, їх тип та призначення вказані в Таблиці 2. 



Таблиця 2. Деякі змінні, їх типи та призначення у програмі. 

Змінна

Тип

Пояснення їх дії у програмі

F

Типизований файл, типу Kadr

Для збереження інформації про робітників в файл

Worker

Динамічний масив робітників

Зберігає всю інформацію про робітників

Rezerv

Динамічний масив робітників

Резервний масив для тимчасового збереження інформації про робітників (використовується при фільтрації працівників) 

WorkersCount

Зміна типу Integer

Зберігає кількість робітників

RezervCount

Зміна типу Integer

Зберігає кількість працівників в резервному масиві

CurWorker

Зміна типу Integer

В цій змінній знаходиться номер робітника над яким проводяться операції




5. Розробка інтерфейсу програми 



Основна форма програми називається Form1 і служить для відображення списку працівників. 





Рисунок 1. Головна форма проекту. 



На формі містяться такі компоненти як: 

TStringGrid, TButton, TGroupBox, TComboBox, TCheckBox, TMainMenu, TOpenDialog, TSaveDialog, TXPManifest. 

Компонент StringGrid представляє собою таблицю і служить для відображення списку всіх, або шуканих робітників. 

У нього були зміненні такі опції: 

Align = alClient

Options [goColSizing] = True

Компонент Button представляє собою кнопку і при натисканні служить для виконання тої чи іншої операції. 

Компонент GroupBox служить для об’єднання об’єктів в групи. В GroupBox1 були зміненні такі параметри як: 

Align = alBottom

Caption = Редагування

Компонент ComboBox представляє собою випадаючий список, використовується для збереження списку рядків. 

Компонент CheckBox - прапорець стану, має два стани: встановлений і не встановлений, свій стан зберігає в змінній Checked. 

Компонент MainMenu це головне меню програми. 

Компонент OpenDialog - для вибору файлів, відкриває діалогове вікно для вибору файлів з жорстких дисків чи інших носіїв, можна встановлювати фільтрування по типу або імені файлів, всі фільтри потрібно записувати в параметрі Filter, також можна вмикати мультивибір для того, щоб вибирати декілька файлів одночасно, в даній програмі ця властивість вимкнена. 

Компонент SaveDialog - для вибору файлу в який буде збережена інформація про робітників, цей елемент аналогічний попередньому тільки він призначений для збереження. 

Компонент XPManifest призначений для підстроювання графічного інтерфейсу програми під стиль встановлений в операційній системі. 

Друга форма програми називається Form2 і призначена для редагування інформації про робітника. 




Рисунок 2. Форма редагування. 



На даній формі розміщені поля типу TEdit в них можна ввести один рядок текстової інформації. 

Також на цій формі є компоненти типу TCheckBox. CheckBox1 з заголовком "Звільнений" призначений для завдання статусу робітника (звільнений чи ні). Якщо він буде знаходитись в стані звільнений то компоненти ComboBox1 (Підрозділ), ComboBox2 (Відділ), ComboBox3 (Посада) будуть не активні, щоб не можна було міняти посаду робітнику, а також поле "Дата звільнення" буде активним щоб можна було ввести дату звільнення. 

Якщо робітник не звільнений то стаж вираховується різницею між поточною датою і датою прийняття на роботу, а якщо звільнений то різницею між датою звільнення і датою прийняття на роботу. 

Якщо поля "Підрозділ", "Відділ" чи "Посада" пусті то при натисканні на них відкриється вікно де їх можна створити. 


Форма редагування категорій. 



Рисунок 3. Форма редагування категорій посад, відділів, підрозділів. 



Ця форма служить для створення нових, редагування чи видалення існуючих "посад", "відділів", "підрозділів". 

На формі присутні 3 поля: 

Назва посади: для додавання нової назви посади

Назва відділу: для додавання нової назви відділу

Назва підрозділу: для додавання нової назви підрозділу

Також на формі є три компоненти TListBox вони служать для збереження і відображення існуючих і доданих назв "посад", "відділів" чи "підрозділів". 

Для видалення потрібної посади, відділу чи підрозділу потрібно вибрати її в списку і натиснути клавішу Del. 

Додані назви автоматично зберігаються, тому після редагування потрібно просто закрити вікно. Змінені назви автоматично додадуться в список в вікні редагування інформації про працівника. 



6. Складання коду програми



В коді програми містяться наступні процедури: 

Модуль головної форми: 

Функція GetData - вона має один параметр типу рядок, а її результатом буде дата, вона переводить рядок в дату; 

Процедура SaveToFile - зберігає інформацію з масиву в файл; 

Процедура AddToCombo - додає назви посад, відділів і підрозділів з масиву в список; 

Процедура LoadFromFile - завантажує інформацію з вибраного файлу в програму (в масив); 

Функція DataToStr - переводить дату в рядок; 

Процедура RecToRow - заповнює заданий рядок таблиці, записом з заданим номером з масиву; 

Процедура RefreshList - оновлює таблицю, заповнює її наново записами з масиву; 

Процедура Button1Click - додавання нового робітника, відкриває вікно для заповнення полів інформацією про робітника; 

Процедура StringGrid1SelectCell - встановлює номер поточного (вибраного) робітника; 

Процедура Button2Click - відкриває вікно редагування інформації про працівника для її зміни; 

Процедура N2Click - відкриває діалогове вікно для вибору файлу який потрібно завантажити в програму; 

Процедура N4Click - відкриває діалогове вікно для вибору файлу в який буде збережена інформація про працівників; 

Процедура Button5Click - інвертує послідовність працівників; 

Процедура SortByTabN - сортування за табельним номером; 

Функція DataToInt - переводить дату в кількість днів; 

Процедура ComboBox1Change - сортує робітників по вибраному критерію; 

Процедура FindByTabN - пошук по табельному номеру; 

Процедура Button6Click - шукає робітника по вибраному критерію; 

Модуль редагування інформації про робітника: 

Функція STI - альтернатива StrToInt тільки при помилці переведення повертає 0; 

Функція SUB_Data - віднімання двох дат; 

Процедура ClearField - очищення всіх полів на формі; 

Процедура FormToRec - переносить значення всіх полів форми в відповідні змінні масиву; 

Функція ItemIndex - шукає рядок в списку і повертає його позицію; 

Процедура RecToForm - заносить дані з масиву в відповідні поля на формі; 

Процедура ClearWorker - очищення інформації про заданого робітника; 

Процедура DelWorker - видаляє вибраного робітника; 

Функція Verification - перевіряє чи заповнені всі поля, якщо ні то надсилає повідомлення; 

Модуль редагування категорій: 

Процедура Edit1KeyDown - додає нову назву посади; 

Процедура Edit2KeyDown - додає нову назву відділу; 

Процедура Edit3KeyDown - додає нову назву підрозділу; 

Процедура ListBox1KeyDown - видаляє вибрану посаду; 

Процедура ListBox2KeyDown - видаляє вибраний відділ; 

Процедура ListBox3KeyDown - видаляє вибраний підрозділ; 

Код програми наведений у додатку А. 



7. Реалізація проекту у візуальному середовищі



Реалізація проекту у візуальному середовищі передбачає наступні етапи: 

Запустити на виконання Delphi 7 для створення нового проекту. 

На створеній формі розмістити компоненти як вказано на малюнку 1. 

В формі властивість WindowState поставити "wsMaximized"; 

Створити ще 2 додаткових форм (File->New->Form). 

В інших формах властивість Position поставити рівною "poMainFormCenter". 

Властивість компонента StringGrid1 Align поставити рівною "alClient", а в GroupBox1 рівною "alBottom". 

На форму помістити елементи, що показані на Рисунках 1,2,3 та змінюємо їх відповідні параметри, як вказано в поясненнях. 

Ввести програмний код, який наведений у додатку А, у відповідні Unit. 

Компілювати проект. 

Зберегти проект. 



8. Аналіз програми



В основі програми лежить робота з типізованими файлами, масивами, масивами записів. 

Проект складається з трьох форм. Всі форми зображені на рисунках. 

При запуску програми перед користувачем з’явиться головна форма де він може виконати наступні дії: 

Почати створювати нові записи про робітників. 

Завантажити збережений раніше файл з записами про робітників. 

Додавати, змінювати, або редагувати записи про робітників. 

Сортувати за потрібними йому критеріями. 

Здійснити пошук за вибраними критеріями, покроково для досягнення потрібного результату. 

Зберегти записи в поточний, або в будь-який інший файл. 

Програма повністю відповідає поставленій задачі, виконані всі пункти завдання, забезпечено зберігання в типізований файл, а також подальше завантаження збережених файлів. 

В програмі є такі плюси як: 

Сортування за 12 критеріями в одному, або іншому напрямку. 

Покроковий пошук (фільтрація) за 17 критеріями, такий пошук дає змогу шукати серед знайденого по іншому критерію. 

Також в програмі є недоліки: 

Мала функціональність відносно відомих аналогів. 



9. Тестування програми



В ході тестування було виправлено виявлені помилки та усунено недоліки роботи програми порівняно з початковою версією. Також було максимально спрощено та удосконалено інтерфейс програми. 





Рисунок 4. Програма при завантажені файлу. 



При відкриті чи завантажені файлів обліку, не було знайдено ні однієї помилки за весь час. 



Рисунок 5. Програма з завантаженим файлом. 





Рисунок 6. Редагування інформації про робітника. 



Було додано кнопку оновити, для оновлення стажу роботи відносно поточної дати. 




Рисунок 7. Програма при програмно згенерованій грі. 



Було додано можливість видалення існуючих категорій. 

Зараз в програмі всі недоліки виправлені, програма працює нормально і без помилок. 



10. Інструкції з експлуатації програми



Для нормальної роботи гри до комп’ютера висуваються такі мінімальні вимоги: 

Pentium 100 MHz; 

1 Mb оперативної пам’яті; 

Операційну систему Windows 95/98/2000/XP / Vista; 

600 Кб вільного місця на жорсткому диску; 

Відеокарта на 8 MB; 

Мишка, клавіатура. 

Щоб програма працювала потрібно скопіювати файл “Kadrovuy_Oblik. exe” на комп’ютер. Запуск програми здійснюється за допомогою файлу “Kadrovuy_Oblik. exe”. Для додавання нового робітника потрібно натиснути кнопку "Додати", на панелі редагування внизу вікна. Для редагування інформації про робітника, потрібно натиснути кнопку "Змінити" на панелі редагування, або 2 рази клацнути на потрібному робітнику. Також потрібного робітника можна видалити із списку, для цього потрібно вибрати працівника із списку, клавішами чи натисканням лівої кнопки мишки і натиснути кнопку "Видалити". В програмі можна додавати нові посади, відділи чи підрозділи, для цього потрібно натиснути кнопку "Редагування категорій" на панелі внизу і в новому вікні вписати нову посаду, відділ чи підрозділ. Також існуючі категорії (посади, відділи, підрозділи) можна видаляти для цього потрібно натиснути кнопку "Редагування категорій" і вибрати в списку непотрібну категорію і натиснути клавішу Del. Також робітників можна сортувати за багатьма критеріями, а для сортування в іншому напрямку потрібно натиснути кнопку "Інвертувати" на панелі "Сортування". В програмі присутній пошук робітників за всіма критеріями, які є в робітників. Пошук виконаний в вигляді фільтру, що спрощує пошук робітників. За об’ємом програма невелика тому легко влізе на дискету чи інший носій інформації. 



11. Аналіз отриманих результатів



Для даного курсового проекту було розроблено програму яка дозволяє вести облік робітників на підприємстві. В програмі є можливість додавання робітників, редагування інформації про них, і їх видалення. Є можливість збереження і завантаження даних про робітників. Присутнє сортування і пошук робітників за декількома критеріями. Створення нових посад, відділів чи підрозділів. 





Рисунок 8. Завантажений файл


Рисунок 9. Дані сортовано за табельним номером



Рисунок 10. Ввімкнено режим пошуку



В режимі пошуку кнопки "Додати" і "Видалити" не доступні. 





Рисунок 11. Був проведений пошук по назві відділу




Програма відповідає поставленій задачі. Всі функції та процедури працюють правильно і без помилок. Сортування даних виконується правильно без будь-яких помилок. Пошук проходить правильно, а також пошук серед вже знайдених робітників теж правильний і не містить помилок. 




Висновок



Для розробки даного проекту потрібно було спочатку проаналізувати реалізацію програми визначити структури даних, функціональні можливості програми. Для створення програми використовувалось середовище програмування Borland Delphi7. Дані про робітників зберігаються в типізований файл, а при завантажені файлу в програму дані записуються в масив записів, а вже програма працює з цим масивом. 

В програмі є такі функції як: 

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; // Сортування за стажем

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]. Experience>Worker [j]. Experience then begin

A: =Worker [i] ; 

Worker [i]: =Worker [j] ; 

Worker [j]: =A; 

end; 

Form1. RefreshList; 

end; 

procedure SortByLiberationData; // Сортування за датою звільнення

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]. LiberationData) >DataToInt(Worker [j]. LiberationData) then begin

A: =Worker [i] ; 

Worker [i]: =Worker [j] ; 

Worker [j]: =A; 

end; 

Form1. RefreshList; 

end; 

procedure SortByPositionName; // Сортування за назвою посади

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]. PositionName>Worker [j]. PositionName then begin

A: =Worker [i] ; 

Worker [i]: =Worker [j] ; 

Worker [j]: =A; 

end; 

Form1. RefreshList; 

end; 

procedure SortByDepartmentName; // Сортування за назвою відділу

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]. DepartmentName>Worker [j]. DepartmentName then begin

A: =Worker [i] ; 

Worker [i]: =Worker [j] ; 

Worker [j]: =A; 

end; 

Form1. RefreshList; 

end; 

procedure SortBySubsectionName; // Сортування за назвою підрозділу

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]. SubsectionName>Worker [j]. SubsectionName then begin

A: =Worker [i] ; 

Worker [i]: =Worker [j] ; 

Worker [j]: =A; 

end; 

Form1. RefreshList; 

end; 

procedure TForm1. ComboBox1Change(Sender: TObject); 

begin

case ComboBox1. ItemIndex of

0: SortByTabN; 

1: SortByLastName; 

2: SortByName; 

3: SortByPatronymic; 

4: SortByBirdthDay; 

5: SortByIndCode; 

6: SortByReceptionData; 

7: SortByExperience; 

8: SortByLiberationData; 

9: SortByPositionName; 

10: SortByDepartmentName; 

11: SortBySubsectionName; 

end; 

end; 

procedure TForm1. CheckBox1Click(Sender: TObject); 

var i: Integer; 

begin

GroupBox4. Enabled: =CheckBox1. Checked; 

Button1. Enabled: =not CheckBox1. Checked; 

Button3. Enabled: =not CheckBox1. Checked; 

if CheckBox1. Checked then begin

RezervCount: =WorkersCount; 

SetLength(Rezerv,RezervCount); 

for i: =0 to RezervCount-1 do

Rezerv [i]: =Worker [i] ; 

end else begin

WorkersCount: =RezervCount; 

SetLength(Worker,WorkersCount); 

for i: =0 to WorkersCount-1 do

Worker [i]: =Rezerv [i] ; 

RefreshList; 

end; 

end; 

procedure TForm1. Button7Click(Sender: TObject); 

var i: Integer; 

begin

WorkersCount: =RezervCount; 

SetLength(Worker,WorkersCount); 

for i: =0 to WorkersCount-1 do

Worker [i]: =Rezerv [i] ; 

RefreshList; 

end; 

procedure TForm1. ComboBox3KeyPress(Sender: TObject; var Key: Char); 

begin

case ComboBox2. ItemIndex of

0,4,7,8,9,11: if not (Key in ['0'. '9',#8]) then Key: =#0; 

6,10,12,13,14,15,16: Key: =#0; 

end; 

end; 

procedure TForm1. ComboBox3Change(Sender: TObject); 

begin

if ComboBox2. ItemIndex in [4,8,11] then

if Length(ComboBox3. Text) in [2,5] then begin

ComboBox3. Text: =ComboBox3. Text+'. '; 

ComboBox3. SelStart: =Length(ComboBox3. Text); 

end; 

end; 

procedure TForm1. ComboBox2Change(Sender: TObject); 

begin

ComboBox3. Clear; 

ComboBox3. MaxLength: =0; 

case ComboBox2. ItemIndex of

0: ComboBox3. MaxLength: =5; 

4,7,8,11: ComboBox3. MaxLength: =10; 

9: ComboBox3. MaxLength: =2; 

6: ComboBox3. Items: =Form2. ComboBox1. Items; 

12: ComboBox3. Items: =Form2. ComboBox4. Items; 

13: ComboBox3. Items: =Form2. ComboBox3. Items; 

14: ComboBox3. Items: =Form2. ComboBox2. Items; 

10,15,16: begin

ComboBox3. Items. Add('Ні'); 

ComboBox3. Items. Add('Так'); 

end; 

end; 

end; 

procedure TForm1. ComboBox2KeyPress(Sender: TObject; var Key: Char); 

begin

Key: =#0; 

end; 

function TForm1. FindInRec(Index: Integer): Integer; 

var i: Integer; 

begin

Result: =-1; 

for i: =0 to RezervCount-1 do

if Worker [Index]. TabN=Rezerv [i]. TabN then begin

Result: =i; 

Exit; 

end; 

end; 

procedure FindByTabN; 

var i: Integer; 

begin

i: =0; 

while i<=WorkersCount-1 do begin

if Worker [i]. TabN<>Form2. STI(Form1. ComboBox3. Text) then begin

Form2. DelWorker(i); 

DEC(i); 

end; 

INC(i); 

end; 

Form1. RefreshList; 

end; 

procedure FindByLastName; 

var i: Integer; 

begin

i: =0; 

while i<=WorkersCount-1 do begin

if Worker [i]. LastName<>Form1. ComboBox3. Text then begin

Form2. DelWorker(i); 

DEC(i); 

end; 

INC(i); 

end; 

Form1. RefreshList; 

end; 

procedure FindByName; 

var i: Integer; 

begin

i: =0; 

while i<=WorkersCount-1 do begin

if Worker [i]. Name<>Form1. ComboBox3. Text then begin

Form2. DelWorker(i); 

DEC(i); 

end; 

INC(i); 

end; 

Form1. RefreshList; 

end; 

procedure FindByPatronymic; 

var i: Integer; 

begin

i: =0; 

while i<=WorkersCount-1 do begin

if Worker [i]. Patronymic<>Form1. ComboBox3. Text then begin

Form2. DelWorker(i); 

DEC(i); 

end; 

INC(i); 

end; 

Form1. RefreshList; 

end; 

procedure FindByBirthDay; 

var i: Integer; 

begin

i: =0; 

while i<=WorkersCount-1 do begin

if DataToInt(Worker [i]. BirthData) <>

DataToInt(Form1. GetData(Form1. ComboBox3. Text)) then begin

Form2. DelWorker(i); 

DEC(i); 

end; 

INC(i); 

end; 

Form1. RefreshList; 

end; 

procedure FindByBirthPlace; 

var i: Integer; 

begin

i: =0; 

while i<=WorkersCount-1 do begin

if Worker [i]. BirthPlace<>Form1. ComboBox3. Text then begin

Form2. DelWorker(i); 

DEC(i); 

end; 

INC(i); 

end; 

Form1. RefreshList; 

end; 

procedure FindByStat; 

var i: Integer; 

begin

i: =0; 

while i<=WorkersCount-1 do begin

if ORD(Worker [i]. Stat) <>Form1. ComboBox3. ItemIndex then begin

Form2. DelWorker(i); 

DEC(i); 

end; 

INC(i); 

end; 

Form1. RefreshList; 

end; 

procedure FindByIndCode; 

var i: Integer; 

begin

i: =0; 

while i<=WorkersCount-1 do begin

if Worker [i]. IndCode<>Form1. ComboBox3. Text then begin

Form2. DelWorker(i); 

DEC(i); 

end; 

INC(i); 

end; 

Form1. RefreshList; 

end; 

procedure FindByReceptionData; 

var i: Integer; 

begin

i: =0; 

while i<=WorkersCount-1 do begin

if DataToInt(Worker [i]. ReceptionData) <>

DataToInt(Form1. GetData(Form1. ComboBox3. Text)) then begin

Form2. DelWorker(i); 

DEC(i); 

end; 

INC(i); 

end; 

Form1. RefreshList; 

end; 

procedure FindByExperience; 

var i: Integer; 

begin

i: =0; 

while i<=WorkersCount-1 do begin

if Worker [i]. Experience<>Form2. STI(Form1. ComboBox3. Text) then begin

Form2. DelWorker(i); 

DEC(i); 

end; 

INC(i); 

end; 

Form1. RefreshList; 

end; 

procedure FindByExempt; 

var i: Integer; 

begin

i: =0; 

while i<=WorkersCount-1 do begin

if ORD(Worker [i]. Exempt) <>Form1. ComboBox3. ItemIndex then begin

Form2. DelWorker(i); 

DEC(i); 

end; 

INC(i); 

end; 

Form1. RefreshList; 

end; 

procedure FindByLiberationData; 

var i: Integer; 

begin

i: =0; 

while i<=WorkersCount-1 do begin

if DataToInt(Worker [i]. LiberationData) <>

DataToInt(Form1. GetData(Form1. ComboBox3. Text)) then begin

Form2. DelWorker(i); 

DEC(i); 

end; 

INC(i); 

end; 

Form1. RefreshList; 

end; 

procedure FindByPositionName; 

var i,j: Integer; 

begin

i: =0; 

j: =Form1. ComboBox3. ItemIndex; 

if j<0 then Exit; 

while i<=WorkersCount-1 do begin

if Worker [i]. PositionName<>Form1. ComboBox3. Items. Strings [j] then begin

Form2. DelWorker(i); 

DEC(i); 

end; 

INC(i); 

end; 

Form1. RefreshList; 

end; 

procedure FindByDepartmentName; 

var i,j: Integer; 

begin

i: =0; 

j: =Form1. ComboBox3. ItemIndex; 

if j<0 then Exit; 

while i<=WorkersCount-1 do begin

if Worker [i]. DepartmentName<>Form1. ComboBox3. Items. Strings [j] then begin

Form2. DelWorker(i); 

DEC(i); 

end; 

INC(i); 

end; 

Form1. RefreshList; 

end; 

procedure FindBySubsectionName; 

var i,j: Integer; 

begin

i: =0; 

j: =Form1. ComboBox3. ItemIndex; 

if j<0 then Exit; 

while i<=WorkersCount-1 do begin

if Worker [i]. SubsectionName<>Form1. ComboBox3. Items. Strings [j] then begin

Form2. DelWorker(i); 

DEC(i); 

end; 

INC(i); 

end; 

Form1. RefreshList; 

end; 

procedure FindByDepartmentLeader; 

var i: Integer; 

begin

i: =0; 

while i<=WorkersCount-1 do begin

if ORD(Worker [i]. DepartmentLeader) <>Form1. ComboBox3. ItemIndex then begin

Form2. DelWorker(i); 

DEC(i); 

end; 

INC(i); 

end; 

Form1. RefreshList; 

end; 

procedure FindBySubsectionLeader; 

var i: Integer; 

begin

i: =0; 

while i<=WorkersCount-1 do begin

if ORD(Worker [i]. SubsectionLeader) <>Form1. ComboBox3. ItemIndex then begin

Form2. DelWorker(i); 

DEC(i); 

end; 

INC(i); 

end; 

Form1. RefreshList; 

end; 

procedure TForm1. Button6Click(Sender: TObject); 

begin

case ComboBox2. ItemIndex of

0: FindByTabN; 

1: FindByLastName; 

2: FindByName; 

3: FindByPatronymic; 

4: FindByBirthDay; 

5: FindByBirthPlace; 

6: FindByStat; 

7: FindByIndCode; 

8: FindByReceptionData; 

9: FindByExperience; 

10: FindByExempt; 

11: FindByLiberationData; 

12: FindByPositionName; 

13: FindByDepartmentName; 

14: FindBySubsectionName; 

15: FindByDepartmentLeader; 

16: FindBySubsectionLeader; 

end; 

end; 

end. 

unit WorkerUnit; 

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Mask, ExtCtrls; 

type

TForm2 = class(TForm) 

Button1: TButton; 

Button2: TButton; 

Label12: TLabel; 

CheckBox3: TCheckBox; 

Edit8: TEdit; 

Panel1: TPanel; 

Label9: TLabel; 

Label1: TLabel; 

Label2: TLabel; 

Label3: TLabel; 

Label4: TLabel; 

Label5: TLabel; 

Label6: TLabel; 

Label7: TLabel; 

Label8: TLabel; 

Label10: TLabel; 

Label11: TLabel; 

Label13: TLabel; 

Label14: TLabel; 

Edit1: TEdit; 

Edit2: TEdit; 

Edit3: TEdit; 

Edit4: TEdit; 

Edit5: TEdit; 

ComboBox1: TComboBox; 

Edit6: TEdit; 

ComboBox2: TComboBox; 

CheckBox1: TCheckBox; 

ComboBox3: TComboBox; 

CheckBox2: TCheckBox; 

ComboBox4: TComboBox; 

Edit7: TEdit; 

Edit9: TEdit; 

Edit10: TEdit; 

Button3: TButton; 

function STI(S: String): Integer; 

procedure ClearField; 

procedure FormToRec(Index: Integer); 

procedure ClearWorker(Index: Integer); 

procedure DelWorker(Index: Integer); 

procedure Edit7KeyPress(Sender: TObject; var Key: Char); 

procedure FormShow(Sender: TObject); 

procedure FormClose(Sender: TObject; var Action: TCloseAction); 

procedure ComboBox2KeyPress(Sender: TObject; var Key: Char); 

procedure RecToForm(Index: Integer); 

function Verification: Boolean; 

procedure Button1Click(Sender: TObject); 

procedure CheckBox3Click(Sender: TObject); 

procedure Edit7Change(Sender: TObject); 

procedure Edit8Change(Sender: TObject); 

procedure Edit10Change(Sender: TObject); 

procedure Button2Click(Sender: TObject); 

procedure Edit1KeyPress(Sender: TObject; var Key: Char); 

procedure Button3Click(Sender: TObject); 

procedure ComboBox2DropDown(Sender: TObject); 

procedure ComboBox3DropDown(Sender: TObject); 

procedure ComboBox4DropDown(Sender: TObject); 

private

{ Private declarations }

public

{ Public declarations }

end; 

var

Form2: TForm2; 

OK: Boolean=False; 

implementation

uses KadrUnit, RegUnit; 

{$R *. dfm}

function TForm2. STI(S: String): Integer; 

var E: Integer; 

begin

/ / Ця функція альтернативна StrToInt, тільки при помилці результат = 0

Val(S,Result,E); 

if E<>0 then Result: =0; 

end; 

function SUB_Data(A,B: Data): Integer; 

var A1,B1: Integer; 

begin

A1: =A. Y*365+A. M*31+A. D; 

B1: =B. Y*365+B. M*31+B. D; 

Result: =Trunc((A1-B1) / 365); 

end; 

procedure TForm2. ClearField; 

begin

Edit1. Text: =''; Edit2. Text: =''; 

Edit3. Text: =''; Edit4. Text: =''; 

Edit5. Text: =''; Edit6. Text: =''; 

Edit7. Text: =''; Edit8. Text: =''; 

Edit9. Text: =''; Edit10. Text: =''; 

CheckBox1. Checked: =False; 

CheckBox2. Checked: =False; 

CheckBox3. Checked: =False; 

ComboBox1. ItemIndex: =-1; ComboBox2. ItemIndex: =-1; 

ComboBox3. ItemIndex: =-1; ComboBox4. ItemIndex: =-1; 

end; 

procedure TForm2. FormToRec(Index: Integer); 

begin

if ((Index>=WorkersCount) or(Index<0)) then Exit; 

Worker [Index]. TabN: =STI(Edit1. Text); 

Worker [Index]. LastName: =Edit3. Text; 

Worker [Index]. Name: =Edit4. Text; 

Worker [Index]. Patronymic: =Edit5. Text; 

Worker [Index]. BirthData: =Form1. GetData(Edit7. Text); 

Worker [Index]. BirthPlace: =Edit6. Text; 

if ComboBox1. ItemIndex>=0 then

Worker [Index]. Stat: =Boolean(ComboBox1. ItemIndex); 

Worker [Index]. IndCode: =Edit2. Text; 

Worker [Index]. ReceptionData: =Form1. GetData(Edit10. Text); 

Worker [Index]. Experience: =STI(Edit9. Text); 

Worker [Index]. Exempt: =CheckBox3. Checked; 

if CheckBox3. Checked then

Worker [Index]. LiberationData: =Form1. GetData(Edit8. Text); 

if ComboBox4. ItemIndex>=0 then

Worker [Index]. PositionName: =ComboBox4. Items. Strings [ComboBox4. ItemIndex] ; 

if ComboBox3. ItemIndex>=0 then

Worker [Index]. DepartmentName: =ComboBox3. Items. Strings [ComboBox3. ItemIndex] ; 

Worker [Index]. DepartmentLeader: =CheckBox2. Checked; 

if ComboBox2. ItemIndex>=0 then

Worker [Index]. SubsectionName: =ComboBox2. Items. Strings [ComboBox2. ItemIndex] ; 

Worker [Index]. SubsectionLeader: =CheckBox1. Checked; 

end; 

function ItemIndex(S: String; ST: TStrings): Integer; 

var i: Integer; 

begin

Result: =-1; 

for i: =0 to ST. Count-1 do

if ST. Strings [i] =S then begin

Result: =i; 

Exit; 

end; 

end; 

procedure TForm2. RecToForm(Index: Integer); 

begin

if ((Index>=WorkersCount) or(Index<0)) then Exit; 

Edit1. Text: =IntToStr(Worker [Index]. TabN); 

Edit3. Text: =Worker [Index]. LastName; 

Edit4. Text: =Worker [Index]. Name; 

Edit5. Text: =Worker [Index]. Patronymic; 

Edit7. Text: =Form1. DataToStr(Worker [Index]. BirthData); 

Edit6. Text: =Worker [Index]. BirthPlace; 

ComboBox1. ItemIndex: =Ord(Worker [Index]. Stat); 

Edit2. Text: =Worker [Index]. IndCode; 

Edit10. Text: =Form1. DataToStr(Worker [Index]. ReceptionData); 

Edit9. Text: =IntToStr(Worker [Index]. Experience); 

CheckBox3. Checked: =Worker [Index]. Exempt; 

Edit8. Enabled: =CheckBox3. Checked; 

if CheckBox3. Checked then

Edit8. Text: =Form1. DataToStr(Worker [Index]. LiberationData); 

ComboBox4. ItemIndex: =ItemIndex(Worker [Index]. PositionName,ComboBox4. Items); 

ComboBox3. ItemIndex: =ItemIndex(Worker [Index]. DepartmentName,ComboBox3. Items); 

CheckBox2. Checked: =Worker [Index]. DepartmentLeader; 

ComboBox2. ItemIndex: =ItemIndex(Worker [Index]. SubsectionName,ComboBox2. Items); 

CheckBox1. Checked: =Worker [Index]. SubsectionLeader; 

end; 

procedure TForm2. ClearWorker(Index: Integer); 

begin

if ((Index>=WorkersCount) or(Index<0)) then Exit; 

Worker [Index]. TabN: =0; 

Worker [Index]. LastName: =''; 

Worker [Index]. Name: =''; 

Worker [Index]. Patronymic: =''; 

Worker [Index]. BirthData: =Form1. GetData(''); 

Worker [Index]. BirthPlace: =''; 

Worker [Index]. Stat: =False; 

Worker [Index]. IndCode: =''; 

Worker [Index]. ReceptionData: =Form1. GetData(''); 

Worker [Index]. Experience: =0; 

Worker [Index]. Exempt: =False; 

Worker [Index]. LiberationData: =Form1. GetData(''); 

Worker [Index]. PositionName: =''; 

Worker [Index]. DepartmentName: =''; 

Worker [Index]. DepartmentLeader: =False; 

Worker [Index]. SubsectionName: =''; 

Worker [Index]. SubsectionLeader: =False; 

end; 

procedure TForm2. DelWorker(Index: Integer); 

var i: Integer; 

A: Kadr; 

begin

if ((Index>=WorkersCount) or(Index<0)) then Exit; 

ClearWorker(Index); 

for i: =Index to WorkersCount-2 do

Worker [i]: =Worker [i+1] ; 

ClearWorker(WorkersCount-1); 

DEC(WorkersCount); 

SetLength(Worker,WorkersCount); 

if CurWorker>=WorkersCount then

CurWorker: =WorkersCount-1; 

Form1. RefreshList; 

end; 

procedure TForm2. Edit7KeyPress(Sender: TObject; var Key: Char); 

begin

if not (Key in ['0'. '9',#8]) then Key: =#0; 

end; 

procedure TForm2. FormShow(Sender: TObject); 

begin

ComboBox4. Items: =Form3. ListBox1. Items; 

ComboBox3. Items: =Form3. ListBox2. Items; 

ComboBox2. Items: =Form3. ListBox3. Items; 

Form1. Enabled: =False; 

OK: =False; 

end; 

procedure TForm2. FormClose(Sender: TObject; var Action: TCloseAction); 

begin

if not OK then

if ADD then begin

if WorkersCount>0 then

DEC(WorkersCount); 

if CurWorker>=WorkersCount then CurWorker: =WorkersCount-1; 

if WorkersCount=0 then begin

Form1. StringGrid1. RowCount: =WorkersCount+2; 

Form1. StringGrid1. Rows [1]. Clear; 

end else

Form1. StringGrid1. RowCount: =WorkersCount+1; 

end; 

Form1. Enabled: =True; 

if WorkersCount>0 then begin

Form1. Button2. Enabled: =True; 

if not Form1. CheckBox1. Checked then

Form1. Button3. Enabled: =True; 

end else begin

Form1. Button2. Enabled: =False; 

Form1. Button3. Enabled: =False; 

end; 

end; 

procedure TForm2. ComboBox2KeyPress(Sender: TObject; var Key: Char); 

begin

Key: =#0; 

end; 

function TForm2. Verification: Boolean; 

begin

Result: =True; 

ComboBox2. ItemIndex: =ItemIndex(ComboBox2. Text,ComboBox2. Items); 

ComboBox3. ItemIndex: =ItemIndex(ComboBox3. Text,ComboBox3. Items); 

ComboBox4. ItemIndex: =ItemIndex(ComboBox4. Text,ComboBox4. Items); 

if ((Edit8. Text='') and(CheckBox3. Checked)) then begin

ShowMessage('Введіть дату звільнення'); Edit8. SetFocus; 

Result: =False; Exit; 

end; 

if Edit1. Text='' then begin

ShowMessage('Введіть табельний номер'); Edit1. SetFocus; 

Result: =False; Exit; 

end; 

if Edit2. Text='' then begin

ShowMessage('Введіть ідентифікаційний код'); Edit2. SetFocus; 

Result: =False; Exit; 

end; 

if Edit3. Text='' then begin

ShowMessage('Введіть прізвище'); Edit3. SetFocus; 

Result: =False; Exit; 

end; 

if Edit4. Text='' then begin

ShowMessage('Введіть ім’я'); Edit4. SetFocus; 

Result: =False; Exit; 

end; 

if Edit5. Text='' then begin

ShowMessage('Введіть по Батькові'); Edit5. SetFocus; 

Result: =False; Exit; 

end; 

if ComboBox1. ItemIndex<0 then begin

ShowMessage('Виберіть стать'); ComboBox1. SetFocus; 

Result: =False; Exit; 

end; 

if Edit7. Text='' then begin

ShowMessage('Введіть дату народження'); Edit7. SetFocus; 

Result: =False; Exit; 

end; 

if Edit6. Text='' then begin

ShowMessage('Введіть місце народження'); Edit6. SetFocus; 

Result: =False; Exit; 

end; 

if ((ComboBox2. ItemIndex<0) and(not CheckBox3. Checked)) then begin

ShowMessage('Виберіть Підрозділ'); ComboBox2. SetFocus; 

Result: =False; Exit; 

end; 

if ((ComboBox3. ItemIndex<0) and(not CheckBox3. Checked)) then begin

ShowMessage('Виберіть Відділ'); ComboBox3. SetFocus; 

Result: =False; Exit; 

end; 

if ((ComboBox4. ItemIndex<0) and(not CheckBox3. Checked)) then begin

ShowMessage('Виберіть посаду'); ComboBox4. SetFocus; 

Result: =False; Exit; 

end; 

if Edit10. Text='' then begin

ShowMessage('Введіть дату прийому на роботу'); Edit10. SetFocus; 

Result: =False; Exit; 

end; 

end; 

procedure TForm2. Button1Click(Sender: TObject); 

var i: Integer; 

begin

if not Verification then Exit; 

i: =Form1. FindInRec(CurWorker); 

FormToRec(CurWorker); 

if i>=0 then

Rezerv [i]: =Worker [CurWorker] ; 

Form1. RecToRow(CurWorker,CurWorker+1); 

OK: =True; 

Close; 

end; 

procedure TForm2. CheckBox3Click(Sender: TObject); 

begin

Edit8. Enabled: =CheckBox3. Checked; 

ComboBox2. Enabled: =not CheckBox3. Checked; 

ComboBox3. Enabled: =not CheckBox3. Checked; 

ComboBox4. Enabled: =not CheckBox3. Checked; 

CheckBox1. Enabled: =not CheckBox3. Checked; 

CheckBox2. Enabled: =not CheckBox3. Checked; 

Button3. Enabled: =not CheckBox3. Checked; 

if CheckBox3. Checked then Edit8. SetFocus; 

end; 

procedure TForm2. Edit7Change(Sender: TObject); 

begin

if Length(Edit7. Text) in [2,5] then begin

Edit7. Text: =Edit7. Text+'. '; 

Edit7. SelStart: =Length(Edit7. Text); 

end; 

end; 

procedure TForm2. Edit8Change(Sender: TObject); 

begin

if Length(Edit8. Text) in [2,5] then begin

Edit8. Text: =Edit8. Text+'. '; 

Edit8. SelStart: =Length(Edit8. Text); 

end; 

if Length(Edit8. Text) =10 then

Edit9. Text: =IntToStr(SUB_Data(Form1. GetData(Edit8. Text),Form1. GetData(Edit10. Text))); 

end; 

procedure TForm2. Edit10Change(Sender: TObject); 

begin

if Length(Edit10. Text) in [2,5] then begin

Edit10. Text: =Edit10. Text+'. '; 

Edit10. SelStart: =Length(Edit10. Text); 

end; 

Button3. OnClick(Button3); 

end; 

procedure TForm2. Button2Click(Sender: TObject); 

begin

OK: =False; 

Close; 

end; 

procedure TForm2. Edit1KeyPress(Sender: TObject; var Key: Char); 

begin

if not (Key in ['0'. '9',#8]) then Key: =#0; 

end; 

procedure TForm2. Button3Click(Sender: TObject); 

var TIME: SystemTime; 

CurData: Data; 

begin

GetLocalTime(TIME); 

CurData. D: =Time. wDay; 

CurData. M: =Time. wMonth; 

CurData. Y: =Time. wYear; 

if Length(Edit10. Text) =10 then

Edit9. Text: =IntToStr(SUB_Data(CurData,Form1. GetData(Edit10. Text))); 

end; 

procedure TForm2. ComboBox2DropDown(Sender: TObject); 

begin

if ComboBox2. Items. Count<1 then begin

Form3. Show; 

Form3. Edit3. SetFocus; 

end; 

end; 

procedure TForm2. ComboBox3DropDown(Sender: TObject); 

begin

if ComboBox3. Items. Count<1 then begin

Form3. Show; 

Form3. Edit2. SetFocus; 

end; 

end; 

procedure TForm2. ComboBox4DropDown(Sender: TObject); 

begin

if ComboBox4. Items. Count<1 then begin

Form3. Show; 

Form3. Edit1. SetFocus; 

end; 

end; 

end. 

unit RegUnit; 

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls; 

type

TForm3 = class(TForm) 

Edit1: TEdit; 

Edit2: TEdit; 

Edit3: TEdit; 

ListBox1: TListBox; 

ListBox2: TListBox; 

ListBox3: TListBox; 

Label1: TLabel; 

Label2: TLabel; 

Label3: TLabel; 

procedure Edit1KeyDown(Sender: TObject; var Key: Word; 

Shift: TShiftState); 

procedure Edit2KeyDown(Sender: TObject; var Key: Word; 

Shift: TShiftState); 

procedure Edit3KeyDown(Sender: TObject; var Key: Word; 

Shift: TShiftState); 

procedure FormShow(Sender: TObject); 

procedure FormClose(Sender: TObject; var Action: TCloseAction); 

procedure ListBox1KeyDown(Sender: TObject; var Key: Word; 

Shift: TShiftState); 

procedure ListBox2KeyDown(Sender: TObject; var Key: Word; 

Shift: TShiftState); 

procedure ListBox3KeyDown(Sender: TObject; var Key: Word; 

Shift: TShiftState); 

procedure ListBox1Click(Sender: TObject); 

procedure ListBox2Click(Sender: TObject); 

procedure ListBox3Click(Sender: TObject); 

private

{ Private declarations }

public

{ Public declarations }

end; 

var

Form3: TForm3; 

implementation

uses KadrUnit, WorkerUnit; 

{$R *. dfm}

procedure TForm3. Edit1KeyDown(Sender: TObject; var Key: Word; 

Shift: TShiftState); 

var i: Integer; 

A: Boolean; 

begin

if Key=27 then Close; 

if Key=13 then begin

A: =True; 

for i: =0 to ListBox1. Items. Count-1 do

if Edit1. Text=ListBox1. Items. Strings [i] then begin

A: =False; 

Break; 

end; 

if A then

ListBox1. Items. Add(Edit1. Text); 

Edit1. Clear; 

end; 

end; 

procedure TForm3. Edit2KeyDown(Sender: TObject; var Key: Word; 

Shift: TShiftState); 

var i: Integer; 

A: Boolean; 

begin

if Key=27 then Close; 

if Key=13 then begin

A: =True; 

for i: =0 to ListBox2. Items. Count-1 do

if Edit2. Text=ListBox2. Items. Strings [i] then begin

A: =False; 

Break; 

end; 

if A then

ListBox2. Items. Add(Edit2. Text); 

Edit2. Clear; 

end; 

end; 

procedure TForm3. Edit3KeyDown(Sender: TObject; var Key: Word; 

Shift: TShiftState); 

var i: Integer; 

A: Boolean; 

begin

if Key=27 then Close; 

if Key=13 then begin

A: =True; 

for i: =0 to ListBox3. Items. Count-1 do

if Edit3. Text=ListBox3. Items. Strings [i] then begin

A: =False; 

Break; 

end; 

if A then

ListBox3. Items. Add(Edit3. Text); 

Edit3. Clear; 

end; 

end; 

procedure TForm3. FormShow(Sender: TObject); 

begin

Form1. Enabled: =False; 

Form2. Enabled: =False; 

end; 

procedure TForm3. FormClose(Sender: TObject; var Action: TCloseAction); 

begin

Form2. ComboBox2. Items: =ListBox3. Items; 

Form2. ComboBox3. Items: =ListBox2. Items; 

Form2. ComboBox4. Items: =ListBox1. Items; 

Form1. Enabled: =True; 

Form2. Enabled: =True; 

end; 

procedure TForm3. ListBox1KeyDown(Sender: TObject; var Key: Word; 

Shift: TShiftState); 

begin

if ListBox1. ItemIndex>=0 then

if Key=46 then ListBox1. Items. Delete(ListBox1. ItemIndex); 

if Key=27 then Close; 

end; 

procedure TForm3. ListBox2KeyDown(Sender: TObject; var Key: Word; 

Shift: TShiftState); 

begin

if ListBox2. ItemIndex>=0 then

if Key=46 then ListBox2. Items. Delete(ListBox2. ItemIndex); 

if Key=27 then Close; 

end; 

procedure TForm3. ListBox3KeyDown(Sender: TObject; var Key: Word; 

Shift: TShiftState); 

begin

if ListBox3. ItemIndex>=0 then

if Key=46 then ListBox3. Items. Delete(ListBox3. ItemIndex); 

if Key=27 then Close; 

end; 

procedure TForm3. ListBox1Click(Sender: TObject); 

var i: Integer; 

begin

i: =ListBox1. ItemIndex; 

if i<0 then Exit; 

if ListBox1. Items. Strings [i] <>'' then

Edit1. Text: =ListBox1. Items. Strings [i] ; 

end; 

procedure TForm3. ListBox2Click(Sender: TObject); 

var i: Integer; 

begin

i: =ListBox2. ItemIndex; 

if i<0 then Exit; 

if ListBox2. Items. Strings [i] <>'' then

Edit2. Text: =ListBox2. Items. Strings [i] ; 

end; 

procedure TForm3. ListBox3Click(Sender: TObject); 

var i: Integer; 

begin

i: =ListBox3. ItemIndex; 

if i<0 then Exit; 

if ListBox3. Items. Strings [i] <>'' then

Edit3. Text: =ListBox3. Items. Strings [i] ; 

end; 

end.