Зміст
Вступ. 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 випущена в цьому році. До речі WindowsCommander який був перейменований на TotalCommander був написаний на Delphi 2.0.
1. Аналітичний розділ
Завдання цього курсового проекту розробити програму "Кадровий облік". Вона має багато відомих і невідомих аналогів. Із знайдених аналогів розробці даного курсового проекту найбільше підходить програма "Кадри плюс 2", а отже програма курсового проекту буде розроблятись спираючись на цю програму. Інтерфейс та функції програми частино буде взято з "Кадри плюс 2".
В програмі буде здійснена можливість редагування файлу, а також його збереження і подальше завантаження. Під редагуванням розуміється збільшення персоналу підприємства, тобто додавання нових працівників, зміна даних про вже доданих (існуючих) працівників, якщо дані про деяких з них вже застарілі, а також видалення працівників, чи їх звільнення.
Так як кожен працівник має свою посаду чи належить до певного відділу чи підрозділу то для створення нових або редагування існуючих категорій буде передбачено окреме вікно.
Також в програмі має бути передбачено сортування та пошук працівників за декількома критеріями, чим більше цих параметрів тим краще сортування і точніший пошук. Програми такого роду дуже потрібні на підприємствах для обліку працюючого персоналу.
2. Побудова інформаційно-математичної моделі задачі
1) Постановка задачі:
Дані зберігати в типизованому файлі. Сортування та пошук за декількома критеріями.
Для функціонування програми буде створено новий тип даних, який буде вміщати в себе всю інформацію про робітника (табельний номер, ПІБ, дата народження, дата прийняття на роботу, стаж, і т.д.). Стаж роботи визначається різницею між поточною датою і датою прийняття на роботу, якщо працівник звільнений то стаж визначається як різниця між датою звільнення і датою прийняття на роботу. Має бути передбачена фільтрація натиснених клавіш для деяких полів вводу, н. д.: Дата народження, табельний номер.
Програма повинна зберігати дані в поточний файл якщо він вже існує, натисканням кнопки збереження в головному меню, або зберігати дані в довільний файл, який вибере користувач натисканням кнопки "Зберегти як", також користувач зможе завантажити раніше збережений файл для перегляду або зміни його вмісту.
Кожному працівнику можна буде назначити будь яку посаду, відділ чи підрозділ. Для цього буде передбачена можливість створення нових посад, відділів чи підрозділів, зміна чи видалення існуючих.
Сортування персоналу можна буде здійснювати за багатьма критеріями. Сортувати можна буде як по зростанню так і по спаданню.
Пошук працівника серед всього персоналу буде виконаний в вигляді покрокового фільтру, тобто спочатку наприклад пошук по табельному номері, а потім пошук серед знайденого ще по якомусь критерію і так поки не залишаться бажані працівники.
3. Алгоритм задачі
Алгоритм розв'язання задачі графічно відображає логіку програми і наводиться у вигляді спрощеної схеми алгоритму та блок-схем етапів.
Блок-схема 1 - Процедура переведення рядка в дату.
Блок-схема 2 - Процедура сортування за табельним номером.
Блок-схема 3 - Процедура пошуку працівника за ім’ям.
Блок-схема 4 - Процедура додавання нового робітника.
4. Визначення структури даних
В програмі були використані змінні типів наведених в Таблиці 1
Таблиця 1. Типи змінних та їх призначення.
Тип | Опис типу |
Byte | Цілочисельний тип діапазоном від 0 до 255 |
Integer | Цілочисельний тип діапазоном від - 32768 до 32767 |
Data | Власний тип для збереження дати (день, місяць, рік) |
Kadr | Власний тип для збереження інформації про робітника |
Fileof 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. Інструкції з експлуатації програми
Для нормальної роботи гри до комп’ютера висуваються такі мінімальні вимоги:
Pentium100 MHz;
1 Mb оперативної пам’яті;
Операційну систему Windows95/98/2000/XP / Vista;
600 Кб вільного місця на жорсткому диску;
Відеокарта на 8MB;
Мишка, клавіатура.
Щоб програма працювала потрібно скопіювати файл “Kadrovuy_Oblik. exe” на комп’ютер. Запуск програми здійснюється за допомогою файлу “Kadrovuy_Oblik. exe”. Для додавання нового робітника потрібно натиснути кнопку "Додати", на панелі редагування внизу вікна. Для редагування інформації про робітника, потрібно натиснути кнопку "Змінити" на панелі редагування, або 2 рази клацнути на потрібному робітнику. Також потрібного робітника можна видалити із списку, для цього потрібно вибрати працівника із списку, клавішами чи натисканням лівої кнопки мишки і натиснути кнопку "Видалити". В програмі можна додавати нові посади, відділи чи підрозділи, для цього потрібно натиснути кнопку "Редагування категорій" на панелі внизу і в новому вікні вписати нову посаду, відділ чи підрозділ. Також існуючі категорії (посади, відділи, підрозділи) можна видаляти для цього потрібно натиснути кнопку "Редагування категорій" і вибрати в списку непотрібну категорію і натиснути клавішу Del. Також робітників можна сортувати за багатьма критеріями, а для сортування в іншому напрямку потрібно натиснути кнопку "Інвертувати" на панелі "Сортування". В програмі присутній пошук робітників за всіма критеріями, які є в робітників. Пошук виконаний в вигляді фільтру, що спрощує пошук робітників. За об’ємом програма невелика тому легко влізе на дискету чи інший носій інформації.
11.
Аналіз отриманих результатів
Для даного курсового проекту було розроблено програму яка дозволяє вести облік робітників на підприємстві. В програмі є можливість додавання робітників, редагування інформації про них, і їх видалення. Є можливість збереження і завантаження даних про робітників. Присутнє сортування і пошук робітників за декількома критеріями. Створення нових посад, відділів чи підрозділів.
Рисунок 8. Завантажений файл
Рисунок 9. Дані сортовано за табельним номером
Рисунок 10. Ввімкнено режим пошуку
В режимі пошуку кнопки "Додати" і "Видалити" не доступні.
Рисунок 11. Був проведений пошук по назві відділу
Програма відповідає поставленій задачі. Всі функції та процедури працюють правильно і без помилок. Сортування даних виконується правильно без будь-яких помилок. Пошук проходить правильно, а також пошук серед вже знайдених робітників теж правильний і не містить помилок.
Висново
к
Для розробки даного проекту потрібно було спочатку проаналізувати реалізацію програми визначити структури даних, функціональні можливості програми. Для створення програми використовувалось середовище програмування 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; // Сортування за стажем
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.