|
Кадровий облік
Кадровий облік
70 Зміст - Вступ 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. Алгоритм задачіАлгоритм розв'язання задачі графічно відображає логіку програми і наводиться у вигляді спрощеної схеми алгоритму та блок-схем етапів. 70 Блок-схема 1 - Процедура переведення рядка в дату. 70 Блок-схема 2 - Процедура сортування за табельним номером. 70 Блок-схема 3 - Процедура пошуку працівника за ім'ям. 70 Блок-схема 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 = alClientOptions [goColSizing] = TrueКомпонент Button представляє собою кнопку і при натисканні служить для виконання тої чи іншої операції. Компонент GroupBox служить для об'єднання об'єктів в групи. В GroupBox1 були зміненні такі параметри як: Align = alBottomCaption = РедагуванняКомпонент 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; interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, Grids, StdCtrls, Menus, XPMan; typeData=recordD: 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; typeKadr=recordTabN: 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; varForm1: TForm1; F: File of Kadr; Worker,Rezerv: array of Kadr; CurFileName: String=''; WorkersCount: Integer=0; RezervCount: Integer=0; CurWorker: Integer=0; ADD: Boolean; implementationuses WorkerUnit, RegUnit; {$R *. dfm}function TForm1. GetData(S: String): Data; var i,j,P: Integer; beginResult. D: =0; Result. M: =0; Result. Y: =0; P: =0; j: =1; for i: =1 to Length(S) doif S [i] ='. ' then beginif P=1 then beginResult. M: =Form2. STI(Copy(S,j, i-j)); j: =i+1; if Copy(S,j,Length(S) - i-1) <>'' thenResult. Y: =Form2. STI(Copy(S,j,Length(S) - i)); end; if P=0 then beginResult. D: =Form2. STI(Copy(S,j, i-1)); INC(P); j: =i+1; end; end; end; procedure TForm1. SaveToFile(FileName: String); var i: Integer; beginCurFileName: =FileName; Caption: ='Кадровий облік - '+ExtractFileName(FileName); AssignFile(F,FileName); ReWrite(F); for i: =0 to WorkersCount-1 doWrite(F,Worker [i]); CloseFile(F); end; procedure AddToCombo(S: Kadr); var i: Integer; A: Boolean; beginA: =True; for i: =0 to Form2. ComboBox2. Items. Count-1 doif S. SubsectionName=Form2. ComboBox2. Items. Strings [i] then beginA: =False; Break; end; if A then Form2. ComboBox2. Items. Add(S. SubsectionName); A: =True; for i: =0 to Form2. ComboBox3. Items. Count-1 doif S. DepartmentName=Form2. ComboBox3. Items. Strings [i] then beginA: =False; Break; end; if A then Form2. ComboBox3. Items. Add(S. DepartmentName); A: =True; for i: =0 to Form2. ComboBox4. Items. Count-1 doif S. PositionName=Form2. ComboBox4. Items. Strings [i] then beginA: =False; Break; end; if A then Form2. ComboBox4. Items. Add(S. PositionName); end; procedure TForm1. LoadFromFile(FileName: String); beginWorkersCount: =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 beginINC(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 thenCurWorker: =0; RefreshList; CloseFile(F); end; function TForm1. DataToStr(D: Data): String; beginResult: =IntToStr(D. D) +'. '+IntToStr(D. M) +'. '+IntToStr(D. Y); end; procedure TForm1. FormCreate(Sender: TObject); beginStringGrid1. 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); beginif 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 thenStringGrid1. 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; beginif WorkersCount=0 then beginStringGrid1. RowCount: =WorkersCount+2; StringGrid1. Rows [1]. Clear; Button2. Enabled: =False; Button3. Enabled: =False; Exit; end; Button2. Enabled: =True; if not CheckBox1. Checked thenButton3. Enabled: =True; StringGrid1. RowCount: =WorkersCount+1; for i: =0 to WorkersCount-1 do beginStringGrid1. 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 thenStringGrid1. 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); beginINC(WorkersCount); SetLength(Worker,WorkersCount); CurWorker: =WorkersCount-1; Form2. ClearWorker(CurWorker); if WorkersCount>=StringGrid1. RowCount then beginStringGrid1. 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); beginCurWorker: =ARow-1; end; procedure TForm1. Button2Click(Sender: TObject); beginADD: =False; Form2. RecToForm(CurWorker); Form2. Show; end; procedure TForm1. Button3Click(Sender: TObject); beginForm2. DelWorker(CurWorker); end; procedure TForm1. N2Click(Sender: TObject); beginif OpenDialog. Execute thenLoadFromFile(OpenDialog. FileName); end; procedure TForm1. N4Click(Sender: TObject); beginif SaveDialog. Execute thenSaveToFile(SaveDialog. FileName); end; procedure TForm1. Button4Click(Sender: TObject); beginForm3. Show; end; procedure TForm1. StringGrid1DblClick(Sender: TObject); beginif Button2. Enabled thenButton2. OnClick(Button2); end; procedure TForm1. N3Click(Sender: TObject); beginif CurFileName<>'' thenSaveToFile(CurFileName) else N4. OnClick(N4); end; procedure TForm1. N5Click(Sender: TObject); beginClose; end; procedure TForm1. Button5Click(Sender: TObject); var i,L: Integer; A: Kadr; beginif WorkersCount<=1 then Exit; L: =Trunc((WorkersCount-1) / 2); for i: =0 to L do beginA: =Worker [i] ; Worker [i]: =Worker [WorkersCount-1-i] ; Worker [WorkersCount-1-i]: =A; end; RefreshList; end; procedure SortByTabN; // Сортування за табельним номеромvar i,j: Integer; A: Kadr; beginfor i: =0 to WorkersCount-2 dofor j: =i+1 to WorkersCount-1 doif Worker [i]. TabN>Worker [j]. TabN then beginA: =Worker [i] ; Worker [i]: =Worker [j] ; Worker [j]: =A; end; Form1. RefreshList; end; procedure SortByLastName; // Сортування за прізвищемvar i,j: Integer; A: Kadr; beginfor i: =0 to WorkersCount-2 dofor j: =i+1 to WorkersCount-1 doif Worker [i]. LastName>Worker [j]. LastName then beginA: =Worker [i] ; Worker [i]: =Worker [j] ; Worker [j]: =A; end; Form1. RefreshList; end; procedure SortByName; // Сортування за ім'ямvar i,j: Integer; A: Kadr; beginfor i: =0 to WorkersCount-2 dofor j: =i+1 to WorkersCount-1 doif Worker [i]. Name>Worker [j]. Name then beginA: =Worker [i] ; Worker [i]: =Worker [j] ; Worker [j]: =A; end; Form1. RefreshList; end; procedure SortByPatronymic; // Сортування по Батьковіvar i,j: Integer; A: Kadr; beginfor i: =0 to WorkersCount-2 dofor j: =i+1 to WorkersCount-1 doif Worker [i]. Patronymic>Worker [j]. Patronymic then beginA: =Worker [i] ; Worker [i]: =Worker [j] ; Worker [j]: =A; end; Form1. RefreshList; end; function DataToInt(A: Data): Integer; // Переведення дати в дніbeginResult: =A. Y*365+A. M*31+A. D; end; procedure SortByBirdthDay; // Сортування за датою народженняvar i,j: Integer; A: Kadr; beginfor i: =0 to WorkersCount-2 dofor j: =i+1 to WorkersCount-1 doif DataToInt(Worker [i]. BirthData) >DataToInt(Worker [j]. BirthData) then beginA: =Worker [i] ; Worker [i]: =Worker [j] ; Worker [j]: =A; end; Form1. RefreshList; end; procedure SortByIndCode; // Сортування за ідентифікаційним кодомvar i,j: Integer; A: Kadr; beginfor i: =0 to WorkersCount-2 dofor j: =i+1 to WorkersCount-1 doif Worker [i]. IndCode>Worker [j]. IndCode then beginA: =Worker [i] ; Worker [i]: =Worker [j] ; Worker [j]: =A; end; Form1. RefreshList; end; procedure SortByReceptionData; // Сортування за датою прийому на роботуvar i,j: Integer; A: Kadr; beginfor i: =0 to WorkersCount-2 dofor j: =i+1 to WorkersCount-1 doif DataToInt(Worker [i]. ReceptionData) >DataToInt(Worker [j]. ReceptionData) then beginA: =Worker [i] ; Worker [i]: =Worker [j] ; Worker [j]: =A; end; Form1. RefreshList; end; procedure SortByExperience; // Сортування за стажемvar i,j: Integer; A: Kadr; beginfor i: =0 to WorkersCount-2 dofor j: =i+1 to WorkersCount-1 doif Worker [i]. Experience>Worker [j]. Experience then beginA: =Worker [i] ; Worker [i]: =Worker [j] ; Worker [j]: =A; end; Form1. RefreshList; end; procedure SortByLiberationData; // Сортування за датою звільненняvar i,j: Integer; A: Kadr; beginfor i: =0 to WorkersCount-2 dofor j: =i+1 to WorkersCount-1 doif DataToInt(Worker [i]. LiberationData) >DataToInt(Worker [j]. LiberationData) then beginA: =Worker [i] ; Worker [i]: =Worker [j] ; Worker [j]: =A; end; Form1. RefreshList; end; procedure SortByPositionName; // Сортування за назвою посадиvar i,j: Integer; A: Kadr; beginfor i: =0 to WorkersCount-2 dofor j: =i+1 to WorkersCount-1 doif Worker [i]. PositionName>Worker [j]. PositionName then beginA: =Worker [i] ; Worker [i]: =Worker [j] ; Worker [j]: =A; end; Form1. RefreshList; end; procedure SortByDepartmentName; // Сортування за назвою відділуvar i,j: Integer; A: Kadr; beginfor i: =0 to WorkersCount-2 dofor j: =i+1 to WorkersCount-1 doif Worker [i]. DepartmentName>Worker [j]. DepartmentName then beginA: =Worker [i] ; Worker [i]: =Worker [j] ; Worker [j]: =A; end; Form1. RefreshList; end; procedure SortBySubsectionName; // Сортування за назвою підрозділуvar i,j: Integer; A: Kadr; beginfor i: =0 to WorkersCount-2 dofor j: =i+1 to WorkersCount-1 doif Worker [i]. SubsectionName>Worker [j]. SubsectionName then beginA: =Worker [i] ; Worker [i]: =Worker [j] ; Worker [j]: =A; end; Form1. RefreshList; end; procedure TForm1. ComboBox1Change(Sender: TObject); begincase ComboBox1. ItemIndex of0: 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; beginGroupBox4. Enabled: =CheckBox1. Checked; Button1. Enabled: =not CheckBox1. Checked; Button3. Enabled: =not CheckBox1. Checked; if CheckBox1. Checked then beginRezervCount: =WorkersCount; SetLength(Rezerv,RezervCount); for i: =0 to RezervCount-1 doRezerv [i]: =Worker [i] ; end else beginWorkersCount: =RezervCount; SetLength(Worker,WorkersCount); for i: =0 to WorkersCount-1 doWorker [i]: =Rezerv [i] ; RefreshList; end; end; procedure TForm1. Button7Click(Sender: TObject); var i: Integer; beginWorkersCount: =RezervCount; SetLength(Worker,WorkersCount); for i: =0 to WorkersCount-1 doWorker [i]: =Rezerv [i] ; RefreshList; end; procedure TForm1. ComboBox3KeyPress(Sender: TObject; var Key: Char); begincase ComboBox2. ItemIndex of0,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); beginif ComboBox2. ItemIndex in [4,8,11] thenif Length(ComboBox3. Text) in [2,5] then beginComboBox3. Text: =ComboBox3. Text+'. '; ComboBox3. SelStart: =Length(ComboBox3. Text); end; end; procedure TForm1. ComboBox2Change(Sender: TObject); beginComboBox3. Clear; ComboBox3. MaxLength: =0; case ComboBox2. ItemIndex of0: 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: beginComboBox3. Items. Add('Ні'); ComboBox3. Items. Add('Так'); end; end; end; procedure TForm1. ComboBox2KeyPress(Sender: TObject; var Key: Char); beginKey: =#0; end; function TForm1. FindInRec(Index: Integer): Integer; var i: Integer; beginResult: =-1; for i: =0 to RezervCount-1 doif Worker [Index]. TabN=Rezerv [i]. TabN then beginResult: =i; Exit; end; end; procedure FindByTabN; var i: Integer; begini: =0; while i<=WorkersCount-1 do beginif Worker [i]. TabN<>Form2. STI(Form1. ComboBox3. Text) then beginForm2. DelWorker(i); DEC(i); end; INC(i); end; Form1. RefreshList; end; procedure FindByLastName; var i: Integer; begini: =0; while i<=WorkersCount-1 do beginif Worker [i]. LastName<>Form1. ComboBox3. Text then beginForm2. DelWorker(i); DEC(i); end; INC(i); end; Form1. RefreshList; end; procedure FindByName; var i: Integer; begini: =0; while i<=WorkersCount-1 do beginif Worker [i]. Name<>Form1. ComboBox3. Text then beginForm2. DelWorker(i); DEC(i); end; INC(i); end; Form1. RefreshList; end; procedure FindByPatronymic; var i: Integer; begini: =0; while i<=WorkersCount-1 do beginif Worker [i]. Patronymic<>Form1. ComboBox3. Text then beginForm2. DelWorker(i); DEC(i); end; INC(i); end; Form1. RefreshList; end; procedure FindByBirthDay; var i: Integer; begini: =0; while i<=WorkersCount-1 do beginif DataToInt(Worker [i]. BirthData) <>DataToInt(Form1. GetData(Form1. ComboBox3. Text)) then beginForm2. DelWorker(i); DEC(i); end; INC(i); end; Form1. RefreshList; end; procedure FindByBirthPlace; var i: Integer; begini: =0; while i<=WorkersCount-1 do beginif Worker [i]. BirthPlace<>Form1. ComboBox3. Text then beginForm2. DelWorker(i); DEC(i); end; INC(i); end; Form1. RefreshList; end; procedure FindByStat; var i: Integer; begini: =0; while i<=WorkersCount-1 do beginif ORD(Worker [i]. Stat) <>Form1. ComboBox3. ItemIndex then beginForm2. DelWorker(i); DEC(i); end; INC(i); end; Form1. RefreshList; end; procedure FindByIndCode; var i: Integer; begini: =0; while i<=WorkersCount-1 do beginif Worker [i]. IndCode<>Form1. ComboBox3. Text then beginForm2. DelWorker(i); DEC(i); end; INC(i); end; Form1. RefreshList; end; procedure FindByReceptionData; var i: Integer; begini: =0; while i<=WorkersCount-1 do beginif DataToInt(Worker [i]. ReceptionData) <>DataToInt(Form1. GetData(Form1. ComboBox3. Text)) then beginForm2. DelWorker(i); DEC(i); end; INC(i); end; Form1. RefreshList; end; procedure FindByExperience; var i: Integer; begini: =0; while i<=WorkersCount-1 do beginif Worker [i]. Experience<>Form2. STI(Form1. ComboBox3. Text) then beginForm2. DelWorker(i); DEC(i); end; INC(i); end; Form1. RefreshList; end; procedure FindByExempt; var i: Integer; begini: =0; while i<=WorkersCount-1 do beginif ORD(Worker [i]. Exempt) <>Form1. ComboBox3. ItemIndex then beginForm2. DelWorker(i); DEC(i); end; INC(i); end; Form1. RefreshList; end; procedure FindByLiberationData; var i: Integer; begini: =0; while i<=WorkersCount-1 do beginif DataToInt(Worker [i]. LiberationData) <>DataToInt(Form1. GetData(Form1. ComboBox3. Text)) then beginForm2. DelWorker(i); DEC(i); end; INC(i); end; Form1. RefreshList; end; procedure FindByPositionName; var i,j: Integer; begini: =0; j: =Form1. ComboBox3. ItemIndex; if j<0 then Exit; while i<=WorkersCount-1 do beginif Worker [i]. PositionName<>Form1. ComboBox3. Items. Strings [j] then beginForm2. DelWorker(i); DEC(i); end; INC(i); end; Form1. RefreshList; end; procedure FindByDepartmentName; var i,j: Integer; begini: =0; j: =Form1. ComboBox3. ItemIndex; if j<0 then Exit; while i<=WorkersCount-1 do beginif Worker [i]. DepartmentName<>Form1. ComboBox3. Items. Strings [j] then beginForm2. DelWorker(i); DEC(i); end; INC(i); end; Form1. RefreshList; end; procedure FindBySubsectionName; var i,j: Integer; begini: =0; j: =Form1. ComboBox3. ItemIndex; if j<0 then Exit; while i<=WorkersCount-1 do beginif Worker [i]. SubsectionName<>Form1. ComboBox3. Items. Strings [j] then beginForm2. DelWorker(i); DEC(i); end; INC(i); end; Form1. RefreshList; end; procedure FindByDepartmentLeader; var i: Integer; begini: =0; while i<=WorkersCount-1 do beginif ORD(Worker [i]. DepartmentLeader) <>Form1. ComboBox3. ItemIndex then beginForm2. DelWorker(i); DEC(i); end; INC(i); end; Form1. RefreshList; end; procedure FindBySubsectionLeader; var i: Integer; begini: =0; while i<=WorkersCount-1 do beginif ORD(Worker [i]. SubsectionLeader) <>Form1. ComboBox3. ItemIndex then beginForm2. DelWorker(i); DEC(i); end; INC(i); end; Form1. RefreshList; end; procedure TForm1. Button6Click(Sender: TObject); begincase ComboBox2. ItemIndex of0: 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; interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, Mask, ExtCtrls; typeTForm2 = 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; varForm2: TForm2; OK: Boolean=False; implementationuses KadrUnit, RegUnit; {$R *. dfm}function TForm2. STI(S: String): Integer; var E: Integer; begin/ / Ця функція альтернативна StrToInt, тільки при помилці результат = 0Val(S,Result,E); if E<>0 then Result: =0; end; function SUB_Data(A,B: Data): Integer; var A1,B1: Integer; beginA1: =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; beginEdit1. 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); beginif ((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 thenWorker [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 thenWorker [Index]. LiberationData: =Form1. GetData(Edit8. Text); if ComboBox4. ItemIndex>=0 thenWorker [Index]. PositionName: =ComboBox4. Items. Strings [ComboBox4. ItemIndex] ; if ComboBox3. ItemIndex>=0 thenWorker [Index]. DepartmentName: =ComboBox3. Items. Strings [ComboBox3. ItemIndex] ; Worker [Index]. DepartmentLeader: =CheckBox2. Checked; if ComboBox2. ItemIndex>=0 thenWorker [Index]. SubsectionName: =ComboBox2. Items. Strings [ComboBox2. ItemIndex] ; Worker [Index]. SubsectionLeader: =CheckBox1. Checked; end; function ItemIndex(S: String; ST: TStrings): Integer; var i: Integer; beginResult: =-1; for i: =0 to ST. Count-1 doif ST. Strings [i] =S then beginResult: =i; Exit; end; end; procedure TForm2. RecToForm(Index: Integer); beginif ((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 thenEdit8. 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); beginif ((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; beginif ((Index>=WorkersCount) or(Index<0)) then Exit; ClearWorker(Index); for i: =Index to WorkersCount-2 doWorker [i]: =Worker [i+1] ; ClearWorker(WorkersCount-1); DEC(WorkersCount); SetLength(Worker,WorkersCount); if CurWorker>=WorkersCount thenCurWorker: =WorkersCount-1; Form1. RefreshList; end; procedure TForm2. Edit7KeyPress(Sender: TObject; var Key: Char); beginif not (Key in ['0'. '9',#8]) then Key: =#0; end; procedure TForm2. FormShow(Sender: TObject); beginComboBox4. 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); beginif not OK thenif ADD then beginif WorkersCount>0 thenDEC(WorkersCount); if CurWorker>=WorkersCount then CurWorker: =WorkersCount-1; if WorkersCount=0 then beginForm1. StringGrid1. RowCount: =WorkersCount+2; Form1. StringGrid1. Rows [1]. Clear; end elseForm1. StringGrid1. RowCount: =WorkersCount+1; end; Form1. Enabled: =True; if WorkersCount>0 then beginForm1. Button2. Enabled: =True; if not Form1. CheckBox1. Checked thenForm1. Button3. Enabled: =True; end else beginForm1. Button2. Enabled: =False; Form1. Button3. Enabled: =False; end; end; procedure TForm2. ComboBox2KeyPress(Sender: TObject; var Key: Char); beginKey: =#0; end; function TForm2. Verification: Boolean; beginResult: =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 beginShowMessage('Введіть дату звільнення'); Edit8. SetFocus; Result: =False; Exit; end; if Edit1. Text='' then beginShowMessage('Введіть табельний номер'); Edit1. SetFocus; Result: =False; Exit; end; if Edit2. Text='' then beginShowMessage('Введіть ідентифікаційний код'); Edit2. SetFocus; Result: =False; Exit; end; if Edit3. Text='' then beginShowMessage('Введіть прізвище'); Edit3. SetFocus; Result: =False; Exit; end; if Edit4. Text='' then beginShowMessage('Введіть ім'я'); Edit4. SetFocus; Result: =False; Exit; end; if Edit5. Text='' then beginShowMessage('Введіть по Батькові'); Edit5. SetFocus; Result: =False; Exit; end; if ComboBox1. ItemIndex<0 then beginShowMessage('Виберіть стать'); ComboBox1. SetFocus; Result: =False; Exit; end; if Edit7. Text='' then beginShowMessage('Введіть дату народження'); Edit7. SetFocus; Result: =False; Exit; end; if Edit6. Text='' then beginShowMessage('Введіть місце народження'); Edit6. SetFocus; Result: =False; Exit; end; if ((ComboBox2. ItemIndex<0) and(not CheckBox3. Checked)) then beginShowMessage('Виберіть Підрозділ'); ComboBox2. SetFocus; Result: =False; Exit; end; if ((ComboBox3. ItemIndex<0) and(not CheckBox3. Checked)) then beginShowMessage('Виберіть Відділ'); ComboBox3. SetFocus; Result: =False; Exit; end; if ((ComboBox4. ItemIndex<0) and(not CheckBox3. Checked)) then beginShowMessage('Виберіть посаду'); ComboBox4. SetFocus; Result: =False; Exit; end; if Edit10. Text='' then beginShowMessage('Введіть дату прийому на роботу'); Edit10. SetFocus; Result: =False; Exit; end; end; procedure TForm2. Button1Click(Sender: TObject); var i: Integer; beginif not Verification then Exit; i: =Form1. FindInRec(CurWorker); FormToRec(CurWorker); if i>=0 thenRezerv [i]: =Worker [CurWorker] ; Form1. RecToRow(CurWorker,CurWorker+1); OK: =True; Close; end; procedure TForm2. CheckBox3Click(Sender: TObject); beginEdit8. 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); beginif Length(Edit7. Text) in [2,5] then beginEdit7. Text: =Edit7. Text+'. '; Edit7. SelStart: =Length(Edit7. Text); end; end; procedure TForm2. Edit8Change(Sender: TObject); beginif Length(Edit8. Text) in [2,5] then beginEdit8. Text: =Edit8. Text+'. '; Edit8. SelStart: =Length(Edit8. Text); end; if Length(Edit8. Text) =10 thenEdit9. Text: =IntToStr(SUB_Data(Form1. GetData(Edit8. Text),Form1. GetData(Edit10. Text))); end; procedure TForm2. Edit10Change(Sender: TObject); beginif Length(Edit10. Text) in [2,5] then beginEdit10. Text: =Edit10. Text+'. '; Edit10. SelStart: =Length(Edit10. Text); end; Button3. OnClick(Button3); end; procedure TForm2. Button2Click(Sender: TObject); beginOK: =False; Close; end; procedure TForm2. Edit1KeyPress(Sender: TObject; var Key: Char); beginif not (Key in ['0'. '9',#8]) then Key: =#0; end; procedure TForm2. Button3Click(Sender: TObject); var TIME: SystemTime; CurData: Data; beginGetLocalTime(TIME); CurData. D: =Time. wDay; CurData. M: =Time. wMonth; CurData. Y: =Time. wYear; if Length(Edit10. Text) =10 thenEdit9. Text: =IntToStr(SUB_Data(CurData,Form1. GetData(Edit10. Text))); end; procedure TForm2. ComboBox2DropDown(Sender: TObject); beginif ComboBox2. Items. Count<1 then beginForm3. Show; Form3. Edit3. SetFocus; end; end; procedure TForm2. ComboBox3DropDown(Sender: TObject); beginif ComboBox3. Items. Count<1 then beginForm3. Show; Form3. Edit2. SetFocus; end; end; procedure TForm2. ComboBox4DropDown(Sender: TObject); beginif ComboBox4. Items. Count<1 then beginForm3. Show; Form3. Edit1. SetFocus; end; end; end. unit RegUnit; interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls; typeTForm3 = 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; varForm3: TForm3; implementationuses KadrUnit, WorkerUnit; {$R *. dfm}procedure TForm3. Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var i: Integer; A: Boolean; beginif Key=27 then Close; if Key=13 then beginA: =True; for i: =0 to ListBox1. Items. Count-1 doif Edit1. Text=ListBox1. Items. Strings [i] then beginA: =False; Break; end; if A thenListBox1. Items. Add(Edit1. Text); Edit1. Clear; end; end; procedure TForm3. Edit2KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var i: Integer; A: Boolean; beginif Key=27 then Close; if Key=13 then beginA: =True; for i: =0 to ListBox2. Items. Count-1 doif Edit2. Text=ListBox2. Items. Strings [i] then beginA: =False; Break; end; if A thenListBox2. Items. Add(Edit2. Text); Edit2. Clear; end; end; procedure TForm3. Edit3KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var i: Integer; A: Boolean; beginif Key=27 then Close; if Key=13 then beginA: =True; for i: =0 to ListBox3. Items. Count-1 doif Edit3. Text=ListBox3. Items. Strings [i] then beginA: =False; Break; end; if A thenListBox3. Items. Add(Edit3. Text); Edit3. Clear; end; end; procedure TForm3. FormShow(Sender: TObject); beginForm1. Enabled: =False; Form2. Enabled: =False; end; procedure TForm3. FormClose(Sender: TObject; var Action: TCloseAction); beginForm2. 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); beginif ListBox1. ItemIndex>=0 thenif Key=46 then ListBox1. Items. Delete(ListBox1. ItemIndex); if Key=27 then Close; end; procedure TForm3. ListBox2KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); beginif ListBox2. ItemIndex>=0 thenif Key=46 then ListBox2. Items. Delete(ListBox2. ItemIndex); if Key=27 then Close; end; procedure TForm3. ListBox3KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); beginif ListBox3. ItemIndex>=0 thenif Key=46 then ListBox3. Items. Delete(ListBox3. ItemIndex); if Key=27 then Close; end; procedure TForm3. ListBox1Click(Sender: TObject); var i: Integer; begini: =ListBox1. ItemIndex; if i<0 then Exit; if ListBox1. Items. Strings [i] <>'' thenEdit1. Text: =ListBox1. Items. Strings [i] ; end; procedure TForm3. ListBox2Click(Sender: TObject); var i: Integer; begini: =ListBox2. ItemIndex; if i<0 then Exit; if ListBox2. Items. Strings [i] <>'' thenEdit2. Text: =ListBox2. Items. Strings [i] ; end; procedure TForm3. ListBox3Click(Sender: TObject); var i: Integer; begini: =ListBox3. ItemIndex; if i<0 then Exit; if ListBox3. Items. Strings [i] <>'' thenEdit3. Text: =ListBox3. Items. Strings [i] ; end; end.
|
|