МІНІСТЕРСТВО КУЛЬТУРИ I ТУРИЗМУ УКРАЇНИ
КИЇВСЬКИЙ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ КУЛЬТУРИ I МИСТЕЦТВ
ІНСТИТУТ МЕНЕДЖМЕНТУ І ЕКОНОМІКИ
КАФЕДРА КОМП'ЮТЕРНИХ НАУК
КУРСОВА РОБОТА
з дисципліни «Об'єктно-орієнтоване програмування»
на тему: «Пошук найстаршої студентки»
ЗМІСТ
ВСТУП 3
I. ПОСТАНОВКА ЗАДАЧІ 4
II. ФУНКЦІОНАЛЬНЕ ПРИЗНАЧЕННЯ ПРОГРАМИ 4
III. ТЕОРЕТИЧНА ЧАСТИНА
Поняття про бібліотеку ADO 4
Об'єкт Connection 6
Об'єктна модель ADO 8
Установка з'єднання з джерелом даних 8
Рядки з'єднання 9
Набори записів 10
Установка фільтру в наборі записів 12
Компоненти для работи з базою даних 13
Data Source 13
Компонент Ttable 14
Компонент ADOQuery 15
Компонент DBGrid 15
IV. ФУНКЦІЇ, ЩО ВИКЛИКАЮТЬСЯ В ПРОГРАМІ 16
V. ТЕКСТ ПРОГРАМИ 17
VI. Блок-схема програми 32
VII. СТВОРЕННЯ ПРОЕКТУ 35
VIII. ПРИКЛАД РОБОТИ ПРОГРАМИ 38
IX. ВИСНОВККИ 39
X. ВИКОРИСТАНА ЛІТЕРАТУРА 40
Вступ
C++ Builder є sdi-додатком, головне вікно якого містить інструментальну панель (зліва), що набудовується, і палітру компонентів (справа). За замовчанням при запуску C++ Builder з'являються вікно інспектора об'єктів і форма нового застосування. Під вікном форми додатка знаходиться вікно редактора коди. Форми є основою додатків C++ Builder.
Створення інтерфейсу для користувача додатком полягає в додаванні у вікно форми елементів об'єктів C++ Builder, званих компонентами. Компоненти C++ Builder розташовуються на палітрі компонентів, виконаній у вигляді багатосторінкового блокнота. Важлива особливість C++ Builder полягає в тому, що він дозволяє створювати власні компоненти і набудовувати палітру компонентів, а також створювати різні версії палітри компонентів для різних проектів.
Набір даних в C++ Builder є нащадком абстрактного класу Tdataset (абстрактний клас - це клас, від якого можна породжувати інші класи, але не можна створити екземпляр об'єкту даного класу). Наприклад, класи Tquery, Ttable і Tstoredproc, що містяться на сторінці палітри компонентів Data Access - спадкоємці Tdbdataset, який, у свою чергу, є спадкоємцем Tdataset. Tdataset містить абстракції, необхідні для безпосереднього управління таблицями або запитами, забезпечуючи засоби для того, щоб відкрити таблицю або виконати запит і переміщатися по рядках.
ADO - інтерфейс, покликаний забезпечити клієнтське застосування доступом і можливостями маніпулювання зовнішніми даними. ADO є інтерфейсом програмного рівня до OLE DB (інтерфейсом надзвичайно зручним і високопродуктивним). ADO і OLE DB складають разом технологію Універсального Доступу до Даних (UDA). При цьому, будучи інтерфейсом високого рівня до OLE DB, ADO використовує OLE DB постачальники даних (на даний момент це, в основному, провайдери реляційних баз даних хоча вже з'являються постачальники для нереляційних джерел даних і систем електронної пошти). Варто відзначити, що корпорація Microsoft на повний голос заявляє, що ADO найближчим часом замінить величезну різноманітність моделей і технологій доступу до даних, включаючи такі методи самої Microsoft, як DAO.
Постановка задачі
Написати програму у вигляді бази даних (БД) на мові С++ що дозволяє зберігати інформацію про студентів (Ф.І.О., бали, унікальний код запису (порядковий №), дату народження, кількість пропусків). База даних повинна містити основні функції : додавання запису, видалення запису, редагування запису пошук і сортування по заданих параметрах. У даній курсовій роботі виконується пошук найстаршої студентки.
Функціональне призначення програми
Дана програма є базою даних що дозволяє зберігати інформацію про студентів. Програма дозволяє використовувати наступні можливості: створення нової БД, або відкриттів вже створеної, додавання нових даних у файл БД, видалення записів, редагування наявних записів, пошук існуючих записів по даті народження. Кожному новому запису привласнюється свій індивідуальний номер (код), для спрощення введення цей код привласнюється автоматично: функцій find_max_num(char *) знаходить максимальний номер запису у файлі і подальший код привласнюється введеному запису. Також передбачена перевірка даних, що вводяться, на ідентичність, при введенні ідентичних даних користувачеві буде видано запобігання і дана можливість ввести нові дані . Програма використовує дуже зручний і зрозумілий інтерфейс, організована система меню і підменю. Так само передбачений так званий скролінг (прокрутка) інформації, що виводиться, клавішами вгору-вниз.
Поняття про бібліотеку ADO
Бібліотека ADO (Microsoft ACTIVEX Data Object) служить для доступу до баз даних різних типів і надає об'єктний програмний інтерфейс до інтерфейсу OLE DB, який пропонується компанією Microsoft як альтернатива інтерфейсу ODBC. Об'єктна модель ADO реалізована на базі технології COM (Component Object Model).
Бібліотека ADO може бути використана в будь-якій середі, яка в змозі виступити в ролі Ole-клієнта, наприклад, в MS Office (VBA), 1c:предпріятії, адміністративних скриптах Windows (.vbs і .js) і так далі Приклади коду в справжній статті наводитимуться на мові Vbscript для адміністративних скриптів Windows. За допомогою бібліотеки ADO можна звернутися до величезної кількості типів баз даних, наприклад, dbase, Access, Excel, Oracle, Paradox, MS SQL Server, Sybase, текстові файли, Foxpro Active Directory Service, Microsoft Jet, Interbase, Informix, POSTGRESQL, MYSQL і так далі, необхідна лише наявність встановленого відповідного Ole-провайдера ("драйвера" відповідного типа бази даних, який встановлюється в систему як правило з дистрибутива цієї ж бази даних). Приклади коду в справжній статті наводитимуться лише для MS SQL Server, оскільки неможливо обійняти необ'ятноє. Перелік властивостей і методів ADO, пріведённий в цій статті не є вичерпним (в деяких випадках і опис деяких властивостей і методів не є повним). Повний опис об'єктної моделі бібліотеки ADO ви можете отримати в MSDN або у файлі "Ado210.CHM", який входить в постачання MS Office. Проте матеріалу даної статті вистачає щоб почати працювати з ADO.
Основними об'єктами бібліотеки ADO є об'єкти Connection, Command і Recordset.
Об'єкт Connection
Об'єкт Connection (Таблиця 1)забезпечує створення підключення до джерела даних і еквівалентний поточному мережевому з'єднанню з сервером. Об'єкт Connection надає можливість налаштування з'єднання перед його відкриттям, установки бази даних за умовчанням установки і розриву з'єднання з джерелом даних, завдання налаштувань і виконання команди за допомогою методу Execute. Примітка: для виконання команди можна використовувати також метод Execute об'єкту Command, не вдаючись до об'єкту Connection.
Таблиця 1 Методи та властивості компоненту Connection
Опис
Version
Містить рядок, що визначає версію бібліотеки.
ConnectionString
Визначає параметри підключення до джерела даних. Читання і запис. Це рядок, що містить декілька параметрів, разделённих крапкою з комою. Властивість Connectionstring автоматично набуває значення задане як одноїмённого аргумент методу Open. Властивість Connectionstring доступно для запису лише для закритого з'єднання. Багаточисельні приклади різних рядків підключення для різних типів баз даних ви можете знайти в Інтернеті або в документації до відповідних програмних продуктів.
ConnectionTimeout
Встановлює або повертає число секунд очікування підключення до бази даних. Значення за умовчанням - 15. Використовуйте цю властивість, якщо виникають проблеми із-за щільного мережевого трафіку або завантаженості сервера. Якщо час, вказаний в Connectiontimeout, витікає до відкриття підключення, відбувається помилка і ADO відміняє спробу підключення. Якщо Ви встановите властивість в нуль, ADO чекатиме нескінченно, поки підключення не буде відкрито. Упевніться, що використовуваний провайдер підтримує властивість Connectiontimeout. Властивість доступна для запису лише для закритого соєдіненія.дуктам.
CommandTimeout
Встановлює або повертає число секунд очікування виконання команди. Значення за умовчанням - 30. Читання і запис. Використовуйте цю властивість, якщо виникають проблеми із-за щільного мережевого трафіку або завантаженості сервера. Якщо час, вказаний в Commandtimeout, витікає до завершення виконання команди відбувається помилка, і ADO відміняє команду. Якщо Ви встановите властивість в нуль, ADO чекатиме нескінченно, поки команда не буде виконана. Упевніться, що використовуваний провайдер підтримує властивість Commandtimeout. Установка Commandtimeout об'єкту Connection ніяк не пов'язана з установкою властивості Commandtimeout об'єкту Command.
Provider
Встановлює або повертає рядкове значення, яке містить ім'я використовуваного провайдера. За умовчанням - "MSDASQL". Провайдер може бути також встановлений вмістом властивості Connectionstring або параметром методу Open. Визначення провайдера в більш ніж одному місці може мати непередбачувані результати.
DefaultDatabase
Встановлює або повертає рядкове значення, яке містить задану за умовчанням базу даних. Якщо є задана за умовчанням база даних, запити SQL можуть використовувати "дискваліфікований" синтаксис для звернення до об'єктів в цій базі даних. Щоб звертатися до об'єктів з іншої бази даних ви повинні "кваліфікувати" імена об'єктів ім'ям цієї бази даних. При підключенні провайдер записує задану за умовчанням базу даних в цю властивість. Деякі провайдери вирішують лише одну таку базу даних на одне підключення, і в цьому випадку ви не зможете змінити цю властивість. Деякі джерела даних і провайдери можуть не підтримувати цю властивість, генеруючи помилку або повертаючи порожній рядок.
CursorLocation
Визначає розташування курсора, тобто місце, де виконується робота з даними. Можливі значення:
• adusenone(1) - курсор не використовується (лише для сумісності із старими версіями).
• aduseserver(2) - курсор на стороні провайдера (за умовчанням).
• aduseclient(3) - курсор на стороні користувача. Може надавати додаткові можливості, які відсутні на стороні провайдера.
Зміна властивості Cursorlocation не має жодного ефекту при вже існуючому підключенні. Зв'язані об'єкти Recordset і курсори, возвращённиє методом Execute, успадковують цю установку. При відкритому об'єкті Recordset ця властивість доступна лише для читання.
Об'єктна модель ADO
ADO складається з наступних основних компонентів:
• Connection. ADO використовує об'єкти Connection для надання окремих з'єднань з джерелом даних.
• Command. Об'єкти Command використовуються для надання конкретних команд, що виконуються над джерелом даних. Ці об'єкти використовуються для відстежування параметрів, пов'язаних з командою.
• Parameter. Об'єкти Command містять колекцію Parameters, що включає всі пов'язані з командою параметри. Кожен окремий об'єкт Parameter служить для зберігання інформації про параметр передаваному у виконувану команду або такому, що повертається в ній.
• Recordset. Об'єкти Recordset забезпечують взаємодію з даними. Вони використовуються для зберігання набору записів, що повертається з джерела даних.
• Field. Об'єкти Recordset містять колекцію об'єктів Field, використовуваних для оботи з окремими стовпцями групи рядків.
• Property. Об'єкти Connection, Command, Recordset, Field містять колекцію Properties об'єктів Property. Об'єкти Property служать для представлення додаткових параметрів або властивостей об'єкту ADO, які не можуть управлятися вбудованими властивостями об'єкту.
• Error. Призначені для уявлення інформації про помилки, які можуть відбуватися в рамках однієї операції.
Установка з'єднання з джерелом даних
Для цих цілей використовується об'єкт Connection (підключення до джерела даних і управління цим підключенням здійснюється за допомогою методів Open(), Close() об'єкту Connection) . Користувач не може створювати його самостійно. Можна просто дозволити ADO створити з'єднання, використовуване об'єктами Recordset і Command. Проте необхідно створити об'єкт Connection якщо передбачається управління транзакціями (для створення і управління транзакціями призначені наступні методи Connection: Begintrans(), Committrans() і Roolbacktrans()).
Рядки з'єднання
Вид рядка з'єднання (Таблиця 2), що передається в метод Open(...) об'єкту Connection для різних OLE DB постачальників (MSDN)
Таблиця 2 Рядки з’єднання OLE DB
Джерело даних
Рядок з'єднання OLE DB
Microsoft® Access
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=physical path to .mdb file
Microsoft SQL Server
Provider=SQLOLEDB.1;Data Source=path to database on server
Oracle
Provider=MSDAORA.1;Data Source=path to database on server
Microsoft Indexing Service
Provider=MSIDXS.1;Data Source=path to file
Вид строки з’єднання (Таблиця 3), що передається в метод Open(...) об’єкта Connection для різних ODBC постачальників даних (MSDN)
Таблиця 3 Строки з’єднання ODBC
Джерело даних
Рядок з'єднання ODBC
Microsoft Access
Driver={Microsoft Access Driver (*.mdb)};DBQ=physical path to .mdb file
SQL Server
DRIVER={SQL Server};SERVER=path to server
Oracle
DRIVER={Microsoft ODBC for Oracle};SERVER=path to server
Microsoft Excel
Driver={Microsoft Excel Driver (*.xls)};DBQ=physical path to .xls file; DriverID=278
Microsoft Excel 97
Driver={Microsoft Excel Driver (*.xls)};DBQ=physical path to .xls file;DriverID=790
Paradox
Driver={Microsoft Paradox Driver (*.db)};DBQ=physical path to .db file;DriverID=26
Text
Driver={Microsoft Text Driver (*.txt;*.csv)};DefaultDir=physical path to .txt file
Microsoft Visual FoxPro® (with a database container)
Driver={Microsoft Visual FoxPro Driver};SourceType=DBC;SourceDb=physical path to .dbc file
Microsoft Visual FoxPro (without a database container)
Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDb=physical path to .dbf file
Набори записів
З'єднання з джерелом даних встановлене. Далі необхідно власне ці дані отримати і якось ними управляти. З цією метою створюється об'єкт Recordset, який інкапсулює набір записів, що повертаються джерелом. За допомогою цього об'єкту ми зможемо додавати, видаляти, змінювати записи у цей об'єкт включений механізм переміщень по записах в наборі даних.
Створення набору записів
Об'єкт Recordset можна створити декількома способами: в результаті виконання команди (використання методу Execute() об'єкту Command або Connection), або за допомогою методу Open() безпосередньо об'єкту Recordset.
• Source - джерело вибірки (набору записів). Може бути як SQL рядок (запит), так і ім'я таблиці або процедури, що зберігається, на SQL сервері.
• Activeconnection - З'єднання, використовуване для створення набору записів (вибірки). Може бути передано або у вигляді рядка з'єднання (при цьому відпадає необхідність створення об'єкту Connection - ADO автоматично створює з'єднання, яке буде використано для даного об'єкту Recordset. Покажчик на таке з'єднання можна отримати за допомогою властивості об'єкту Recordset Activeconnection) або у вигляді покажчика на вже створене активне з'єднання
• Cursortype - тип курсора для створюваного об'єкту Recordset. Може приймати одне з наступних значень:
о adopenunspecified - невизначений тип курсора.
о adopenforwardonly - однобічний курсор (значення за умовчанням). Не підтримує методи Movefirst() (на початок вибірки), Movelast() (до останнього запису у вибірці)Moveprevious()(до попереднього запису у вибірці). Також не підтримує використання властивості Recordcount (кількість записів у вибірці). Не відстежуються зміни і додавання, зроблені іншими користувачами.
о adopenkeyset - курсор, керований по ключовій безлічі, який може вільно переміщатися і знаходить деякі види змін, внесені до рядків вибірки. Число записів в такому наборі незмінно. Ви не зможете побачити доданих іншими користувачами записів видалені іншими користувачами запису залишаються видимі в такій вибірці, хоча і стають недоступнимі.
о adopendynamic - динамічний курсор, який може переміщатися і визначати всі зміни, внесені до даних, що містяться у вибірці. Самий багатофункціональний але і найдорожчий по витраті пам'яті тип курсора.
о adopenstatic - статичний курсор. На відміну від DAO, дозволяється модифікувати все ADO Recordset, що навіть мають курсори adforwardonly і adopenstatic. Проте при виборі таких курсорів для вибірки всі зміни що вносяться іншими користувачами для вас невідіми.
• Locktype - Тип блокування, використовуваний даним набором записів. Варіанти:
о adlockreadonly - лише читання.
о adlockpessimistic - блокує рядки, коли ви починаєте редагування (якщо постачальник підтримує даного типа).
о adlockoptimistic - блокує зміни лише при передачі змін в БД (підтримується всіма постачальниками даних).
о adlockbatchoptimistic - використовується для пакетних операцій модифікації. Пакетна модифікація дозволяє вивантажувати безліч записів модифікувати їх локально і посилати зміни постачальникові в одному пакеті. Большинсто провайдерів не підтримують це блокування.
• Options - використовується для вказівки виду Source. Варіанти:
о adcmdtext - текстова команда (у SQL угоді).
о adcmdtable - таблиця або вистава (вона ж - "вьюха", т.е.view).
о adcmdstoredproc - процедура, що зберігається
о adcmdunknown - невідомий тип (за умовчанням).
Установка фільтру в наборі записів
У ADO є механізм обмеження по якому-небудь критерію набору записів, що повертається, - фільтрація вибірки. Саме для цілей фільтрації об'єкт Recordset володіє властивістю Filter.
Властивістю Filter є розширення запиту заданого в параметрі Source Recordset'a. Рядок, що передається у властивість Filter, повинен мати вид Імя_поля(стовпця) - Оператор – Значення.
Властивість Filter також може набувати значення однієї з нижче перерахованих констант:
• adfilternone - Відміняє поточне значення властивості Filter.
• adfilterpendingrecords - В режимі пакетної модифікації (см.ніже) це значення можна використовувати для вибору лише з тих рядків, які були змінені, але ще не модифіковані в базі даних.
• adfilteraffectedrecords - Вибирає рядки для яких виконувалася остання операція Delete(), Resync(), Updatebatch(), Cancelbatch().
• adfilterfetchedrecords - вибирає рядки, які в даний час містяться в локальному буфері.
Компоненти для работи з базою даних
Data Source
Компонент Data source діє як посередник між компонентами Tdataset (Ttable, Tquery, Tstoredproc) і компонентами Data Controls - елементами управління, що забезпечують представлення даних на формі. Компоненти Tdataset управляють зв'язками з бібліотекою Borland Database Engine (BDE), а компонент Datasource управляє зв'язками з даними в компонентах Data Controls.
У типових додатках БД компонент Datasource, як правило, пов'язаний з одним компоненом Tdataset (Ttable або Tquery) і з одним або більш компонентами Data Controls (такими, як Dbgrid, Dbedit і ін.). Зв'язок цього компоненту з компонентами Tdataset і Datacontrols здійснюється з використанням наступних властивостей і подій:
• Cвойство Dataset компоненту Datasource ідентифікує ім'я компоненту Tdataset. Можна привласнити значення властивості Dataset на етапі виконання або за допомогою інспектора об'єктів на етапі проектування.
• Cвойство Enabled компоненту Datasource активізує або зупиняє взаємозв'язок між компонентами Tdatasource і Data Controls. Якщо значення властивості Enabled рівне true, то компоненти Data Controls, пов'язані з Tdatasource, сприймають зміни набору даних. Використання властивості Enabled дозволяє тимчасово роз'єднувати візуальні компоненти Data Controls і Tdatasource, наприклад, для того, щоб в разі пошуку в таблиці з великою кількістю записів не відображувати на екрані перегортування всієї таблиці.
• Властивість Autoedit компоненту Datasource контролює, як ініціюється редагування в компонентах Data Controls. Якщо значення властивості Autoedit рівне true, то режим редагування починається безпосередньо при здобутті фокусу компонентом Data Controls, пов'язаним з даним компонентом Tdataset. Інакше режим редагування починається, коли викликається метод Edit компоненту Tdataset, наприклад, після натиснення користувачем кнопки Edit на компоненті Dbnavigator. • Подія Ondatachange компоненту Datasource настає, коли відбувається зміна значення поля, запису, таблиці, запиту.
• Cобиті Onupdatedata компоненту Datasource настає, коли користувач намагається змінити поточний запис в Tdataset. Обробник цієї події слід створювати, коли потрібно дотримати умови посилальної цілісності або обмеження, що накладаються на значення полів змінної бази даних.
Компонент Ttable
Найбільш простим способом звернення до таблиць баз даних є використання компоненту Ttable, що надає доступ до однієї таблиці. Для цієї мети найчастіше використовуються наступні властивості:
• Active - вказує, відкрита (true) чи ні (false) дана таблиця.
• Databasename - ім'я каталога, що містить шукану таблицю, або псевдонім (alias) видаленої БД (псевдоніми встановлюються за допомогою утиліти конфігурації BDE, опис якої присутній в багатьох джерелах, присвячених продуктам Borland, або за допомогою SQL Explorer меню Database/explore, що викликається за допомогою пункту). Ця властивість може бути змінене лише у випадку, якщо таблиця закрита (її властивість Active рівна false).
• Tablename - ім'я таблиці.
• Exclusive - якщо цю властивість приймає значення true, то жодною інший користувач не може відкрити таблицю, якщо вона відкрита даним застосуванням. Якщо ця властивість рівна false (значення за умовчанням), то інші користувачі можуть відкривати цю таблицю.
• Indexname - ідентифікує вторинний індекс для таблиці. Цю властивість не можна змінити, поки таблиця відкрита.
• Masterfields - визначає ім'я поля для створення зв'язку з іншою таблицею.
• Mastersource - ім'я компоненту Tdatasource, за допомогою якого Ttable отримуватиме дані із зв'язаної таблиці.
• Readonly - якщо ця властивість рівна true, таблиця відкрита в режимі "лише для читання". Не можна змінити властивість Readonly, поки таблиця відкрита.
• Eof, Bof - ці властивості набувають значення true, коли покажчик поточного запису розташований на останній або відповідно першому запису таблиці.
• Fields - масив об'єктів Tfield. Використовуючи цю властивість, можна звертатися до полів по номеру, що зручно, коли заздалегідь невідома структура таблиці:
Edit1->text=table1->fields[2]->AsString;
Компонент ADOQuery
Компонент Query (Таблиця 4) представляє частина бази даних — записи, вміст яких задовольняє критерію Sql-запросу до таблиці.
Таблиця 4 Властивості компоненту ADOQuery
Властивість
Визначає
Name
Ім'я компоненту. Використовується компонентом Datasource для зв'язку результату виконання запиту (набору записів) з компонентом, що забезпечує перегляд записів, наприклад Dbgrid
SQL
Записаний на мові Sql-запрос до бази даних (до таблиці)
Active
При привласненні властивості значення true активізує виконання запиту
RecordCount
Кількість записів в базі даних, що задовольняють критерію запиту
Компонент DBGrid
Компонент Tdbgrid забезпечує табличний спосіб відображення на екрані рядків даних з компонентів Ttable або Tquery. Додаток може використовувати Tdbgrid для відображення, вставки, знищення, редагування даних БД. Зазвичай Dbgrid використовується у поєднанні з Dbnavigator хоча можна використовувати і інші інтерфейсні елементи, включивши в їх обробники подій методи First, Last, Next, Ptior, Insert, Delete, Edit, Append, Post, Cancel компоненту Ttable.
Зовнішній вигляд таблиці (наприклад, написи в заголовках стовпців) може бути змінений за допомогою редактора властивостей Columns Editor. Для виклику Columns Editor потрібне або вибрати відповідну опцію в контекстному меню компоненту Dbgrid або клацнути мишею в колонці значень напроти властивості Columns в інспекторові об'єктів.
Функції, що викликаються в програмі
void interface(char *) - функція основного інтерфейсу програми. Як вхідний параметр приймає ім'я робочого файлу fn яке передається функціями void create() або void open(). У цій функції реалізовано вельми зручне меню, через яке і відбувається виклик подальший функція додавання сортування, видалення, пошуку і редагування;
void add(char *) - функція додавання запису в БД. Вхідний параметр fn ім'я файлу. Використовує функцію int find_max_num(char *) для привласнення запису, що вводиться, свій унікальний номер.
void del(char *) - функція видалення запису з БД. Вхідний параметр fn ім'я файлу. Використовує тимчасовий файл temp.$$$, в кінці виконання функції тимчасовий файл перейменовується у файл під ім'ям змінної fn;
void edit(char *) - функція редагування існуючого запису. Вхідний параметр fn ім'я файлу. Дозволяє змінювати № (код) записи, а також будь-яку інформацію запису;
void view(char *, int ) - функція виведення даних на екран. Вхідний параметр fn ім'я файлу;
void find(char *) - функція пошуку запису по даті народження. Вхідний параметр fn ім'я файлу;
int get_number(char *) - повертає кількість записів у файлі. Вхідний параметр fn ім'я файлу;
void open() - відкриття файлу БД. Йде запит на ймення файл, після цього до імені файлу автоматично додається розширення “.dat” ім'я цього файлу вважається робочим для всієї програми. При вдалому відкритті файлу його ім'я передається у функцію void interface(char *) і т.д.;
Текст програми
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Buttons.hpp>
#include <ComCtrls.hpp>
#include <ToolWin.hpp>
#include <Dialogs.hpp>
#include <Menus.hpp>
#define N 100
class PRICE
{
AnsiString Name;
int Year;
int Month;
int Day;
int Mark1;
int Mark2;
int Mark3;
bool Sex;
int Lost;
public:
PRICE();
AnsiString GetName()
{return Name;}
int GetYear()
{return Year;}
int GetMonth()
{return Month;}
int GetDay()
{return Day;}
int GetMark1()
{return Mark1;}
int GetMark2()
{return Mark2;}
int GetMark3()
{return Mark3;}
int GetSex()
{return Sex;}
int GetLost()
{return Lost;}
void Add(AnsiString, int, int, int, int, int, int, bool, int);
};
//---------------------------------------------------------------------------
PRICE::PRICE()
{
Name = "NULL";
Year = 0;
Month = 0;
Day = 0;
Mark1 = 0;
Mark2 = 0;
Mark3 = 0;
Sex = 0;
Lost = 0;
}
//---------------------------------------------------------------------------
void PRICE::Add(AnsiString name, int year, int month, int day,
int mark1, int mark2, int mark3, bool sex, int lost)
{
Name = name;
Year = year;
Month = month;
Day = day;
Mark1 = mark1;
Mark2 = mark2;
Mark3 = mark3;
Sex = sex;
Lost = lost;
}
//---------------------------------------------------------------------------
class TMP : public TForm
{
__published: // IDE-managed Components
TMemo *Name;
TMemo *Year;
TMemo *Month;
TMemo *Mark1;
TMemo *Mark2;
TMemo *Day;
TEdit *FindName;
TEdit *FindYear;
TEdit *FindMonth;
TEdit *FindDay;
TEdit *FindMark1;
TEdit *FindMark2;
TMemo *No;
TEdit *FindNo;
TToolBar *ToolBar1;
TSpeedButton *OpenBut;
TSpeedButton *SaveBut;
TOpenDialog *OD;
TSaveDialog *SD;
TMemo *Lost;
TMemo *Sex;
TMemo *Mark3;
TEdit *FindLost;
TEdit *FindSex;
TEdit *FindMark3;
TLabel *L01;
TLabel *L02;
TLabel *L03;
TLabel *L04;
TLabel *L05;
TLabel *L06;
TLabel *L07;
TLabel *L08;
TLabel *L09;
TLabel *L10;
TButton *NewStud;
void __fastcall NewStudClick(TObject *Sender);
void __fastcall OpenButClick(TObject *Sender);
void __fastcall SaveButClick(TObject *Sender);
void __fastcall Find(TObject *Sender);
private: // User declarations
public: // User declarations
PRICE Stud[N];
void __fastcall Clear();
void __fastcall Refresh();
void __fastcall View(int);
void __fastcall Open(AnsiString);
void __fastcall Save(AnsiString);
__fastcall TMP(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TMP *MP;
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------
#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Menus.hpp>
//---------------------------------------------------------------------------
class TAdd : public TForm
{
__published: // IDE-managed Components
TEdit *Name;
TEdit *Year;
TEdit *Month;
TEdit *Day;
TLabel *L1;
TLabel *L2;
TLabel *L3;
TLabel *L4;
TGroupBox *EditBox;
TButton *EditBut;
TButton *DelBut;
TButton *LeftBut;
TButton *RightBut;
TEdit *Numb;
TButton *NewBut;
TLabel *L5;
TLabel *L6;
TLabel *L7;
TEdit *Mark1;
TEdit *Mark2;
TEdit *Mark3;
TLabel *L8;
TLabel *L9;
TEdit *Lost;
TComboBox *Sex;
TMainMenu *MainMenu1;
TMenuItem *N3;
void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
void __fastcall NewButClick(TObject *Sender);
void __fastcall DelButClick(TObject *Sender);
void __fastcall EditButClick(TObject *Sender);
void __fastcall LeftButClick(TObject *Sender);
void __fastcall RightButClick(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TAdd(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TAdd *Add;
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMP *MP;
//---------------------------------------------------------------------------
__fastcall TMP::TMP(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TMP::Clear()
{
No->Lines->Clear();
Name->Lines->Clear();
Year->Lines->Clear();
Month->Lines->Clear();
Day->Lines->Clear();
Mark1->Lines->Clear();
Mark2->Lines->Clear();
Mark3->Lines->Clear();
Sex->Lines->Clear();
Lost->Lines->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TMP::Refresh()
{
Clear();
for (int i=0; i<N; i++) {
if (Stud[i].GetName() != "NULL") {
No->Lines->Add(i+1);
Name->Lines->Add(Stud[i].GetName());
Year->Lines->Add(Stud[i].GetYear());
Month->Lines->Add(Stud[i].GetMonth());
Day->Lines->Add(Stud[i].GetDay());
Mark1->Lines->Add(Stud[i].GetMark1());
Mark2->Lines->Add(Stud[i].GetMark2());
Mark3->Lines->Add(Stud[i].GetMark3());
Sex->Lines->Add(Stud[i].GetSex()==1?"Мужской":"Женский");
Lost->Lines->Add(Stud[i].GetLost());
}
}
}
//---------------------------------------------------------------------------
void __fastcall TMP::View(int i)
{
if (Stud[i].GetName() != "NULL") {
No->Lines->Add(i+1);
Name->Lines->Add(Stud[i].GetName());
Year->Lines->Add(Stud[i].GetYear());
Month->Lines->Add(Stud[i].GetMonth());
Day->Lines->Add(Stud[i].GetDay());
Mark1->Lines->Add(Stud[i].GetMark1());
Mark2->Lines->Add(Stud[i].GetMark2());
Mark3->Lines->Add(Stud[i].GetMark3());
Sex->Lines->Add(Stud[i].GetSex()==1?"Мужской":"Женский");
Lost->Lines->Add(Stud[i].GetLost());
}
}
//---------------------------------------------------------------------------
void __fastcall TMP::NewStudClick(TObject *Sender)
{
Add->Visible = true;
MP->Enabled = false;
}
//---------------------------------------------------------------------------
void __fastcall TMP::OpenButClick(TObject *Sender)
{
if (OD->Execute()) {
Open(OD->FileName);
Refresh();
}
}
//---------------------------------------------------------------------------
void __fastcall TMP::SaveButClick(TObject *Sender)
{
if (SD->Execute()) {
Save(SD->FileName);
}
}
//---------------------------------------------------------------------------
void __fastcall TMP::Open(AnsiString Path)
{
char Name[32];
int Year;
int Month;
int Day;
int Mark1;
int Mark2;
int Mark3;
bool Sex;
int Lost;
int load = FileOpen(Path, 0);
for (int i=0; i<N; i++) {
FileRead (load, Name, 32);
FileRead (load, &Year, sizeof(Year));
FileRead (load, &Month, sizeof(Month));
FileRead (load, &Day, sizeof(Day));
FileRead (load, &Mark1, sizeof(Mark1));
FileRead (load, &Mark2, sizeof(Mark2));
FileRead (load, &Mark3