Система об’єктно-орієнтованого програмування С++ Builder виробництва корпораціїBorland призначена для операційних систем Windows 9х—ХР. Вона функціонує під керуванням ОС типу Microsoft Windows.
Інтегроване середовище С++ Builder цілком підтримує стандарт мови С++, завдяки чому існує можливість створення за допомогою цієї системи програмування модулів і бібліотек, що застосовуються в інших засобах розробки.
Структура класів, створених мовою С++ системи програмування Borland С++ Builder,побудована в бібліотеці VCL (Visual Component Library) і містить потужний набір засобів та бібліотек, що підвищують продуктивність праці програмістів і скорочують тривалість циклу розроблення.
Багатофункціональне інтегроване середовище С++ Builder містить компілятор, який відповідає вимогам стандарту ANSI/ISO, вбудований дизайнер форм, багатий набір засобів для роботи з компонентами, інструмент Object Inspector, менеджер проектів і налагоджувач. Новий багатоцільовий менеджер проектів з відкритою архітектурою забезпечує повний контроль над вихідними текстами і процесом компоновки, що дозволяє переглядати залежності модулів вихідного коду і настроювати параметри компіляції,компоновки і налагодження для кожного з модулів проекту. За допомогою цього середовища можна створити додаток будь-якої складності з привабливим графічним інтерфейсом [2,19].
Для запуску системи необхідно активізувати середовище С++ Builder, тобто двічі клацнути мишкою на зображенні ярличка з відповідним написом, або виконати послідовність команд Пуск | Програми | C++Builder. На екрані монітора з’явиться головне вікно (див. рис. 12.1), на якому розміщені такі елементи — заголовок, панель керування системою, вікно форми (так званий візуальний проектувальник), вікно інспектора об’єктів (Object Inspector), а також вікно редактора програмного коду додатка, що зазвичай приховане за вікном форми. Переключення між вікном коду і вікном форми здійснюється з використанням клавіші F12 або клацанням мишкою на будь-якій видимій частині відповідного вікна.
Опишемо стисло основні складові частини та принципи роботи системи Borland С++Builder, які найчастіше використовуються.
Панель керування (див. рис. 12.2) має рядок меню, панель інструментів, що містить командні кнопки для виконання дій, та палітру компонентів.
Палітра компонентів (див. рис. 12.3) має набір елементів керування, з яких створюється інтерфейс програми. Палітру компонентів розбито на сторінки, тобто розділи, кожен з яких має згруповані компоненти, близькі за призначенням. У прикладах, розглянутих далі, будуть використовуватися сторінки Standard та Additional.
Зображення і назви наборів компонентів сторінок Standard та Additional представлені утабл. 12.1 і табл. 12.2
Візуальний проектувальник (дизайнер форм) використовується для створення інтерфейсу програми. Він необхідний для створення форм, тобто вікон Windows, у яких містяться різні елементи керування. У програмі звичайно є головна і додаткові форми, кількість яких не обмежена.
Редактор коду призначений для написання тексту програми, зокрема оброблювачів подій, і складається з трьох панелей:
- панелі переглядача класів (Class Explorer);
- панелі редактора тексту програми;
- панелі переглядача об’єктів (Object tree view).
Інспектор об’єктів необхідний для завдання властивостей об’єктів і визначення їхньої реакції на різні події. Властивість об’єкта — це одна з його характеристик, наприклад, ширина для кнопки, назва для вікна, колір і стиль для шрифту. Інспектор об’єктів дозволяє швидко і зручно змінювати будь-які властивості поточного, тобто виділеного на формі, об’єкта.
Інспектор об’єктів складається з декількох частин і містить дві вкладки: вкладка властивостей обраного об’єкта (Properties) і вкладка подій (Events), що дозволяє програмі реагувати на будь-які дії користувача так, як це задано програмістом. Кожна з вкладок містить панель із двох стовпчиків. Вкладка Properties має у першому стовпчику назви властивостей, а в другому — поточні значення відповідних властивостей. У першому стовпчику вкладки Events знаходиться назва події, а другому — функція обробки цієї події.
Уся робота в середовищі С++ Builder здійснюється у вікнах, основним з яких є форма,і програмування ґрунтується на взаємодії двох процесів:
- конструювання форми, тобто розміщення на ній необхідних елементів (компонентів) керування розв’язанням задачі;
- написання програмного коду, який забезпечує функціонування цих компонентів.
Згідно з термінологіїєю С++ Builder весь комплекс програм, який створюється при розв’язанні конкретної задачі, є проектом.
Проект — це основна програма, котра цілком створюється системою і записується у файл з розширенням .dpr. Вона містить інструкції, з яких починається виконання додатка, а також відповідає за проведення процесу компіляції і компонування. В проекті не рекомендується робити будь-які зміни. Програма складається з одного чи більше модулів з розширенням .срр, які містять програмні коди. Крім того, для кожного додатка автоматично створюється ще один файл, що називається заголовним або інтерфейсним і має розширення .h. Для кожного програмного додатка система створює мінімально необхідну програму, тобто пропонує заготовку для написання програмного коду, а користувач повинен записати в цю заготовку свої інструкції, котрі реалізують роботу заданого алгоритму. Враховуючи вище сказане, доцільно зробити висновок, що С++Builder асоціює з кожним додатком три вихідних файли з такими іменами за замовчуванням:
- файл реалізації Unit1.cpp — зберігає програмний код додатка. Саме в ньому записуються оброблювачі подій, які відповідають за реакцію програми при впливі користувача на об’єкти компонентів;
- заголовний файл Unit1.h — містить список всіх об’єктів і їхніх конструкторів;
- файл Project1.cpp — обслуговує всі об’єкти, що укладені в додатку. Будь-яка нова форма, програмний модуль чи модуль даних автоматично включаються в проектний файл. Зміст вихідного тексту проектного файла можна переглянути у вікні редактора коду за допомогою команди головного меню View | Project Source або вибравши одноіменну опцію з контекстного меню адміністратора проекту.
Для створення додатка треба спочатку на формі розмістити компоненти, що забезпечують введення вихідних даних, їхню обробку і виведення отриманого результату,а потім у вікні програмного коду записати оператори мови С++, які забезпечують функціонування цих компонентів.
У вікні форми слід розмістити компоненти, необхідні для керування роботою додатка. Для цього треба спочатку клацнути лівою клавішею мишки на обраному з палітри компоненті, потім перевести покажчик мишки в намічене місце форми і клацнути ще раз. Після розміщення компонент можна переміщати у вікні форми, змінювати розміри і коригувати напис. Для цього достатньо зробити компонент активним, тобто клацнути мишкою у вікні Object Inspector, у полі Properties знайти властивість Caption чи Text і залежно від виду компонента замінити текст на потрібний або видалити його зовсім за допомогою клавіші Backspace («забою»).
Для створення форми у вікні коду додатка буде автоматично створена заготовка програмного коду, що має вигляд:
#include <vcl.h> //здесь можно добавлять заголовочные файлы #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfn" TForm1 *Form1; // здесь можно описывать глобальные переменные __ fastcall TForm1::TForm1 (TComponent* Owner) : TForm(Owner) { //здесь можно записывать свой конструктор формы }
У заготовці програмного коду коментарі зазначають місця, де користувач за необхідності може розміщати свої інструкції.
На цій заготовці ще не відведено місця для операторів програми. Воно буде створене при розміщенні на формі компонента, який породжує подію.
Ключове слово __fastcall в оголошеннях функцій обробки подій генерується автоматично. Завдяки __fastcall передача параметрів організується не через стек, а через регістри центрального процесора. Виклики оброблювачів подій відбуваються дуже часто, тому економія часу, який витрачається на вибірку параметрів з пам’яті стека, виявляється дуже відчутною.
Розв’язання практично будь-якої задачі потребує введення вихідних даних у пам’ять комп’ютера і виведення отриманих результатів. Для цього можна застосовувати як компоненти з С++ Builder, так і функції системи WINDOWS.
Введення даних найчастіше здійснюється з використанням компонентів: Edit(однорядковий редактор) та Меmо (багаторядковий редактор), що розташовані на сторінціStandard палітри, а також таблиці StringGrid, яка знаходиться на сторінці Additional.Крім того, для введення іноді зручно використовувати функцію InputBox().
Виведення повідомлень про результати роботи програми можна реалізувати з застосуванням популярних компонентів Label, Edit, Memo, StringGrid і функціїShowMessage(), MessageDlg(). Компонент Label часто використовується також для пояснень, підказок тощо. Взагалі система С++ Builder налічує багато різних компонентів, за допомогою яких можна здійснювати введення і виведення даних.
Перейдемо до практичного знайомства з компонентами.
Приклад 12.1. Обчислити значення функції у = ах2 – sinx, якщо хє є [-1; 2]; hx = 0,5 при довільному значенні змінної а.
Алгоритм та програмну реалізацію на С++ розв’язання подібної задачі розглянуто раніше (див. приклад 1.1 і приклад 5.1 частини І).
Робота починається з активізації системи C++Builder. Потім за необхідності можна змінити заголовок вікна форми Forml на більш змістовний, наприклад, «Задача №1». Для цього слід форму зробити активною, клацнувши на будь-якому її місці мишкою, і у вікніObject Inspector у властивості Caption слово Forml замінити на запис «Задача №1».
Для введення значень змінної а на формі розмістимо компонент Edit з написом Edit1 за раніше описаною методикою. Для того, щоб поле введення було чистим перед розміщенням на ньому потрібного значення, у вікні Object Inspector у властивості Text видалимо написEdit1. При цьому поле введення компоненти стане порожнім.
Ліворуч від компонента Edit аналогічним чином розмістимо компонент Label, а у вікні інспектора об’єктів у властивості Caption запишемо «Введите а».
Виведення одержаних результатів розв’язання наведеної задачі розмістимо нижче у компоненті Edit1 і надамо йому назву — «РЕЗУЛЬТАТ», для чого розмістимо в цьому місці ще один компонент Label2 і в її полі Caption запишемо «РЕЗУЛЬТАТ».
Для виведення значень одержаного результату розмістимо під словом «РЕЗУЛЬТАТ»наступний компонент Label3 (номери компонентам присвоюються автоматично) і очистимо її поле Caption. Можна підкреслити, що при очищенні цього поля розміри компонента змінюються. Це відбувається тому, що в полі Size компонента у вікні інспектора об’єктів встановлена опція AutoSize, яка приводить до автоматичної зміни розмірів вікна при розміщенні в ньому інформації. Таким чином, на формі розміщено компоненти, необхідні для введення-виведення даних.
Для використання необхідних обчислень на формі розташовано командний компонентButton1, при клацанні на якому буде виконуватися програма обчислення функції. Ценазивається подією. У властивості Caption цього компонента розмістимо слово«Вычислить», яке стане назвою кнопки.
Для закінчення роботи над додатком на формі розмістимо ще один компонент Button2і за вищевказаною методикою надамо їй назву «Конец работы». На цьому процес формування вікна форми закінчено.
Наступний етап — написання програми, яка забезпечує функціонування розміщених компонентів.
Якщо двічі клацнути на кнопці «Вычислить», на екрані з’явиться вікно коду додатка, причому на передньому плані буде заготовка для розміщення програми обробки цієї події, що має вигляд:
//——————————————————
void_ fastcall TForm “Button1 Click(TObject *Sender)
{
/* здесь следует записывать операторы программы обработчика событий */
}
Це і є функція мови С++, у фігурних дужках якої записуються оператори програми.
Слід зауважити, що в полях введення і виведення, розміщених на формі компонентів, записується інформація, яка представлена у вигляді тексту, тобто дані рядкового типу. Якщо ця інформація — числа, то перш ніж їх обробляти, треба рядкове подання перетворити на числове, а при виведенні необхідно зробити зворотне перетворення. Для цього рекомендується використовувати такі функції:
- StrToInt(St) — перетворює рядкове дане St у число цілого типу;
- IntToStr(x) — перетворює число цілого типу в його рядкове подання;
- StrToFloat(St) — перетворює рядкове дане в число дійсного типу;
- FloatToStr(x) — перетворює дійсне число в його рядкове подання;
- FIoatToStrF(x, формат,w,d) — форматне перетворення дійсного числа х у рядок символів згідно з форматом.
Тут слово формат — позначення способу перетворення, що може мати такі значення:
- ffFixed — виведення числа в природній формі (з фіксованою крапкою);
- ffExponent — виведення числа в показниковій формі (з плаваючою крапкою);
- ffGeneral — перетворює дійсне число в його рядкове подання як у природній, так і в показниковій формі залежно від його значення.
Параметри w і d вказують кількість позицій, що відводяться під запис числа: w —загальна кількість розрядів, d — кількість розрядів у дробовій частині числа.
Тепер почнемо формувати програмний код додатка. Приклад, що розв’язується, містить обчислювання тригонометричної та алгебраїчної функції, тому на початку коду слід записати заголовний файл math.h.
У програмі оброблювача спочатку необхідно описати змінні, які використовуються —а, х, у. Потім змінній а слід присвоїти значення вікна введення Edit1->Text, це значення буде виведено У вікні Label3->Caption. Далі організуємо цикл для обчислення заданої функції для різних значень простої змінної х і виведення результату в те ж саме вікно. Якщо потрібне повторення обчислень, то наприкінці оброблювача слід записати оператори:
- Edit1 -> Text=” “; — очищення поля введення;
- Edit1 -> SetFocus(); — передача фокуса компоненту Edit1, тобто підготовка його до прийому нового числа. Взагалі ці оператори у даному прикладі не обов’язкові.
Для створення оброблювача події, що має назву «Конец работы», треба двічі клацнути мишкою на відповідній компоненті у вікні форми і у запропонованій заготівці програми записати один оператор Close();.
Готовий додаток перед запуском на виконання треба записати на диск. Оскільки для кожного додатка система створює не один, а декілька файлів, то записувати його рекомендується в окремій папці. Для цього треба в меню File виконати команду SaveProject As, у вікні, що з’явилося, знайти раніше підготовлену папку чи створити нову, а потім її відкрити. При цьому в заголовку вікна буде напис «Save Unit As», тобто система запропонує записати спочатку програмний файл. Внизу віконця в рядку «Имя файла»треба ввести ім’я програмного модуля, використовуючи латинський алфавіт, наприкладZadacha_l.cpp, і натиснути кнопку «Сохранить».
Після цього у заголовку віконця з’явиться напис «Save Project As». У пункті «Имяфайла» треба ввести ім’я файла проекту і також виконати команду «Сохранить».
Далі можна запускати додаток на виконання. Для цього досить клацнути на позначці в командному рядку панелі керування, яка має вигляд трикутника, або натиснути клавішуF9, або виконати команду Run з головного меню Run. У вікні форми, що з’явилася, у полі введення треба ввести значення змінної а і клацнути мишкою на кнопці «Вычислить».Тоді у вікні Label3 з’явиться результат розв’язання задачі.
Нижче наведено вигляд форми, програмний код і результати обчислень.
#include <vcl.h> #include <math.h> #pragma hdrstop #include "Zadacha 1.h" //-------------------------------------------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //-------------------------------------------------------------------------------------------------------------- fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //-------------------------------------------------------------------------------------------------------------- void_ fastcall TForm1::Button1Click(TObject *Sender) { float a, x, y; a = StrToFloat(Edit1->Teхt); // передается значение переменной a // вывод a Label3->Caption ="При a="+FloatToStrF(a, ffGeneral, 4, l)+"\n\n"; for (x =-1; x <= 2; x += 0.5) { у = a*pow(x,2) - sin(x); // вычисление функции // вывод результата Label3->Caption = Label3->Caption + "x="+ FloatToStrF(x, ffGeneral,4,1) +" y="+ FloatToStrF(y, ffGeneral, 6,3) + '\n'; } Edit1->Text = ""; Edit1->SetFocus(); } //------------------------------------------------------------------------------------ void_ fastcall TForm1::Button2CIick(TObject "Sender) { Close(); }
Для закінчення роботи з додатком досить клацнути мишкою на кнопці «Конец работы».