Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методичка практические ооп.doc
Скачиваний:
8
Добавлен:
11.11.2018
Размер:
4.54 Mб
Скачать

МІНІСТЕРСТВО НАУКИ ТА ОСВІТИ УКРАЇНИ

ПРИАЗОВСЬКИЙ ДЕРЖАВНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ

МЕХАНІКО-МЕТАЛУРГІЙНИЙ ТЕХНІКУМ

Затверджую

Заст.директора

________________Рубан Л.О.

«__»__________2010 р

Методичні вказівки

до виконання практичних робіт

з дисципліни: “Об`єктно-орієнтоване програмування”

для студентов 3 курса

спеціальності: 5.080405

“Розробка програмного забезпечення”

Розробив та склав викладач

Івлієва Н.В.

Розглянуто та узгоджено

цикловою комісією 5.080405

«Програмування для ЕОТ та АС»

Протокол № від “__”______________2010р.

Голова комісії ____________ Ількевич В.О.

Маріуполь

2010

Загальні положення

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

У результаті виконання практикуму студент повинен:

- знати способи підготовки завдань розрахункового характеру для обробки на комп'ютері;

- уміти розробляти, налагоджувати, тестувати програми обробки даних на комп'ютері з використанням структурного, об'єктно-орієнтованого, візуального програмування;

- виконувати документування й супровід додатків;

- виконувати розрахунки трудомісткості й вартості створеного програмного забезпечення.

Зміст і обсяг підготовки

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

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

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

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

Перелік ПРАКТИЧНИХ робіт

з дисципліни 3.05 «Обєктно-орієнтоване програмування»

для спеціальності 5.05010301 «Розробка програмного забезпечення»

Назва і шифр модулю, до якого відноситься практична робота

Назва практичної роботи

Кіль-кість

год.

Лаб

При-мітки

КЗП.15.01 Об'єктно-орієнтований аналіз та проектуванн

Практична робота №1 Інтегроване середовище розробки ПЗ С++ Builder

4

226

КЗП.15.03 Розділення інтерфейсу та реалізації

Практична робота №2 Розробка прикладення для роботи з файлами та папками з використанням підказок

Практична робота №3 Створення прикладення для роботи із зображеннями та файлами мультимедіа

Практична робота №4 Створення прикладення для роботи з системним програмним забезпеченням (API) ОС Win32

Практична робота №5 Створення довідкової системи

16

226

КЗП.15.07 Класи колекцій і протоколи ітерації

Практична робота №6 Створення бази даних

Практична робота №7 Створення прикладення для перегляду БД

Практична робота №8 Створення розрахункових та підстановочних полей

Практична робота №9 Фільтрація даних

Практична робота №10 Пошук у таблиці

Практична робота №11 Створення звітів

Практична робота №12 Створення браузеру

28

226

Практична робота №1

Тема: Інтегроване середовіще розробки ПЗ С++ Builder

Мета: Навчитися працювати в ІСР, створювати проекти і класи, виконувати відладку програм, перейменування, пошук і інші стандартні дії.

Хід роботи.

Загальний вид вікна ІСР

Інтегроване Середовище Розробки (Integrated Development Environment -

IDE, надалі ми використовуватимемо для неї абревіатуру ІСР) - це середовище

у якій є все необхідне для проектування, запуску і тестування прі-

ложеній і де все націлено на полегшення процесу створення програм. ІСР ін-

тегріруєт в собі редактор код, відладчик, інструментальні панелі, редактор

зображень, інструментарій баз даних - все, з чим доводиться працювати. Ета

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

няющих один одного. Більш того, як ви побачите надалі, вам надана

можливість розширювати меню ІСР, включаючи в нього необхідні вам дополні-

тільні програми, у тому числі і власні. Результатом є зручна

для вас середовище швидкої розробки складних прикладних програм.

Запустите C++builder, вибравши піктограму C++builder 6 в розділі меню

Windows Пуск Програми. Коли ви клацнете на піктограмі С+-l-builder, перед

вами відкриється основне вікно Інтегрованого Середовища Розробки. Його вигляд пред-

ставлен на мал. 2.1.

У верхній частині вікна ІСР ви бачите смугу головного меню. Її склад частіч-

але залежить від варіанту C++builder, з яким ви працюєте. На мал. 2.1 приведений

вид вікна для варіанту Enterprise.

Нижче за смугу головного меню розташовано дві інструментальні панелі.

Ліва панель (що складається у свою чергу з декількох панелей) містить два

ряду швидких кнопок, дублюючих деякі найчастіше використовувані ко-

манди меню. Права панель містить палітру компонентів бібліотеки візу-

альних компонентів. Палітра компонентів містить ряд сторінок, закладки ко-

торих видно в її верхній частині. Склад палітри залежить не тільки від варіанту

C++builder, але і від того, чи створюєте ви додаток Windows, або кросс-плат-

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

або склад Visual Component Library - VCL, або склад cross-platform component

.library - CLX. У версіях, молодше C++builder би, є тільки VCL.

Правіше за смугу головного меню розміщена ще одна невелика інструменталь-

ная панель, що містить випадний список і дві швидкі кнопки. Це панель

збереження і вибору різних конфігурацій вікна ІСР, які ви самі може-

ті створювати і запам'ятовувати.

У основному полі вікна ви можете бачити зліва два вікна: зверху - Дерево Об'-

ектов (Object Treeview), під ним - Інспектор Об'єктів (Object Inspector). Вікно

Дерево Об'єктів відображатиме ієрархічний зв'язок візуальних і невізуаль-

них компонентів і об'єктів вашого застосування. А Інспектор Об'єктів - це ос-

новной інструмент, за допомогою якого ви надалі задаватимете свойст-

ва компонентів і обробники подій. Правіше за ці вікна ви можете бачити вікно

порожньої форми, готової для перенесення на неї компонентів. Під ним розташовано

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

його розмір дорівнює розміру форми і вікно Редактора Код практично повністю

перекривається вікном форми. На мал. 2.1 це вікно трохи зрушене і виглядива-

ет з-під вікна форми.

Розглянемо тепер основні елементи вікна ІСР.

Смуга головного меню і спливаючі меню

Надалі при обговоренні різних проектних операцій ми ще будемо

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

короткий огляд основних розділів.

Розділи меню File (файл) дозволяють створити новий проект, нову форму, от-

крити раніше створений проект або форму, зберегти проекти або форми у фай-

лах із заданими іменами.

Розділи меню Edit (правка, редагування) дозволяють виконувати звичайні

для додатків Windows операції обміну з буфером Clipboard, а також дають воз-

можность вирівнювати групи розміщених на формі компонентів по розмірах

і місцеположенню.

Розділи меню Search (пошук) дозволяють здійснювати пошук і контекстні

заміни в коді додатки, які властиві більшості відомих тексто-

вих редакторів.

Розділи меню View (перегляд) дозволяють викликати на екран різні вікна

необхідні для проектування.

Розділи меню Project (проект) дозволяють додавати і прибирати з проекту фор-

ми, задавати опції проекту, компілювати проект без його виконання і робити

багато інших корисних операцій.

Меню Run (виконання) дає можливість виконувати проект в нормальному

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

точках коди, проглядаючи значення змінних і так далі

Меню Component (компонент) дозволяє створювати і встановлювати нові ком-

поненти, конфігурувати палітру компонентів, працювати з пакетами.

Розділи меню Database (база даних) дозволяють використовувати інструмента-

рій для роботи з базами даних.

Меню Tools (інструментарій) включає ряд розділів, дозволяючих настраї-

вать ІСР і виконувати різні допоміжні програми, наприклад, визи-

вать Редактор Зображень (Image Editor), працювати з програмами, конфігурі-

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

будь-які розділи, що викликають ті або інші застосування, і таким чином расши-

ріть можливості головного меню C++builder, пристосувавши його для своїх завдань

Меню Window (вікно) є тільки в C++builder 6. Розділи цього меню по-

зволяют орієнтуватися серед маси вікон, зазвичай одночасно відкритих

в процесі проектування і перемикатися в потрібне вікно.

Меню Help (довідка) містить розділи, що допомагають працювати з вбудованою

у C-h-builder довідковою системою.

Ми розглянули основні меню, що входять в смугу головного меню. Але помі-

мо-пермалой головного меню в C++builder є система контекстних спливаючих ме-

ню, які з'являються, якщо користувач помістив курсор миші в тому або

іншому вікні або на тому або іншому компоненті і клацнув правою кнопкою миші.

Більшість розділів цих контекстних меню дублюють основні розділи глав-

ного меню. Проте в спливаючих меню у ряді випадків є розділи, отсут-

ствующие в головному меню. І до багатьох інструментів, використовуваних для роботи

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

Отже почастіше пробуйте в процесі роботи клацати правою кнопкою миші. Це

прискорить виконання багатьох проектних операцій.

Швидкі кнопки

Інструментальні панелі швидких кнопок в C++builder 6 представлені на

мал. 2.2. Панелі Інтернет і CORBA за умовчанням невидимі. Щоб зробити їх ві-

дімимі, треба виконати команду View | Toolbars і включити відповідні інді-

катори. У C++builder 5 перші дві панелі, приведені на мал. 2.2, аналогічні, а

панелі Інтернет (мал. 2.2 в) CORBA (мал. 2.2 грама) відсутні. У C-h-builder 4 немає і па-

нелі налаштування конфігурації (мал. 2.2 би). Призначення розміщених на панелях

швидких кнопок можна дізнатися з ярличків, що з'являються, якщо ви помістите

курсор миші над відповідною кнопкою і на деякий час затримаєте його.

У таблиці. 2.1 приведені піктограми цих кнопок, відповідні ним команди

меню і «гарячі» клавіші, а також короткі пояснення.

На мал. 2.2 і в таблиці. 2.1 приведений стандартний склад інструментальних па-

нелей швидких кнопок. Проте в C++builder 6 вам надаються широкі воз-

можності набудувати панелі на свій розсуд, додати в них якісь бист-

риє кнопки для часто вживаних вами команд, прибрати кнопки, якими ви

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

Палітра компонентів

Палітра компонентів (мал. 2.3) - це вітрина бібліотеки візуальних ком-

понентов (Visual Component Library - VCL). Вона дозволяє згрупувати компо-

ненти відповідно до їх сенсу і призначення. Ці групи або сторінки

забезпечені закладками. Ви можете змінювати комплектацію сторінок, вводити но-

виє сторінки, переставляти їх, вносити на сторінки розроблені вами шабло-

ни і компоненти і так далі

Оскільки число сторінок в C-f+builder 6 велике і не всі закладки видно на ек-

рані одночасно, в правій частині палітри компонентів є дві кнопки з

стрілками, направленими вліво і управо. Ці кнопки дозволяють переміщати ото-

бражаємую на екрані частина палітри. Крім того, в C++builder 6 в контекстному

меню палітри компонентів, спливаючому при клацанні на палітрі правою кнопкою

миші, є розділ Tabs. При виборі цього розділу ви побачите алфавітний пере-

чень сторінок бібліотеки і зможете перемкнутися на вказану вами сторінку.

Щоб перенести компонент на форму, треба відкрити відповідну стра-

ніцу бібліотеки і вказати курсором миші необхідний компонент. При цьому

кнопка-покажчик розміщена в лівій частині палітри компонентів, пріобре-

тет вид не натиснутої кнопки. Це означає, що ви знаходитеся в змозі, коли со-

біраєтесь помістити компонент на форму. Якщо ви натиснете цю кнопку, це буде

означати, що ви відмовилися від розміщення вибраного компоненту.

Помістити вибраний в палітрі компонент на форму дуже просто - треба

зробити клацання мишею в потрібному місці форми. Є і інший спосіб помістити

компонент на форму - досить зробити подвійне клацання на піктограмі ком-

понента в палітрі, і він автоматично розміститься в центрі вашої форми. Якщо

ви вибрали компонент, а потім змінили ваш намір розміщувати його, вам дос-

таточно натиснути кнопку покажчика. Це перерве процес розміщення компоненту, і

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

компонент або виконувати якусь команду.

Імена компонентів, відповідних тій або іншій піктограмі, ви можете

дізнатися з ярличка, що з'являється, якщо ви затримаєте над цією піктограмою

курсор миші. Якщо ви виберете в палітрі компонент і натиснете клавішу F1, то

вам буде показана довідка за типом даного компоненту. Тут треба відразу зробити

одне зауваження. Імена на ярличках виглядають, наприклад, так: Mainmenu, Button

і так далі Проте в C++builder всі імена класів насправді починаються

з символу "Т", наприклад, Tmainmenu, Tbutton. Під такими іменами ви можете

знайти описи відповідних компонентів у вбудованій в C++builder спра-

вочной системі.

Вікно форми

Основою майже всіх додатків С+-(-builder є форма. Її можна поні-

мати як типове вікно Windows. Форма є основою, на якій размеща-

ются інші компоненти.

Форма має ті ж властивості, що властиві іншим вікнам Windows, а її внеш-

ній вигляд залежить від того, яку версію Windows і з якими налаштуваннями ви іс-

пользуєте. Форма має меню, що управляє, у верхньому лівому кутку, смугу заголов-

но, що займає верхню частину вікна, кнопки розгортання, згортання і за-

критія вікна у верхньому правому кутку. Можна змінити вид вікна, прибравши в нім ка-

кие-то кнопки або всю смугу заголовка, зробивши його вікном з незмінними раз-

заходами і тому подібне

Під час проектування форма покрита сіткою з крапок. У вузлах цієї сітки

розміщуються ті компоненти, які ви поміщаєте на форму. Під час виполне-

нія застосування ця сітка, звичайно, не видно.

В деяких випадках при розробці якогось модуля форма може оказать-

ця взагалі непотрібною. Але зазвичай вся робота в C++builder проводиться саме на

формі.

Коли ви помістили на формі якісь компоненти, ви можете отримати по

ним контекстну довідку. Для цього виділите компонент, що цікавить вас, і на-

тисніть клавішу F1. Якщо ви клацнете на самій формі і натиснете клавішу F1, вам

буде показана довідка по класу форми. Вікно Редактора Коди

Однією з найбільш важливих частин середовища C++builder є вікно Редактора

Коди, показане на мал. 2.4 а. Насправді, якщо ви відкриєте вперше

це вікно в C++builder 5, воно може виглядати трохи інакше (рис 2.4 би) і включати

у себе зліва ще одне вбудоване вікно - вікно Дослідника Класів (Classexplorer), і у багатьох випадках ви просто можете закрити це додаткове вікно, клацнувши на кнопці в його правом верхньому куті, або задати опції середовища проектування, що відміняють за умовчанням появу вікна Classexplorer (команда Tools \ Environment Options, сторінка Classexplorer, опція Automatically Show Explorer).

Редактор Коди в C++builder 6 при прогляданні програмного модуля має три

сторінки, закладки яких ви можете бачити в нижній частині вікна на мал. 2.4 а.

Дві з них відображають коди файлу реалізації (Unitl.cpp) і заголовного файлу

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

Коди тільки в C++builder 6. У C++builder 5 для того, щоб побачити цей код, треба

клацнути у вікні редактора правою кнопкою миші і вибрати з того, що сплив (контек-

стного) меню команду Open Source/header File. Якщо у цей момент ви знаходилися

у вікні Редактора Коди на сторінці з текстом файлу реалізації модуля, то в Редак-

тор Коди завантажиться заголовний файл вашого модуля. Сторінка Diagram (діаграм-

ми), введена тільки в C++builder 6, дозволяє вам будувати діаграми, іллюстрі-

рующие взаємини компонентів у вашому застосуванні.

Ця сторінка є повноцінним програмним редактором. Її можна на-

страївать на різний стиль роботи, який вам звичніший. У редакторові

застосовується виділенням кольором і шрифтом синтаксичних елементів. Жирним

шрифтом виділяються ключові слова C++ (на мал. 2.4 ви бачите виділення та-

ких слів, як «class», «public» і ін.). Зеленим кольором виділяються директиви пре-

процесора (на мал. 2.4 це директиви «#include»). Синім курсивом виділяються

коментарі (на мал. 2.4 це тексти «// Ide-managed Components» і «// User

declarations»).

У заголовку вікна Редактора Коди відображається ім'я файлу реалізації того

модуля, з текстом якого ви працюєте. Закладки у верхній частині вікна позволя-

ют перемикатися з одного модуля на іншій, якщо у вашому проекті декілька мо-

дулею. У прикладі на мал. 2.4 в проекті два модулі: «Unitl.cpp» і «Unit2.cpp».

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

сторінки в Редакторові Коди, вибравши в контекстному меню команду Close Page. Ви

можете також відкрити додаткове вікно Редактора Коди (командою View New

Edit Window або клацнувши у вікні Редактора Коди правою кнопкою миші і вибравши

аналогічну команду з меню, що спливло) і одночасно працювати з неськольки-

мі модулями або з різними фрагментами одного модуля.

У нижній частині вікна Редактора Коди ви можете бачити типову для тексто-

вих редакторів рядок стану. У найлівішій її позиції знаходиться індикатор

рядки і колонки. Правіше розташований індикатор модифікації, який словом

«Modified» показує, що код, який ви бачите у вікні, змінений і не збігається

з тим, який зберігається на диску. Третій елемент рядка стану - стандарт-

ний більшості редакторів індикатор режиму вставки.

У вікно Редактора Коди, як і в інші вікна C++builder, вбудована контекстна

довідка. Щоб отримати довідку по якомусь слову коди (ключовому слову, на-

пісанному імені функції і тому подібне) досить встановити курсор на це слово і на-

жати клавішу F1. Вам буде показана відповідна тема довідки, вбудованої

у C++builder, якщо ви її, звичайно, встановили.

У вікні Редактора Коди можна дивитися і редагувати не тільки автоматіче-

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

у редактор командою File | Open або відповідною швидкою кнопкою також тек-

стовиє файли і файли HTML, використовувані при роботі з Інтернет. Файли HTML у вікні редактора відображатимуться як текстові на сторінці Code. Але в C++builder 6 для таких файлів з'являється додаткова сторінка попереднього перегляду Preview. На ній ви можете побачити сторінку Web, відповідну файлу HTML. Крім того введена можливість безпосередньо з вікна Редактора Коди викликати зовнішній редактор файлів HTML. Для цього, якщо в редактор завантажений файл HTML, треба клацнути на нім правою кнопкою миші і вибрати з контекстного меню розділ html Editor. Викличеться заданий вами зовнішній редактор файлів HTML, в якому ви можете проглянути сторінку і отредактіро вать її. Після редагування треба зберегти сторінку у файлі. Тоді при поверненні в ІСР Delphi вам буде поставлено питання, чи треба перезавантажити змінений файл редактор. При позитивній відповіді в Редактор Коди буде завантажений файл, що містить результати проведеного редагування.

Інспектор Об'єктів

Інспектор Об'єктів (Object Inspector) забезпечує простий і зручний інтер-

фейс для зміни властивостей об'єктів C++builder і управління подіями, на ко-

ториє реагує об'єкт.

Вікно Інспектора Об'єктів (мал. 2.5) має дві сторінки. Вище за них є

випадний список всіх компонентів, розміщених на формі. У нім ви можете

вибрати той компонент, властивості і події якого вас цікавлять.

Сторінка властивостей (Properties) Інспектора Об'єктів (див. мал. 2.5 а), показує

властивості того об'єкту, який в даний момент виділений вами. Клацніть на вікні

порожньої форми і на сторінці властивостей Інспектора Об'єктів ви зможете побачити

властивості форми (вони показані на мал. 2.5 а). Ви можете змінювати ці властивості. На-

приклад, зміните властивість Caption (напис) вашої форми, написавши в нім «Моя

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

Якщо клацнути на деяких властивостях, наприклад, на властивості Color (колір)

то праворуч від імені властивості відкриється вікно випадного списку. Натиснувши в нім на

кнопочку із стрілкою вниз, ви можете побачити список можливих значень свой-

ства (див. мал. 2.5 а). Наприклад, зміните значення властивості Color з прийнятого по

умовчанню clbtnface (колір поверхні кнопок) на clwindow (колір вікна). Ви

побачите, що поверхню форми змінить свій колір.

Поряд з деякими властивостями ви можете бачити знак плюс (див., наприклад

властивість Font на мал. 2.5 а). Це означає, що дана властивість є об'єктом

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

подвійне клацання на властивості Font. Ви побачите, що відкриється таблиця таких

властивостей, як Color (колір), Height (висота), Name (ім'я шрифту) і ін. Серед них ви

побачите властивість Style (стиль), біля якої теж є знак плюс. Клацання

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

список ПОДСЕОЙСТВ, в якому ви можете, наприклад, встановити в true властивість

fsbold (жирний). До речі, для зміни true на false і назад в подібних булевих

властивостях не обов'язково вибирати значення з випадного списку. Достатньо

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

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

клацання на головній властивості або клацання на знаку мінус біля нього, і список под-

властивостей згорнеться.

Сторінка подій (Events) складає другу частину Інспектора Об'єктів (див.

мал. 2.5 би). На ній вказані всі події, на які може реагувати вибран-

ний об'єкт. Наприклад, якщо вам треба виконати якісь дії у момент соз-

данія форми (звичайно це різні операції налаштування), то ви винні виде-

лити подію Oncreate. Поряд з ім'ям цієї події відкриється вікно з випадаю-

щим списком. Якщо ви вже написали в своєму застосуванні якісь обробники

подій і хочете при події Oncreate використовувати один з них, ви можете ви-

брати необхідний обробник з випадного списку. Якщо ж вам треба напі-

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

Ви потрапите у вікно Редактора Коди, в якій побачите текст:

void fastcall Tforml::formcreate(Tobject *Sender)

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

що закривається фігурними дужками. Побачений вами код - це заготівка обра-

ботчика події, яку автоматично зробив C++builder. Вам залишається тільки

у проміжку між дужками "{" і "}". написати необхідних операторів.

Якщо ви зробили ці операції, то поверніться в Інспектор Об'єктів, виділите

у нім, наприклад, подія Onactivate і натисніть в нім кнопку випадного спі-

ська. Ви побачите в нім введений вами раніше обробник події Oncreate (цей

момент зображений на мал. 2.5 би). Якщо вам треба використовувати той же самий обра-

ботчик і в події Onactivate, просто виберіть його із списку. Таким чином ви

можете уникнути дублювання в програмі одних і тих же фрагментів коди.

Користуючись Інспектором Об'єктів, ви можете отримати контекстну довідку

по властивостях або подіях. Для цього виділите у вікні Інспектора Об'єктів інте-

ресующєє вас властивість або подія і натисніть клавішу F1.

У Інспекторові Об'єктів є можливість фільтрації властивостей і подій і

можливість групувати їх по категоріях. Для того, щоб скористатися еті-

мі можливостями, клацніть у вікні Інспектора Об'єктів правою кнопкою

миші. У меню, що спливло, ви можете вибрати розділ View. Вам буде показаний

ряд категорій властивостей (див. мал. 2.6) і подій. Біля кожної категорії є

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

гда в Інспекторові Об'єктів ви побачите події і властивості тільки вказаних кате-

горій. Вибір розділу Toggle перемкне видимість розділів: ті, які були ві-

діми, стануть невидимі і навпаки. Вибір розділу АН зробить видимими все свой-

ства і події, а вибір розділу None зробить всі події і властивості невидимими

(правда, незрозуміло, навіщо в цьому режимі взагалі потрібний Інспектор Об'єктів).

Внизу вікна Інспектора Об'єктів указується, скільки властивостей або подій неві-

дімо в даний момент: «... hidden». Втім, в прикладі на мал. 2.5 видно всі

властивості і події: «All shown».

У тому ж меню, спливаючому при клацанні правою кнопкою миші у вікні Ін-

спектора Об'єктів, ви можете вибрати розділ Arrange і в нім встановити одну

двох можливостей: by Name - упорядкувати властивості і події в алфавітній по-

следовательності їх імен, або by Category - упорядкувати їх по категоріях. При

впорядковуванні по категоріях форма представлення подій і властивостей карді-

нально міняється. У вікні відображаються категорії з символами "+", при клацанні на

яких розкривається список елементів, що відносяться до даної категорії. При

цьому деякі властивості можуть потрапити одночасно в декілька категорій. Але

це не має значення: ви можете змінювати їх значення в будь-якій категорії і вони

синхронно зміняться в решті всіх категорій.

Описані можливості Інспектора Об'єктів по фільтрації і упорядочива"-

нію інформації, введені починаючи з C++builder 5, істотно спрощують ра-

боту з важко осяжним безліччю властивостей, властивих багатьом компонентам

бібліотеки.

Дуже корисною особливість Інспектора Об'єктів в C++builder 6 є

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

Тим, хто тільки починає знайомитися з C++builder, це, можливо, не зовсім

зрозуміло. Отже поясню. Річ у тому, що одні компоненти часто посилаються на

інші, використовувані для якихось цілей.

У Інспекторові Об'єктів C++builder 6, по-перше, властивості, в яких можуть міститися посилання на інші компоненти або об'єкти, виділяються червоним кольором. А головне - якщо в подібній властивості дійсно записано посилання, то біля цієї властивості з'являється символ "+". Якщо клацнути на нім, то розкриється список властивостей приєднаного компоненту. Ці властивості виділяються зеленим кольором, щоб не плутати їх з властивостями самого компоненту.

Як приклад на мал. 2.7 а показана сторінка властивостей форми з развер-

нутимі списком компоненту головного меню Mainmenul, в якому, в свою оче-

редь, розгорнений список властивостей компонент Imagelistl, на який посилається

меню. Таким чином, не виходячи з вікна Інспектора Об'єктів і не роблячи зайвих

рухів, можна задати властивості цілого ланцюжка приєднаних об'єктів.

Дуже зручно.

Приєднані об'єкти присутні і на сторінці подій Інспектора

Об'єктів (см< мал. 2.7 би). Таким чином, і обробники подій ланцюжка прісоє-

діненних компонентів можна задавати, не виходячи з вікна Інспектора Об'єктів.

Описані нові властивості Інспектора Об'єктів і його зовнішній вигляд можна на-

страївать, а за бажання і прибирати все нове, повертаючись до виду цього інструмен-

та, властивому C++builder 5. Про налаштування Інспектора Об'єктів див. в разд. 15.6.

Контрольні питання:

1. Загальний вид ІСР

2. Смуга гл. меню

3. Швидкі кнопки

4. Палітра компонентів

5. Вікно форми

6. Вікно Редактора

7. Інспектор Об'єктів

Практична робота №2 Розробка прикладення для роботи з файлами та папками з використанням підказок

Мета: отримання практичних навичок роботи з файловою системою із викорис­танням стандартних компонентів RAD, функцій Win32 API та ін. для подальшого вико­ристання у програмах роз­в¢я­зан­ня  інженерних і наукових задач.

Виконання

 Нехай треба розробити прикладення, яке повинне:

·         виконувати операції з дисками (обирати напрямок і надавати дані про єм­ність і віль­ний простір);

·         виконувати операції з папками (створювати папку, змінювати поточну пап­ку, пере­іме­новувати і знищувати папку);

·         виконувати операції з файлами (створювати, знаходити, змінювати атри­бу­ти, пере­іме­новувати, копіювати і знищувати).

З цією метою розроблено форму

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

//---------------------------------------------------------------------------

USEFORM("Unit1.cpp", Form1);

USEFORM("Unit2.cpp", Form2);

//---------------------------------------------------------------------------

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

{

try

{

Application->Initialize();

Application->CreateForm(__classid(TForm1), &Form1);

Application->CreateForm(__classid(TForm2), &Form2);

Application->Run();

}

catch (Exception &exception)

{

Application->ShowException(&exception);

}

catch (...)

{

try

{

throw Exception("");

}

catch (Exception &exception)

{

Application->ShowException(&exception);

}

}

return 0;

}

//---------------------------------------------------------------------------

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include <dir.h>

#include "Unit1.h"

#include "Unit2.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{ AnsiString Directory,Msg;

StatusBar1->SimpleText = "";

Directory = InputBox ("Робота з папками", "Введіть ім'я папки, наприклад: ", "Нова папка");

if (DirectoryExists(Directory)) {

Msg = AnsiString ("Папка ") + Directory + " вже існує!";

MessageDlg (Msg, mtError, TMsgDlgButtons() << mbOK, 0);

StatusBar1->SimpleText = Msg;

return;

}

// створення папки

MkDir(Directory);

if (!DirectoryExists(Directory)) {

Msg = "Папку " + Directory + " не створено!";

MessageDlg (Msg, mtError, TMsgDlgButtons() << mbOK, 0);

StatusBar1->SimpleText = Msg;

} else {

Msg = "Папку " + Directory + " створено!";

MessageDlg (Msg, mtInformation, TMsgDlgButtons() << mbOK, 0);

StatusBar1->SimpleText = Msg;

DirectoryListBox1->Directory = Directory;

DirectoryListBox1->Update();

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)

{ AnsiString Directory,Msg;

StatusBar1->SimpleText = "";

Directory = GetCurrentDir();

chdir ("..");

Msg = Directory;

AnsiString NewName = InputBox ("Робота з папками", "Введіть нове ім'я папки: ", Msg.c_str());

if (RenameFile(Directory, NewName)) {

Msg = AnsiString ("Папку ") + Directory + " переіменовано в " + NewName;

MessageDlg (Msg, mtInformation, TMsgDlgButtons() << mbOK, 0);

StatusBar1->SimpleText = Msg;

SetCurrentDir (NewName);

Directory = GetCurrentDir();

DirectoryListBox1->Directory = NewName;

DirectoryListBox1->Update();

} else {

Msg = AnsiString ("Папку ") + Directory + " переіменувати не вдалося!";

MessageDlg (Msg, mtError, TMsgDlgButtons() << mbOK, 0);

StatusBar1->SimpleText = Msg;

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)

{ AnsiString Directory,Msg;

StatusBar1->SimpleText = "";

Directory = GetCurrentDir();

chdir ("..");

if (RemoveDir(Directory)) {

Msg = AnsiString ("Папку ") + Directory + " знищено!";

MessageDlg (Msg, mtInformation, TMsgDlgButtons() << mbOK, 0);

StatusBar1->SimpleText = Msg;

Directory = GetCurrentDir();

DirectoryListBox1->Directory = Directory;

DirectoryListBox1->Update();

} else {

Msg = AnsiString ("Папку ") + Directory + " не знищено!";

MessageDlg (Msg, mtError, TMsgDlgButtons() << mbOK, 0);

StatusBar1->SimpleText = Msg;

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button4Click(TObject *Sender)

{ AnsiString Directory,Msg;

AnsiString Directories =

InputBox ("Робота з папками",

"Введіть абсолютний маршрут на створюване дерево папок, наприклад: ",

"C:\\Apps\\Sales\\Local");

if (ForceDirectories (Directories)) {

Msg = AnsiString ("Дерево папок ") + Directories + " створено.";

MessageDlg (Msg, mtInformation, TMsgDlgButtons() << mbOK, 0);

StatusBar1->SimpleText = Msg;

DirectoryListBox1->Update();

} else {

Msg = AnsiString ("Дерево папок ") + Directories + " не створено!";

MessageDlg (Msg, mtError, TMsgDlgButtons() << mbOK, 0);

StatusBar1->SimpleText =Msg;

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button5Click(TObject *Sender)

{

AnsiString Directory;

STARTUPINFO si;

PROCESS_INFORMATION pi;

AnsiString Command;

DWORD ExitCode;

ZeroMemory(&si, sizeof(STARTUPINFO));

si.cb = sizeof(STARTUPINFO);

si.wShowWindow = SW_SHOWNORMAL;

si.dwFlags = STARTF_USESHOWWINDOW;

Command = AnsiString("explorer.exe") + " " + GetCurrentDir();

Application->Minimize();

if(CreateProcess(NULL, Command.c_str(), NULL, NULL, false,

CREATE_DEFAULT_ERROR_MODE | NORMAL_PRIORITY_CLASS,

NULL, NULL, &si, &pi) == true) {

CloseHandle (pi.hThread); // освобождаем ресурсы

// ждем окончания инициализации запущенного процесса

WaitForInputIdle(pi.hProcess, INFINITE);

WaitForSingleObject(pi.hProcess, INFINITE); // ждем завершения процесса

GetExitCodeProcess(pi.hProcess, &ExitCode); // получаем код возврата

CloseHandle(pi.hProcess); // освобождаем ресурсы

}

Application->Restore();

// FileListBox1->Update();

SetCurrentDir("\\");

SetCurrentDir(Directory);

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button6Click(TObject *Sender)

{

DdeClientConv1->SetLink("Folders", "AppProperties");

DdeClientConv1->OpenLink ();

DdeClientConv1->ExecuteMacro("[FindFolder(, C:\DOWNLOAD)]", False);

DdeClientConv1->CloseLink ();

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button7Click(TObject *Sender)

{

AnsiString Msg,FileName;

FileName = FileListBox1->FileName;

if (!FileExists (FileName)) {

Msg = AnsiString("Файл ") + FileName + " не існує!";

MessageDlg (Msg, mtError, TMsgDlgButtons() << mbOK, 0);

return;

}

// доповнення маршруту новим ім'ям файлу

AnsiString NewName =

InputBox ("Робота з файлами", "Введіть нове ім'я файла: ", FileName.c_str());

NewName = ExpandFileName (NewName);

if (RenameFile (FileName, NewName)) {

Msg = AnsiString ("Файл ") + FileName + " переіменовано!";

MessageDlg (Msg, mtInformation, TMsgDlgButtons() << mbOK, 0);

FileListBox1->Update();

} else {

Msg = AnsiString ("Файл ") + FileName + " не переіменовано!";

MessageDlg (Msg, mtError, TMsgDlgButtons() << mbOK, 0);

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button8Click(TObject *Sender)

{

AnsiString Msg,FileName;

FileName = FileListBox1->FileName;

if (!FileExists (FileName)) {

Msg = AnsiString ("Файл ") + FileName + " не існує!";

MessageDlg (Msg, mtError, TMsgDlgButtons() << mbOK, 0);

return;

}

if (DeleteFile (FileName)) {

Msg = AnsiString ("Файл ") + FileName + " знищено!";

MessageDlg (Msg, mtInformation, TMsgDlgButtons() << mbOK, 0);

FileListBox1->Update();

} else {

Msg = AnsiString ("Файл ") + FileName + " не знищено!";

MessageDlg (Msg, mtError, TMsgDlgButtons() << mbOK, 0);

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button9Click(TObject *Sender)

{

Form2->Show();

}

//---------------------------------------------------------------------------

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include <dir.h>

#include "Unit2.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm2 *Form2;

//---------------------------------------------------------------------------

__fastcall TForm2::TForm2(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TForm2::DriveComboBox1Change(TObject *Sender)

{

int C;

C = toupper(DriveComboBox1->Drive) - 64;

setdisk (C);

__int64 Total = DiskSize (C);

if (Total == -1) {

Label1->Caption = "носій відсутній!";

Label2->Caption = "";

} else {

__int64 AmtFree = DiskFree (C);

AnsiString S;

S.sprintf("%I64d K (%I64d)%%", AmtFree/1024, AmtFree*100/Total);

Label1->Caption = Total;

Label2->Caption = S;

}

}

//---------------------------------------------------------------------------

Контрольні питання

  1. Яким чином можна отримати зведення про ємність магнітного носія?

  2. За допомогою якої функції можна отримати зведення про поточний носій? Як можна встановити поточний носій?

  3. Яким чином можна визначити присутність папки і файла на носії інформації?

  4. За допомогою якої функції можна створити папку, напрямок? Як призначається по­точ­ний каталог?

  5. Чи можна програмно знищити абияку папку?

  6. Як можна викликати на виконання прикладення Проводник?

  7. За допомогою яких компонентів можна зв’язати обрання носія, папки і файлу?

  8. Як можна опитати і встановити атрибути файлу?

  9. Чи можна програмно видалити абиякий файл?

  10. Яким чином можна ініціювати пошук файла за допомогою Internet Explorer із власно­го прикладення?

Практична робота №3 Створення прикладення для роботи із зображеннями та файлами мультимедіа

Мета: отримання практичних навичок роботи з мультмедійними файлами із вик­о­рис­танням стандартних компонентів RAD, функцій Win32 API та ін. для подальшого ви­ко­рис­тан­ня у програмах роз­в¢я­зан­ня  інженерних і наукових задач.

Виконання

Нехай треба розробити три прикладення, які повинні:

·         виконувати операції різнобарвного малювання та корегування геометричних примі­тивів (ліній, кіл, прямокутників);

·         виконувати операції перегляду зображень (малюнків у різних масштабах, а також іко­нок, розташованих на кнопках);

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

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

//---------------------------------------------------------------------------

USEFORM("Unit1.cpp", Form1);

//---------------------------------------------------------------------------

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

{

try

{

Application->Initialize();

Application->CreateForm(__classid(TForm1), &Form1);

Application->Run();

}

catch (Exception &exception)

{

Application->ShowException(&exception);

}

catch (...)

{

try

{

throw Exception("");

}

catch (Exception &exception)

{

Application->ShowException(&exception);

}

}

return 0;

}

//------------------------------------------

//---------------------------------------------------------------------------

#include <MPlayer.hpp>

#include <vcl.h>

#pragma hdrstop

#include <stdio.h>

#include "Unit1.h"

#include <ExtCtrls.hpp>

#include <Graphics.hpp>

#include <StdCtrls.hpp>

#include "filectrl.hpp"

#include "Unit2.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TForm1::StretchCheckClick(TObject *Sender)

{

Image1->Stretch = StretchCheck->Checked;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{ Label1->Caption=FileListBox1->FileName;

MediaPlayer1->FileName = FileListBox1->FileName;

MediaPlayer1->Open();

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)

{

AnsiString FormCaption,FileExt;

char cCaption[25];

memset(cCaption, NULL, sizeof(cCaption));

FileExt = ExtractFileExt(FileListBox1->FileName);

FileExt = UpperCase(FileExt);

if (!strcmp(FileExt.c_str(),".BMP") || !strcmp(FileExt.c_str(),".ICO") ||

!strcmp(FileExt.c_str(),".WMF") || !strcmp(FileExt.c_str(),".EMF" ))

{

Image1->Picture->LoadFromFile(FileListBox1->FileName);

Caption = FormCaption + ExtractFileName(FileListBox1->FileName);

if (!strcmp(FileExt.c_str(),".BMP")) {

sprintf(cCaption," (%d x %d)",Image1->Picture->Width,Image1->Picture->Height);

Caption = FormCaption + (AnsiString)cCaption;

Form1->Image1->Picture = Image1->Picture;

Form1->Caption = Caption;

GlyphCheck->Enabled = true;

if (GlyphCheck->Checked) {

// ViewAsGlyph(FileExt);

if (GlyphCheck->Checked && !strcmp(FileExt.c_str(),".BMP") ) {

SpeedButton1->Glyph = Image1->Picture->Bitmap;

} else {

SpeedButton1->Glyph = NULL;

}}}

if (!strcmp(FileExt.c_str(),".ICO")) {

Form1->Image1->Picture->Icon = Image1->Picture->Icon;

Icon = Image1->Picture->Icon;

GlyphCheck->Checked = false;

GlyphCheck->Enabled = false;

}

if (!strcmp(FileExt.c_str(),".WMF") || !strcmp(FileExt.c_str(),".EMF")) {

Form1->Image1->Picture->Metafile = Image1->Picture->Metafile;

GlyphCheck->Checked = false;

GlyphCheck->Enabled = false;

}

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::FilterComboBox1Change(TObject *Sender)

{

if(FilterComboBox1->FileList->Mask=="*.BMP;*.ICO;*.WMF;*.EMF")

{Button1->Enabled=False;Button2->Enabled=True;}

else {Button2->Enabled=False;Button1->Enabled=True;}

}

//-----------------------------------------------------------------

Контрольні запитання

  1. Яким чином можна «підігнати» розмір зображуваного малюнка під розмір контей­не­ра, що його містить?

  2. Перегляд малюнків яких форматів можна виконати на поверхні кнопки і чому?

  3. Що означає параметр «кількість іконок», що визначається на формі?

  4. Дайте зведенення щодо властивостей Glyph і NumGlyphs компонента Bit­Btn.

  5. Дайте докладні пояснення щодо створених прикладень.

Практична робота №4 Створення прикладення для роботи з системним програмним забезпеченням (API) ОС Win32

Мета - отримання практичних навичок робот из системним програмним забезпе­чен­ням (API) ОС Win32, а також складання і відлагодження програм на основі використання Win32 API для роз­в'я­зання інженерних і наукових задач.

Засобами С++ Builder чи Delphi створити програму, що використовує можли­вос­ті Win32 API:

·         створення прозорих вікон засобами Win32 API;

·         забезпечення одночасної роботи тільки однієї копії прикладення на основі викорис­тан­ня мьютексів засобами Win32 API;

·         забезпечення засобами Win32 API режиму, коли поточна задача не  відображується на панелі задач;

·         показ «заставки» (Splash-screen) засобами Win32 API;

·         опит поточної версії ОС засобами Win32 API;

·         зміна дозволу екрану засобами Win32 API;

·         зміна засобами Win32 API розкладки клавіатури з національної на англійську;

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "SplashUnit.h"

#include "MainUnit.h"

//---------------------------------------------------------------------------

USEFORM("MainUnit.cpp", MainForm);

USEFORM("SplashUnit.cpp", SplashForm);

USEFORM("Unit1.cpp", Form1);

//---------------------------------------------------------------------------

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

{ // прикладення не буде відображуватися в панелі задач

DWORD Style = GetWindowLong(Application->Handle, GWL_EXSTYLE);

Style |= WS_EX_TOOLWINDOW;

SetWindowLong (Application->Handle, GWL_EXSTYLE, Style);

// --------------------------------------------------

try

{ // перевірка на присутність mutex

HANDLE Mutex = OpenMutex(MUTEX_ALL_ACCESS, false, "OneInstanceAllowed");

if (Mutex == NULL) { // прикладення ще не було завантажене

// створення mutex ...

Mutex = CreateMutex (NULL, true, "OneInstanceAllowed");

} else { // прикладення вже було завантажене

// Передавання повідомлення у завантажене прикладення

// для виведення його на перший план

Application->MessageBox ("Прикладення вже виконується!", "Попередження",

MB_OK + MB_ICONWARNING + MB_APPLMODAL);

SendMessage (HWND_BROADCAST, RegisterWindowMessage("OnlyOne"), 0, 0);

return 0;

}

Application->Initialize();

Application->CreateForm(__classid(TMainForm), &MainForm);

Application->CreateForm(__classid(TSplashForm), &SplashForm);

SplashForm->Show();

Application->ProcessMessages();

SplashForm->ProgressBar1->StepBy(1);

Sleep(1000); // пауза 1000 мС

Application->CreateForm(__classid(TForm1), &Form1);

SplashForm->ProgressBar1->StepBy(1);

Sleep(1000);

SplashForm->Close();

delete SplashForm;

MainForm->WindowState = wsNormal;

Application->Run();

ReleaseMutex(Mutex); // знищення mutex...

}

catch (Exception &exception)

{

Application->ShowException(&exception);

}

catch (...)

{

try

{

throw Exception("");

}

catch (Exception &exception)

{

Application->ShowException(&exception);

}

}

return 0;

}

//----------------------------------------------------

#ifndef MainUnitH

#define MainUnitH

//---------------------------------------------------------------------------

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <Buttons.hpp>

#include <ExtCtrls.hpp>

#include <ComCtrls.hpp>

//---------------------------------------------------------------------------

class TMainForm : public TForm

{

__published: // IDE-managed Components

TButton *Button1;

TTrackBar *TrackBar1;

TLabel *Label1;

void __fastcall Button1Click(TObject *Sender);

void __fastcall FormClose(TObject *Sender, TCloseAction &Action);

void __fastcall TrackBar1Change(TObject *Sender);

void __fastcall FormActivate(TObject *Sender);

void __fastcall Button2Click(TObject *Sender);

void __fastcall Button3Click(TObject *Sender);

private: // User declarations

public: // User declarations

__fastcall TMainForm(TComponent* Owner);

};

//---------------------------------------------------------------------------

extern PACKAGE TMainForm *MainForm;

//---------------------------------------------------------------------------

#endif

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include <mmsystem.h>

#include "Unit1.h"

#include "MainUnit.h"

#include "SplashUnit.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

HINSTANCE dllInst;

typedef bool (__stdcall *Ptr)(HWND hwnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags);

Ptr FunctPtr;

TMainForm *MainForm;

//---------------------------------------------------------------------------

__fastcall TMainForm::TMainForm(TComponent* Owner): TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TMainForm::Button1Click(TObject *Sender)

{

Button1->Enabled = false;

Form1->Show();

TrackBar1Change(Sender);

TrackBar1->Enabled = true;

}

//---------------------------------------------------------------------------

void __fastcall TMainForm::TrackBar1Change(TObject *Sender)

{

// викликається функція "SetLayeredWindowAttributes" з DLL Win32 API

FunctPtr = (Ptr)GetProcAddress(dllInst, "SetLayeredWindowAttributes");

if (FunctPtr)

// задання ступіні прозорості

// від 0(повністю прозоре) до 255(непрозоре)

FunctPtr(Form1->Handle, RGB(0,0,0), 255-TrackBar1->Position, LWA_ALPHA);

}

//---------------------------------------------------------------------------

void __fastcall TMainForm::FormClose(TObject *Sender, TCloseAction &Action)

{

// виведення версії ОС

AnsiString Temp1 = "Oпераційна система: Windows ",

Temp2 = " ";

OSVERSIONINFO osinfo;

osinfo.dwOSVersionInfoSize = sizeof(osinfo);

GetVersionEx(&osinfo);

if (osinfo.dwPlatformId == VER_PLATFORM_WIN32s)

Temp1 += "Win32s. ";

else if (osinfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)

Temp1 += "9x. ";

else if (osinfo.dwPlatformId == VER_PLATFORM_WIN32_NT)

Temp1 += "NT. ";

Temp2 = String("Версія: ") + String(osinfo.dwMajorVersion)

+ "." + String(osinfo.dwMinorVersion) + ". Збірка " + String(osinfo.dwBuildNumber);

MessageBeep(MB_ICONEXCLAMATION); // сигнал

Application->MessageBox ((Temp1 + Temp2 + " бажає Вам успіху!").c_str(), "Повідомлення",

MB_OK + MB_ICONINFORMATION + MB_APPLMODAL);

FunctPtr = NULL;

FreeLibrary (dllInst);

}

//---------------------------------------------------------------------------

void __fastcall TMainForm::FormActivate(TObject *Sender)

{

// встановлення стилю вікна "прозоре" (WS_EX_LAYERED)

SetWindowLong (Form1->Handle, GWL_EXSTYLE,

GetWindowLong(Form1->Handle, GWL_EXSTYLE) | WS_EX_LAYERED);

// завантаження бібліотеки "user32.dll" Win32 API

dllInst = LoadLibrary ("user32.dll");

if (!dllInst) {

ShowMessage("Помилка отримання адреси DLL!");

Close();

}

}

//---------------------------------------------------------------------------

void __fastcall TMainForm::Button2Click(TObject *Sender)

{

// переключення на російську мову

char Layout[KL_NAMELENGTH];

LoadKeyboardLayout(StrCopy(Layout, "00000419"),KLF_ACTIVATE);

}

//---------------------------------------------------------------------------

void __fastcall TMainForm::Button3Click(TObject *Sender)

{

// переключення на англійську мову

char Layout[KL_NAMELENGTH];

LoadKeyboardLayout(StrCopy(Layout, "00000409"),KLF_ACTIVATE);

}

//---------------------------------------------------------------------------

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "SplashUnit.h"

#include "MainUnit.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TSplashForm *SplashForm;

//---------------------------------------------------------------------------

__fastcall TSplashForm::TSplashForm(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "MainUnit.h"

#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)

{

MainForm->Button1->Enabled = true;

MainForm->TrackBar1->Enabled = true;

}

//----------------

Контрольні запитання

1.    У чому полягає призначення функцій Win32 API?

2.    Надайте короткий класифікований огляд можливостей Win32 API.

3.    Наведіть порядок використання функцій Win32 API, що зберігаються в DLL?

4.    Як забезпечуються засобами Win32 API:

Практична робота №5 Створення довідкової системи

Мета:

·         отримання практичних навичок створення довідкових систем прикладення у форматах:   

 

 

·         отримання практичних навичок створення довідкових систем прикладення за домогою технології MS Agent;

·         складання і відлагодження програм роботи з довідками для розв'язання інженерних і наукових задач.

 

1.  Створення проекта довідкової системи

Запуск прикладення Help & Manual виконується засобами Windows і призводить до по­яви вікна (мал. 6.1).

Для створення нового проекта необхідно:  

·      Виконати команду операційного меню Fіle|New. З'явиться діалогове вікно створення нового проекта (мал. 6.2). Натиснути кнопку Next.  

 

 

Малюнок 6.1

 

 

Малюнок 6.2

·      З’явиться нове ділогове вікно, в якому треба вказати місце розташування проекта (мал. 6.3). Натиснути конпку Next.

·      З’явиться діалогове вікно, в якому треба натиснутикнопку Finish (мал. 6.4).

 

 

Малюнок 6.3

 

 

Малюнок 6.4

 

2. Вибір мови проекта

Help & Manual створює довідкові файли на будь-яких мовах, однак за замовчуванням мова проекту - англійська. Для зміни мови проекта і набору символів необхідно виконати ко­манду Project | Project Propertіes головного меню і у розділі Common  Propertіes | Langu­age and Character Sets призначити мову проекту, як це показано на мал. 6.5.

 

 

Малюнок 6.5

 

3. Виконання операцій над змістом

Зміст знаходиться в лівій частині головного вікна і має деревоподібну структуру, що з самого початку містить глави і теми (мал. 6.6).

 

   Малюнок 6.6

 

Для зміни змісту треба обрати абиякий пункт змісту, викликати контекстне меню (мал. 6.7) і виконати з нього потрібну команду. При цьому команди Іnsert  Before | After додають новий пункт (мал. 6.8), команда Іnsert  Chіld додає дочірній пункт (підпункт поточного), а команда Delete Item знищує існуючий пункт. Команда Edit Caption дозволяє змінити назву пункту змісту. За звичай для глав вказують альтернативу Chapter without text (не має тексту), а для тем – Topic or chapter with text (має текст).

 

 

   Малюнок 6.7

 

   Малюнок 6.8

 

Результатом таких дій може бути, наприклад, зміст, показаний на мал. 6.9.

 

     Малюнок 6.9

 

Зауважимо, що для кожної зі створюваних глав у зоні Topic options за звичай вказують (мал. 6.10):

·      Topic ID – алфавітний ідентифікатор пункту для подальшого посилання на нього із прикладення;

·      Help Window (Main) – для зазначення вікна відображення розділу довідки;

·      Keywords – ключові слова поточного розділу для подальшого пошуку тексту у довідці за ключовими поняттями;

·      Help Context Number  - числовий ідентифікатор пункту для подальшого посилання на нього із прикладення за рахунок асоціювання цього числа з деяким елементом керуван­ня (компонентом) на формі прикладення.

 

   Малюнок 6.10

 

4. Наповнення розділів довідки

Якщо зі змісту обрати абиякий розділ, то стає активним вікно Help text і в нього мож­на вводити текст розділу довідки.

 

 

Малюнок 6.11

 

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

 

5. Створення файлів довідки

Для створення файлів довідки достатньо активізувати кнопку (мал. 6.12) піктогра­фіч­ного меню й обрати формат довідки.

   Малюнок 6.12

 

Наприклад, якщо обрати коформат Classic Winhelp, то буде створено файли: Course­Work.hlp і CourseWork.cnt, які зразу ж можна оглянути в дії (мал. 6.13 - 6.14).

 

   

 

                         Малюнок 6.13                                                  Малюнок 6.14

 

6. Створення прикладення, що керує довідковою системою

За допомогою програми Help & Manual у віконці Invisible Topics створімо декілька розділів довідки, що повинні відповідати елементам керування форми:

·      Про автора (Help Context Number = 30);

·      Про програму (Help Context Number = 31);

·      Family (Help Context Number = 41);

·      Password (Help Context Number = 51);

·      Sound (Help Context Number = 61).

Засобами Borland C++ Builder (чи Delphi) cтворимо прикладення, головну форму якого показано на мал. 6.15, а структуру об’єктів – на мал. 6.16.

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

//---------------------------------------------------------------------------

USEFORM("Unit1.cpp", Form1);

//---------------------------------------------------------------------------

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

{

try

{

Application->Initialize();

Application->HelpFile = "C:\\Program Files\\Borland\\CBuilder6\\Projects\\BOYKOVA PR5\\NewProject.hlp";

Application->Title = "pract1";

Application->CreateForm(__classid(TForm1), &Form1);

Application->Run();

}

catch (Exception &exception)

{

Application->ShowException(&exception);

}

catch (...)

{

try

{

throw Exception("");

}

catch (Exception &exception)

{

Application->ShowException(&exception);

}

}

return 0;

}

//-------------------------------

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma link "AgentObjects_OCX"

#pragma link "SHDocVw_OCX"

#pragma resource "*.dfm"

// параметры компонента

TWinControl *ControlWhatIsIt;

AnsiString AgentHelper_Character_Speed; // скорость произношения текста

IAgentCtlCharacterEx *Character_;

IAgentCtlRequest *Request;

IAgentCtlAnimationNames* AnimationNames;

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TForm1::t11Click(TObject *Sender)

{

Application->HelpJump("NN1");

}

//---------------------------------------------------------------------------

//---------------------------------------------------------------------------

void __fastcall TForm1::N1Click(TObject *Sender)

{

Application->HelpJump("NN2");

}

//---------------------------------------------------------------------------

void __fastcall TForm1::N2Click(TObject *Sender)

{

Application->HelpJump("NN3");

}

//---------------------------------------------------------------------------

void __fastcall TForm1::N11Click(TObject *Sender)

{

Application->HelpJump("NN41");

}

//---------------------------------------------------------------------------

void __fastcall TForm1::N21Click(TObject *Sender)

{

Application->HelpJump("NN42");

}

//---------------------------------------------------------------------------

void __fastcall TForm1::N4Click(TObject *Sender)

{

Application->HelpJump("NN5");

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)

{ WideString myLink = GetCurrentDir()+"\\HTML\\index.html";

CppWebBrowser1->Navigate(myLink,NULL,NULL,NULL,NULL);

}

//---------------------------------------------------------------------------

void __fastcall TForm1::N5Click(TObject *Sender)

{

Button1->Visible=True;

Agent1->Connected = true;

Request = Agent1->Characters->Load((BSTR)Agent1);

Character_ = (IAgentCtlCharacterEx*)Agent1->Characters->Character(BSTR(Agent1));

Character_->MoveTo(500,365, (Variant)0);

Character_->Show((Variant)false);

Character_->Balloon->set_FontSize(14);

Character_->Play((Variant)"Greet"); // помaхать.

Character_->Think(Variant("Это практическая работа Бойковой Светы"));

Character_->SoundEffectsOn = VARIANT_BOOL(true);

Character_->Speak (TVariantInParam ("Здравствуйте, уважаемый пользователь! "));

Character_->MoveTo(0,365, (Variant)1500);

Character_->Play((Variant)"Announce");

Character_->MoveTo(0,0, (Variant)1500);

Character_->Play((Variant)"Suggest");

Character_->MoveTo(300,300, (Variant)1500);

/*Character_->MoveTo(100,300, (Variant)1500);

Character_->GestureAt(800,300);

Character_->Hide((Variant)false); */

}

//---------------------------------------------------------------------------

void __fastcall TForm1::N111Click(TObject *Sender)

{

WideString myLink = GetCurrentDir()+"\\HTML\\index.html";

CppWebBrowser1->Navigate(myLink,NULL,NULL,NULL,NULL);

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

// отображение "намёка" активного компонента

AnsiString LongHint;

ControlWhatIsIt = (TWinControl *)Sender;

// выделение "длинного" намёка активного элемента управления

LongHint = GetLongHint(ControlWhatIsIt->Hint);

Character_->Play (WideString("Explain")); // приглашение что-либо сделать

// "проговаривание" и показ длинной подсказки

Character_->Speak (TVariantInParam (AgentHelper_Character_Speed + LongHint));

Character_->Think (TVariantInParam (LongHint));

}

//---------------------------------------------------------------------------

Контрольні запитання

1.    Наведіть категорії довідкової інформації і дайте їм коротку порівняльну характерис­ти­ку.

2.    Опишіть формати інформації, які застосовуються для побудови довідкових систем.

3.    У чому принцип функціонування контекстно-залежної довідки?

4.    Опишіть порядок створення довідкових файлів за допомогою програми  Help & Manu­al.

5.    Які недоліки має програма Help & Manual?

6.    Наведіть порядок створення прикладень, що мають вбудовану довідкову систему.

7.    Поясність методику вбудування у прикладення і використання асистента за технологі­єю MS Agent.

8.     Дайте докладні пояснення до виконаної лабораторної роботи.

Практична робота №6 Створення бази даних

Мета: Навчитися створювати таблицю формату Paradox. Вивчити типи полів, навчитися здійснювати контроль за вмістом полів, вивчити таблицю підстановки, вторинні індекси, посилальну цілісність, парольний захист, вибір мовного драйвера.

Хід роботи.

1. Створення таблиці.

Характерною особливістю програм, створених за допомогою Delphi і призначених для роботи з базами даних, є їх залежність від спеціальної бібліотеки програм, яка називається BDE (Borland Database Engine - машина баз даних корпорації Borland). BDE є набором бібліотек DLL, призначених для нізкоуровнего доступу до даних самих різних форматів. BDE автоматично встановлюється в процесі установки Delphi і реєструється в реєстрі 32-розрядної версії Windows BDE «уміє» працювати з таблицями самих (поширених СУБД, причому як файл-серверних (d Base. Paradox, Foxpro, Clipper), так і клієнт-серверних (Interbase, Microsoft SQL Server, Oracle ii ін.). У BDE є власний інтерпретатор мови SQL, що дозволяє створювати запити не тільки до серверів БД, але і таблицям файл -сервера.

У файл серверних БД ними таблиці збігається з ім'ям файлу, в якому розміщуються ті, що все містяться в ній дані Оскільки 32-розрядні версії Windows дозволяють довгі російськомовні імені файлів, то можна назвати таблиці КНИГИ, НАКЛАДНІ і т. п., але не коштує це робити по тій простий причині, що кирилицю не можна використовувати в SQL (точніше, це можна робити, тільки уклавши повну назву таблиці в лапки). Оскільки навіть у файл-серверних СУБД часто доводиться використовувати SQL-запросы, це може утруднити їх формування. З тієї ж причини не слід використовувати кирилицю в іменах полів.

Як вже мовилося, у файл-серверних БД таблиці розміщуються в одному каталозі (теці). Тому перед створенням БД створимо її каталог. Хай це буде каталог C:\proba. Створення таблиць файл-серверних БД здійснюється за допомогою утиліти (допоміжної програми) Datable Desktop (DBD), що входить в комплект постачання Delphi.

Утиліта DBD вирішує цілий ряд завдань, пов'язаних з таблицями файл-серверних БД. З її допомогою можна створити або змінити структуру таблиці, створити її первинні ключі і індекси, створювати і змінювати записи, проглядати їх і так далі На жаль, використовувані нею шрифти не підтримують кирилицю, так що працювати із записами, що містять російськомовні текстові поля, неможливо. Іншим істотним недоліком утиліти є неможливість її використання в клієнт-серверних БД.

Запустите DBD за допомогою команди Пуск » Програми >>borland C++ Builder - Database Desktop (якщо ви працюєте в ІСР, для запуску використовуйте команду Tools - Database Desktop головного меню). Перше, що необхідно зробити, - це набудувати каталог утиліти. Виберіть команду File»working Directory і встановите у вікні, що з'явилося, посилання на каталог де розташовуватимуться ваші таблиці. Для створення таблиці виберіть команду file - New - Table. DBD відкриє вікно Create Table, в якому можна вибрати тип таблиці. Тип таблиці визначає багато її властивостей. Тип Paradox 7 можна вважати за якнайкращий для файл-серверних таблиць: клацанням на кнопці ОК погодитеся з варіантом Paradox 7. запропонованим за умовчанням. На екрані з'явиться вікно (мал. 2). призначене для створення/редагування структури таблиці.

Рисунок 1- Установка рабочего каталога

Рисунок 2- Окно создания структуры таблицы

Кожному полю створюваної таблиці відповідає один запис в таблиці field Name цього вікна: у колонку field Name потрібно помістити ім'я поля, в колонку Турі - символ, що визначає тип що зберігаються в полі даних, в колонку Size - число, що визначає довжину поля (потрібний не для всіх типів полів), і. нарешті, в колонку Кеу - символ зірочки (*), якщо по значеннях цього поля потрібно побудувати первинний ключ.

Введіть назву першого поля (перший символ назви поля для таблиць Paradox DBD завжди вводиться прописним) і натисніть клавішу табуляції для переходу до наступної колонки, в якій вводиться тип поля. Натисніть клавішу пропуску, щоб утиліта DBD показала список можливих типів, і виберіть в нім тип Autoincrement. Поля автоінкрементного типу служать для створення унікального числа, що однозначно визначає запис: для першого запису в це поле буде автоматично поміщено число 1, для другої - 2 і так далі При видаленні якого-небудь запису виділене для неї число не використовується знов. Клацніть на колонці Кеу. Натисніть клавішу пропуску, щоб створити по полю первинний ключ.(ріс.3)

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

По полю потрібно визначити індекс (у термінології таблиць Paradox він називається вторинним). Для цього розкрійте список Table properties у вдачею верхньому куті вікна, виберіть пункт Secondary Indexes і клацніть на кнопці Define, що з'явилася, У вікні Define Secondary Index (мал. 4) в списку нулів таблиці виділите (клацанням) поле Ndate і потім клацніть на кнопці із стрілкою управо, щоб Перенести поле в список Indexed fields Відмічу, що у такий спосіб можна перенести не одне, а декілька полів. Індекс, побудований по декількох полях, називається складеним.

Рисунок 3-. Структура полей таблицы

Рисунок 4- Определение индексного поля (полей)

За допомогою прапорців групи Index options можна визначити наступні особливості індексу:

Unique - індекс міститиме унікальні значення;

Maintained - індексні поля сортуються по зростання) значень;

Case sensitive - індекс чутливий до регістра буки в текстових полях;

Descending - індексні поля сортуються по убуванню значень.

У нашому випадку (а також при визначенні індексів в інших таблицях Демонстраційної БД) залиште ці прапорці без змін і клацніть на кнопці ОК. DBD запитає ім'я індексу (у таблицях Paradox, як і до більшості серверів БД. індекси іменуються) - введіть назву індексу і клацніть на кнопці ОК. У знов поя вікні визначення структури таблиці, що пилося, клацніть на кнопці Save as і ;затем вкажіть ім'я файлу.

Ми тільки що створили структуру таблиці.

1. Типи полів

У таблиці. 2 представлені типи полів, які можуть використовуватися в таблицях

Paradox. У цій таблиці в колонках Турі і Size вказані відповідно умовний символ типу і його довжина, тобто ті дані, які поміщаються в однойменні колонки таблиці Field Name DBD.

Таблиця 2- Типів даних в таблиці Paradox

1. Контроль за вмістом полів

Але умовчанню відразу після відкриття вікна редагування структури таблиці в списку Table properties вибраний пункт Validity Checks (див. мал. 1.5). що дозволяє контролювати вміст полів.

За допомогою прапорця Required Field ви можете зажадати обов'язкового заповнення поля при введенні нового запису - за цим стежитиме BDE. Також на ЗАВИВАННІ можна покласти контроль за мінімальним і максимальним значеннями числового поля (рядки Minimum Value і Maximum Value). У рядку Default Value можна вказати значення поля за умовчанням - при введенні нового запису значення в це поле помістить BDL. За допомогою рядка Picture можна задати шаблон для автоматичного форматування значення поля. Наприклад, якщо заданий шаблон (###) ### - #### і в поле введений рядок 9151653939. вона буде автоматично перетворена до вигляду (915) 165-3939.

2. Таблиця підстановки

Для якого-небудь поля таблиці іноді потрібно встановити однозначний зв'язок з полем іншої таблиці. В цьому випадку BDE стежитиме за тим, щоб значення запису, що знов вводиться, в полі першої таблиці було б одним із значень вказаного поля в іншій таблиці, яка в цьому випадку називається таблицею підстановки. Для встановлення зв'язку потрібно вибрати пункт Table Lookup в списку Table properties і клацнути на кнопці Define. У вікні, що з'явилося, в списку Fields вибирається поле, за значеннями якого потрібно стежити, і клацанням на кнопці із стрілкою управо ім'я цього поля переноситься в рядок Field name. Потім в списку Lookup table вибирається потрібна таблиця і клацанням на кнопці із стрілкою вліво або первинного ключового поля цієї таблиці переноситься в рядок Lookup field.

Зв'язок буде встановлений тільки в тому випадку, якщо поле, за значення якого потрібно стежити, має такий же тип, як і перше індексне поле в таблиці підстановки. Оскільки в таблицях Paradox вторинний індекс можна створити тільки за наявності в таблиці первинного ключа, який можна створити тільки в першому полі, підстановлювальне поле має бути ключовим і першим в списку полів таблиці підстановки. (ріс.5)

Малюнок 5- Встановлення зв'язку з таблицею підстановки

Призначення перемикачів:

Just current field - перевіряється відповідність тільки зв'язаних полів;

AIL corresponding fields - перевіряється відповідність всіх полів обох таблиць (в цьому випадку структури обох таблиць мають бути ідентичними);

Fill по help - при редагуванні поля, що перевіряється, таблиця підстановки іє

показується;

Help and fill - при редагуванні поля, що перевіряється, показується таблиця

підстановки.

1. Вторинні індекси

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

2. Посилальна цілісність

Посилальна цілісність - це особливий механізм, сприяючий підтримці несуперечливих відомостей в таблицях БД, зв'язаних реляційними стосунками. Наприклад, таблиця NAKLS містить дані про накладні, а таблиця MOVEBOOK -о пов'язаних з ними книгах. Перед видаленням даних про накладну потрібно заздалегідь видалити пов'язаний з нею список книг, інакше таблиця MOVEBOOK міститиме записи про «нічийні» книги. Якщо таблиці зв'язані механізмом її посилальної цілісності, BDE автоматично блокуватиме спроби зміни поля зв'язку в батьківській таблиці, поки відповідним чином не змінені пов'язані з нею записи в дочірній таблиці.

Для встановлення посилальної цілісності потрібно вибрати пункт Referential Integrity в списку Table properties і клацнути на кнопці Define Відкриється вікно Referential Integrity, показане на

рис. 6

Рисунок 6- Установление ссылочной целостности

У списку Fields вибирається поле зв'язку редагованої таблиці (вона має бути дочерней), а в списку Table - потрібна батьківська таблиця. Після клацань на кнопках із стрілками імена полів зв'язку перекосять і рядки Child fields і Patent's key. Далі потрібно клацнути на кнопці ОК. DBD запитає ім'я новостворюваної посилальної цілісності і потім створить її. Після цього спроба видалення інформації про будь-яку накладну відкидатиметься до тих пір, поки не видалені дані про всі пов'язані з нею книги.

За допомогою перемикачів в групі Update rule визначаються правила підтримки посилальної цілісності:

Prohibit - Вdе відкидає лю6иє зміни в зв'язаному полі батьківської та6ліци без відповідної зміни записів в дочірній таблиці; видалення запису батьківської таблиці блокується до видалення пов'язаних з нею записів в дочірній таблиці;

Cascade- BDE автоматично проводить каскадні зміни в дочірній таблиці при змінах батьківської таблиці.

1. Парольний захист

Будь-яка таблиця Paradox може бути повністю або частково захищена від несанкціонованого доступу. Для цього в списку Table properties вибирається пункт Password Security і клацанням на кнопці Define відкривається відповідне діалогове вікно (мал. 7).

Рисунок 7- Окно определения пароля

Пароль може містити від 1 до 15 будь-яких символів, у тому числі і пропусків. Він чутливий до регістра букв. За допомогою кнопки Auxiliary Passwords викликається додаткове вікно, в якому можна уточнити, які поля і як захищаються'.

1. Вибір мовного драйвера

Якщо таблиця має текстові поля, для неї потрібно вказати язиковий драйвер. Для цього і списку Table properties вибирається пункт Table Language і клацанням на кнопці Define відкривається діалогове вікно Table language (мал. 8).

Для правильного відображення російськомовного тексту слід вибирати драйвер Pdox ANSI Cyrillic або Paradox Carr 866. Перший використовує кодову сторінку 1251 для Windows, другий, - сторінку 866 для MS-DOS.

Рисунок 8- Окно выбора языкового драйвера

Завдання:

Створити 2 таблиці(главная-подчиненная), задати ключові поля, вторинні індекси, здійснити контроль за вмістом полів, посилальну цілісність, захист паролем, застосувати таблицю підстановки. Таблиці повинні містити дані:

1. Людина - діти

2. Людина - документи

3. Трудова книжка - записи

4. Медична картка - хвороби

5. Бібліотека - книги

6. Пункт прокату - диски

7. Телеканал - передачі

8. Кінотеатр - сеанси

9. Будинок - квартири

10. Котедж - мешканці

11. Готель - постояльці

12. Школа - класи

13. Інтернат - що вчаться

14. Технікум - викладачі

15. Спеціальність - предмети

16. Студент - залікова книжка

17. Група університету - студенти

18. Кімната гуртожитку - що проживають

19. Ринок - підприємці

20. Прилавок - асортимент

21. Рибний магазин - товар

22. Хімчистка - послуги

23. Музей - експонати

24. Диск - вміст

25. Ранець - наповнення

26. Блюдо - склад

27. Книга - зміст

28. Фільм - відгуки

29. Програмний продукт - функції

30. Ясла - діти

Контрольні питання:

1. типи полів

2. контроль за вмістом полів

3. таблиця підстановки

4. вторинні індекси

5. посилальна цілісність

6. парольний захист

7. вибір мовного драйвера

Практична робота №7

Тема: Створення простого застосування для проглядання БД

Мета: Навчитися створювати просте застосування в С++ Builder. Навчитися створювати головну форму, модуль даних, об'єкти-стовпці.

Хід роботи: