- •Національний університет “львівська політехніка” Візуальне програмування при об’єктно-орієнтованому підході
- •Лабораторна робота № 1
- •Теоретичні відомості.
- •Завдання для лабораторної роботи
- •Контрольні питання
- •Лабораторна робота № 2
- •Теоретичні відомості.
- •Завдання для лабораторної роботи
- •Контрольні питання
- •Лабораторна робота № 3
- •Теоретичні відомості.
- •Завдання для лабораторної роботи
- •Контрольні питання
- •Лабораторна робота № 4
- •Теоретичні відомості.
- •Завдання для лабораторної роботи
- •Контрольні питання
- •Список літератури
- •Візуальне програмування при об’єктно-орієнтованому підході
Завдання для лабораторної роботи
Ознайомитись із середовищем Borland C++ Builder 6.
Створити новий проект. Зберегти його двома способами – через комбінації швидких клавіш та через меню.
Проглянути у вікні інспектора об’єктів властивості форми. Змінити назву форми та її розміри.
Запустити на виконання застосування.
Відкрити опції проекту, змінити налаштування на закладках Application, Compiler, Packages. Запустити на виконання застосування.
Контрольні питання
Пояснити принцип швидкої розробки застосувань.
На які частини умовно розділяють середовище розробки Borland C++ Builder?
Що таке проект в С++ Builder?
Як можна створити проект із користувацькими вікнами (формами)?
Як можна створити консольний проект і задати мову С/С++?
Що таке Object Inspector?
Які є основні файли проекту?
Що таке файл відлагодження? Чи можна його видаляти?
В якому файлі міститься головна main функція у віконному проекті?
В якому файлі міститься головна main функція у консольному проекті?
Пояснити призначення бібліотек VCL та CLX.
Вказати назву закладки у налаштуваннях проекту, де задаються форми, які будуть створені автоматично при виконанні застосування.
Поснити призначення закладки Compiler у налаштуваннях проекту.
Яким чином можна створити виконавчий файл, що зможе виконатися на комп’ютері на якому не встановлено Borland C++ Builder?
Лабораторна робота № 2
Тема. Базові візуальні компоненти Borland C++ Builder 6. Створення проекту із використанням візуальних компонент.
Мета. Створити віконний проект та продемонструвати використання візуальних компонент Borland C++ Builder.
Теоретичні відомості.
Палітра компонент VCL – бібліотеки візуальних компонент Borland C++ Builder має ряд закладок, на яких згруповані піктограми всіх доступних стандартних компонент. Крім цього, є можливість створити власну компоненту і розмістити її на закладці, імпортувати набір компонент сторонніх розробників, змінювати розташування закладок. Розглянемо базові компоненти Borland C++ Builder 6.
2.1. Компонента Label. Компонента Label (мітка, етикетка, надпис) часто використовується при написанні різноманітних застосувань для відображення тексту, надписів на формі.
Рис. 11. Вигляд і розташування компоненти Label на палітрі компонент
Для додавання компоненти на форму необхідно один раз натиснути лівою клавішею миші на цю компоненту на палітрі компонент, розміщених на закладці Standard (рис. 11), і після цього один раз клікнути мишею в тому місці на формі, де потрібно її розмістити. Після цього на формі з’явиться мітка із написом та ім’ям за замовчуванням (рис. 12).
Рис. 12. Вигляд компоненти Label на формі
Переміщення компоненти на формі відбувається за допомогою миші або клавіш навігацій (вліво, вправо, вниз, вгору) із натисненням клавіші Ctrl.
Усі компоненти і сама форма є об’єктами того чи іншого класу, який має свої методи, поля і властивості. Тому зрозуміло, що поведінка і вигляд компонент визначається їх властивостями, методами та подіями, на які вони можуть реагувати.
Доступ до властивостей на етапі проектування здійснюється за допомогою інспектора об’єктів (Object Inspector), який забезпечує простий і зручний інтерфейс для зміни властивостей об’єктів C++ Builder. Значення властивостей, встановлених на етапі проектування, відповідають за те, з якими початковими параметрами почне працювати застосування. До властивостей можна доступатися і на етапі його виконання, зокрема зчитувати та встановлювати їх значення.
Вікно інспектора об'єктів має дві закладки – властивості та події (рис. 13). Над ними розташований випадаючий список всіх компонент, що розміщені на формі. За його допомогою є можливість вибрати потрібну компоненту.
Рис. 13. Вигляд інспектора об’єктів
Текст, що відображається в компоненті Label, визначається значенням її властивості Caption. Його можна встановлювати в процесі проектування в інспекторі об’єктів, ввівши довільний текст поруч з написом Caption (рис. 4), або задавати і змінювати програмно під час виконання застосування, наприклад:
Label1->Caption = "Новий текст";
Доступ в коді до властивостей і методів здійснюється наступним чином: спочатку записують назву об’єкту (наприклад, Label2), потім символи «->», далі ім’я властивості чи методу.
Наприклад:
Label2->Visible = true;
Властивість Caption має тип рядка AnsiString. При присвоєнні цьому типові числової інформації відбувається її автоматичне перетворення в рядок. Тому є можливість безпосередньо здійснювати подібні присвоєння. Наприклад, оператор
Label1->Caption = 5.1;
приведе до появи в мітці напису «5.1». Якщо необхідно занести в мітку змішану інформацію, що складається з рядків символів і чисел, можна скористатися функціями FloatToStr і IntToStr, що перетворюють відповідно числа з плаваючою комою і цілі в рядок. Для формування тексту, що складається з декількох фрагментів, можна використати операцію "+", яка для рядків означає їх склеювання (конкатенацію). Наприклад, якщо в програмі є ціла змінна i, що відображає кількість робітників деякої організації, то вивести цю інформацію в мітку Label1 можна операторами:
Label1->Caption = "Кількість робітників: " + IntToStr(i);
Колір фону задається властивістю Color. Якщо його не задати, він буде мати значення за замовчуванням і зливатиметься з кольором контейнера, що містить мітку.
Важливою властивістю є Name. При додаванні нової компоненти на форму C++ Builder призначає їй ім’я за замовчуванням у вигляді: <Назва компоненти><порядковий номер> (наприклад, Label2). Рекомендується одразу ж після додавання компоненти на форму змінити її назву на таку, яка має смислове навантаження. Якщо спочатку не задати логічну назву якійсь компоненті, то надумавши зробити це пізніше необхідно буде змінити всі звертання в коді, які використовують стару назву, яка була призначена за замовчуванням. Змінити назву компоненти можна знову ж таки, як в режимі проектування так і в коді. Для зміни назви в режимі проектування ви повинні ввести нову назву у полі інспектора об’єктів поруч з властивістю Name.
Колір напису визначається підвластивістю Color властивості Font. В інспекторі об’єктів праворуч від властивості Font є зображення хрестика, натиснувши на яке, розкривається список підвластивостей. Якщо ж натиснути на зображенні трьох крапок ліворуч властивості Font, то відкриється діалогове вікно, в якому можна у звичний спосіб задати параметри шрифту.
Розміщення всіх візуальних компонент на формі визначається, зокрема, властивостями Left, Top, Height, Width, що представляють координати верхнього лівого кута компоненти (x, y), висоту і ширину компоненти відповідно.
Компонента Label, як і всі інші візуальні компоненти має властивість Visible, яка відповідає за відображення компоненти на формі. Якщо властивість Visible встановлена в false, то компонента є видима під час проектування, однак стає невидимою під час виконання програми. Керувати видимістю компоненти можна і під час виконання застосування, змінюючи її властивість Visible, наприклад:
Label2->Visible = true;
2.2. Компонента Edit. Дана компонента на відміну від компоненти Label не лише відображає текст, але й дає можливість користувачу під час виконання застосування його вводити. Завдяки цьому відбувається взаємодія користувача із застосуванням під час його виконання. Розміщена дана компонента на закладці Standard (рис. 14).
Рис. 14. Вигляд і розташування компоненти Edit на палітрі компонент
Додавання на форму компоненти Edit (вікна редагування) відбувається аналогічно до додавання на форму компоненти Label. При розміщенні на формі компонента має вигляд подібний до того, як зображено на рис. 15.
Текст, що вводиться і відображається у компоненті, міститься у властивості Text, яка має тип Ansistring. Цю властивість можна встановлювати в процесі проектування або задавати програмно. Вирівнювання тексту неможливе, як і перенесення рядків. Текст, що не поміщається по довжині у вікно, просто посувається і користувач може переміщуватися по ньому за допомогою курсора.
Рис. 15. Вигляд компоненти Edit
Вікно редагування має багато функцій, властивих більшості редакторів. Наприклад, в ньому передбачені типові комбінації «гарячих» клавіш: Ctrl+C – копіювання виділеного тексту в буфер обміну Clipboard (команда Copy), Ctrl+X – вирізування виділеного тексту в буфер Clipboard (команда Cut), Ctrl+V – вставка тексту з буферу Clipboard в позицію курсору (команда Paste), Ctrl+Z – відміна останньої команди редагування.
Властивість MaxLength визначає максимальну довжину тексту, що вводиться. Якщо Maxlength = 0, то довжина тексту необмежена. Інше значення Maxlength вказує максимальне число символів, яке може ввести користувач.
2.3. Компоненти Button та BitBtn. Дані компоненти представляють кнопки, що є одними з найбільш використовуваними. Це зумовлено особливостями їх використання. Розміщені вони відповідно на закладці Standard (рис. 16) та Additional (рис. 17).
Рис. 16. Вигляд і розташування компоненти Button на панелі компонент
Рис. 17. Вигляд і розташування компоненти BitBtn на панелі компонент
Найбільш простою і часто використовуваною є кнопка Button. Рідше використовується кнопка BitBtn, що відрізняється можливістю відображати на її поверхні зображення. Більшість властивостей, методів і подій для цих видів кнопок однакові.
Основна властивість кнопки – Caption (напис). У написах кнопок можна передбачати використання клавіш прискореного доступу, виділяючи для цього один з символів напису. Перед символом, який повинен відповідати клавіші прискореного доступу, ставиться символ амперсанда "&". Цей символ не відображається у написі, однак наступний за ним символ стає підкресленим. Тоді користувач має змогу замість клікання на кнопку натискати у будь-який момент клавішу Alt спільно з клавішею виділеного символу.
Основне застосування кнопки пов’язане з можливістю її натиснення. Це забезпечується таким механізмом як подія. Події дозволяють класу або об’єкту повідомити інші класи чи об’єкти, про те, що відбулося «щось цікаве». Говорять, що клас, який посилає повідомлення про подію, її породжує (raise), а клас, який її приймає – її отримує (handle).
При взаємодії користувача із програмою програма реагує на дії користувача за допомогою подій, які можуть породжуватись тими чи іншими об’єктами (наприклад кнопками).
Закладка подій (Events) складає другу частину інспектора об’єктів. На ній відображені всі події, на які може реагувати вибраний об’єкт. Наприклад, якщо треба виконати певні дії у момент створення форми (зазвичай це різноманітні операції налаштування), то потрібно виділити подію OnCreate. Поряд з ім’ям цієї події відкриється вікно з випадаючим списком. Якщо ви вже написали в своєму застосуванні обробники подій і хочете при події OnCreate використовувати один з них, ви можете вибрати необхідний обробник з випадаючого списку (рис. 18).
Якщо потрібно написати новий обробник, то зробіть подвійне клікання на порожньому вікні списку. Ви попадете у вікно Редактора коду, в якому побачите заготовку компілятора:
void fastcall TForm1::FormCreate(TObject *Sender)
{
}
Курсор буде розташований в порожньому рядку між рядками з відкриваючою і закриваючою фігурними дужками. Код, який ви побачите – це заготовка обробника події, яку автоматично зробив C++ Builder. Вам залишається лише в проміжку між дужками "{" і "}" написати необхідні оператори (рис. 19).
Рис. 18. Вигляд закладки подій (Events) Інспектора обєктів,
коли ще немає жодного обробника
Рис. 19 Вигляд описаного вище коду
Рис. 20. Вигляд закладки Events Інспектора обєктів
після виконання вищеописаних дій
Якщо ви зробили ці операції, то поверніться в Інспектор об’єктів, виділіть у ньому, наприклад, подію OnActivate і натисніть кнопку випадаючого списку. Ви побачите в цьому списку введений вами раніше обробник події OnCreate (рис. 20). Якщо треба використовувати той же обробник і в події OnActivate, просто виберіть його із списку. Таким чином є можливість уникнути дублювання в програмі одних і тих же фрагментів коду.
Основна подія будь-якої кнопки – OnClick. Вона виникає при кліканні мишею на кнопці під час виконання програми. Саме у обробнику цієї події записуються оператори, які повинні виконуватися при кліканні користувача на кнопку. Окрім цього є ще ряд подій, пов’язаних з різними маніпуляціями клавішами і кнопками миші та іншими.
Якщо значення властивості Cancel встановити в true, це означатиме, що натиснення користувачем клавіші Esc буде еквівалентне кліканню по даній кнопці. Цю властивість доцільно задавати рівною true для кнопок "Відмінити" в різних діалогових вікнах для того, щоб можна було вийти з діалогу, натиснувши або на цю кнопку, або клавішу Esc.
Якщо властивість Default встановлена в true, то це означає, що натиснення користувачем клавіші введення Enter буде еквівалентне натисненню на дану кнопку, навіть якщо дана кнопка у цей момент не знаходиться у фокусі. Однак, це спрацює лише у випадку якщо у фокусі знаходиться якийсь віконний компонент. Якщо ж у момент натиснення Enter у фокусі знаходиться інша кнопка, то все-таки спрацює кнопка, яка знаходиться у фокусі. Якщо властивість Default задана рівною true в декількох кнопок на формі, то при натисненні Enter спрацює та з них, яка в послідовності табуляції є найпершою.
З методів, якими володіють кнопки, відзначимо один – Click. Виконання цього методу еквівалентне кліку на кнопці, тобто викликає подію кнопки OnClick. Цим можна скористатися, щоб продублювати якимись іншими діями користувача клік на кнопці. Наприклад, потрібно, щоб при натисненні користувачем клавіші з символом "С" або "с" у будь-який момент роботи з застосуванням виконувалися операції, передбачені в обробнику події OnClick кнопки Button1. Оскільки невідомо, який компонент буде знаходитись у фокусі у момент цієї події, треба перехопити його на рівні форми. Таке перехоплення здійснюється, якщо встановити властивість форми KeyPreview у true. Тоді в обробнику події форми OnKeyPresss можна написати оператори:
if ((Кеу == 'С') || ( Кеу == 'с')) Button1->Click();
Якщо користувач ввів символ "С" або "с", то в результаті буде виконаний обробник натиснення кнопки Button1.
Все сказане вище в рівній мірі відноситься і до Button, і до BitBtn. Розглянемо тепер особливості кнопки з піктограмою BitBtn. Зображення на цій кнопці задається властивістю Glyph. При натисненні кнопки з трьома крапками у рядку властивості Glyph в інспекторі об’єктів відкриється вікно, представлене на рис. 21.
Рис. 21. Робота із властивістю Glyph компоненти BitBtn
Натиснувши кнопку Load, ви перейдете в звичайне вікно відкриття файлу малюнка, де зможете вибрати файл бітової матриці .bmp, що містить бажане зображення. Вибравши потрібне зображення і натиснувши кнопку ОК вибране зображення з’явиться на вашій кнопці лівіше за напис.
Приклад. Проілюструємо можливості використання і принцип роботи із розглянутими компонентами. Створимо форму наступного вигляду:
Рис. 22. Вигляд форми в режимі проектування та в роботі застосування
Для цього створимо новий віконний проект і на форму помістимо дві мітки, два вікна редагування і одну кнопку. Властивості Caption міток задамо значення "x" та "y" відповідно, кнопки – "Натисни". Значення властивостей Text вікон редагування видалимо, тим самим задавши їм значення пустих стрічок. Створимо обробник події OnClick для кнопки. Для цього виберемо кнопку на формі одним кліком миші по ній, і після цього в інспекторі обєктів в закладці Events клікнемо двічі поруч в полі поруч з відповідною подією. В заготовці обробника події введемо наступний код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Randomize();
Button1->Top = random(Form1->ClientHeight - Button1->Height);
Button1->Left = random(Form1->ClientWidth - Button1->Width);
Edit1->Text = Button1->Top;
Edit2->Text = Button1->Left;
}
Функція Randomize() ініціалізує початкове значення генератора випадкових чисел.
Функція int random(int) повертає випадкове значення більше за нуль, але менше за число в дужках.
Застосування при кожному натисканні на кнопку переміщає її у випадковим чином вибрану позицію, при цьому нові координати кнопки відображаються у значеннях Edit1 та Edit2. Як бачимо, це все відбувається завдяки доступу до відповідних властивостей та їх зміни.
Тепер добавимо обробник події OnMouseMove для кнопки Button1:
void __fastcall TForm1::Button1MouseMove(TObject *Sender,
TShiftState Shift, int X, int Y)
{
Randomize();
Button1->Top = random(Form1->ClientHeight - Button1->Height);
Button1->Left = random(Form1->ClientWidth - Button1->Width);
Edit1->Text = Button1->Top;
Edit2->Text = Button1->Left;
}
Для кнопки змінимо властивість TabStop = false і внесемо зміни в код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ShowMessage("Вітання! Ви перемогли!");
}
Якщо користувач натисне кнопку буде показано повідомлення із текстом «Вітання! Ви перемогли!». Однак кнопка щоразу змінюватиме свою позицію на формі як тільки користувач підведе курсор миші до неї – це забезпечується подією OnMouseMove.
2.4. Компоненти CheckBox і CheckListBox. Індикатори з прапорцем CheckBox використовуються в застосуваннях в основному для того, щоб користувач мав змогу вмикати і вимикати певні опції, або для індикації стану. Дана компонента розташована на закладці Standard (рис. 23).
Рис. 23. Розташування на палітрі піктограми компоненти CheckBox
При кожному кліку користувача на індикаторі його стан змінюється, проходячи в загальному випадку послідовно через три значення: виділене (поява чорної галочки), проміжне (сіре вікно індикатора і сіра галочка) і не виділене (порожнє вікно індикатора). Цим трьом станам відповідають три значення властивості State: cbChecked, cbGrayed, cbUnchecked. Проте, ці три стани допускаються лише при значенні іншої властивості AllowGrayed рівному true. Якщо ж AllowGrayed = false (значення за замовчуванням), то допускається лише два стани: виділене і не виділене. І State, і AllowGrayed можна встановлювати під час проектування або програмно під час виконання.
Проміжний стан зазвичай використовується, якщо індикатор застосовується для відображення якоїсь характеристики об’єкту. Наприклад, якщо індикатор покликаний показати, який регістр використовувався при написанні якогось фрагмента тексту, то у випадку, якщо весь текст написаний у верхньому регістрі, індикатор може приймати виділений стан, якщо в нижньому – не виділений, а якщо використовувалися обидва регістри – проміжний.
Перевіряти стан індикатора можна не лише за значенням State, але і за значенням властивості Checked. Якщо Checked рівне true, то індикатор вибраний, тобто State = cbChecked. Якщо властивість Checked рівна false, то State рівне cbUnchecked або cbGrayed. Встановлення Checked у true під час проектування або виконання автоматично перемикає State у cbChecked.
У індикаторі CheckBox напис задається властивістю Caption, а її розміщення по відношенню до індикатора – властивістю Alignment.
Ще одна компонента, що має індикатори – список CheckListBox. У ній біля кожного рядка списку є індикатор, стан якого користувач може змінювати. Дана компонента розташована на закладці Additional (рис. 24). Стани індикаторів визначають дві властивості: State і Checked, які можна розглядати як індексовані масиви, кожен елемент якого відповідає індексу рядка. Загальна кількість елементів визначається властивістю Count (лише для читання). Оскільки індекси починаються з 0, то індекс останнього елементу рівний Count - 1.
Рис. 24. Розташування піктограми компонента CheckListBox
Властивості State і Checked можна встановлювати. Наприклад, оператори
CheckListBoxl->Checked[l] = true;
CheckListBoxl->State[2] = cbGrayed;
встановлюють індикатор другого рядка списку CheckListBox1 у стан вибраного, а індикатор третього рядка — в проміжний стан (пригадаємо, що індекси починаються з 0).
Наступні оператори перевіряють стан всіх індикаторів списку, і для вибраних користувачем рядків здійснює певні дії (на місці цих дій поставлено три крапки):
for (int i = 0; i < CheckListBox1->Items->Count; i++)
if (CheckListBox1->Checked[i])
{ ... }
У компоненті CheckListBox є також подія OnClickCheck, яка виникає при кожній зміні користувачем стану індикатора. Це можна використовувати для обробки результатів зміни.
2.5. Компонента CspinEdit. CSpinEdit – це компонента, в якій користувач може вибирати ціле число, змінюючи його кнопками із стрілками.
За значення, яке відображається у компоненті CSpinEdit відповідає властивість Value. Її можна встановлювати під час проектування, і можна до неї доступатися в коді, змінюючи її необхідним чином. Дана компонента розміщена на закладці Samples (рис. 25).
Рис. 25. Розташування на палітрі інструментів компоненти CspinEdit
При натисканні на стрілки компоненти значення, яке відображається в ній збільшується або зменшується на 1, в залежності від того, яку стрілку натиснули. За крок, на який змінюється значення в CSpinEdit відповідає властивість Increment.
Компонента CSpinEdit дає змогу обмежити максимальне та мінімальне можливе значення, задавши MaxValue і MinValue. При цьому при досягненні верхньої або нижньої межі компонента не дасть змоги ще збільшити або зменшити значення. Якщо значення цих двох властивостей, тобто MaxValue і MinValue, однакові, то вважається, що обмежень на значення немає.
