Така консистенція базового класу classProgressBar була обрана тому що саме параметри, які визначають колір, є загальними для усіх видів ProgressBar, тобто ці параметри будуть раціонально успадковуватися в кожний з похідних від classProgressBar класів з можливістю зміни деяких з них (backc).
2.3.2 Базовий клас font
Також створено базовий клас font, метод my_font якого дозволяє користувачеві встановлювати необхідний шрифт написів. Мотив створення цього класу – такий самий, як в класі classProgressBar. Тобто шрифт є загальним параметром для кожного з можливих ProgressBar.
Перевизначення шрифту реалізується за допомогою функції settextstyle модуля graphics.h. Перший аргумент показує номер обраного шрифту, другий – направлення тексту, третій – розмір букв. Оскільки нас цікавить саме шрифт тексту, то два других параметри прирівнюємо до 0.
2.3.3 Похідні класи horBar, vertBar, roundBar та ringBar
Клас horBar є похідним від класів font та classProgressBar. Похідний клас horBar надає можливість створювати горизонтальну смужку прогресу. Цей клас містить конструктор, за допомогою якого користувач може ввести необхідний відсоток прогресу (від 0 до 100) відповідно до обсягу виконаної роботи. Значення цього відсотку буде міститься у змінній p, яка має статус доступу protected. Це зроблено для того, щоб на основі класу horBar можна було створювати похідні класи, і при цьому відсоток виконаної роботи зберігається. Треба наголосити, що всі смужки прогресу в даній курсовій роботі представляють собою окремі об’єкти без прив’язки до конкретної дії. Тобто користувач сам обирає скільки відсотків прогресу пройдено після певної дії.
Метод sizeцього класу задає лінійні параметри віконця смужки прогресу. Аргументами цього методу є координати верхнього лівого та нижнього правого кутів віконця. Для демонстрації динамічного поліморфізму в класі horBar створено конструктор копіювання. Тобто, при тестуванні цього класу спочатку буде створюватися певний об’єкт за допомогою основного конструктора, далі буде створена копія цього об’єкту за допомогою конструктора копіювання і методи класу horBar будуть приміняться до об’єкта-копії. Оскільки при створені об’єктів таким чином використовується динамічна пам’ять, то при закінченні роботи об’єктів використовуються однойменний деструктор для визволення використаного об’єму динамічної пам’яті.
Метод show класу horBar виконує дві функції: по-перше, цей метод надає можливість користувачеві міняти положення віконця смужки прогресу на екрані (можна переміщувати віконце вправо – d, вліво – a, вниз – s, вгору - w). Переміщення припиняється після натискання кнопки r. По-друге, вже після вибору місця положення віконця на екрані, метод show заповнює відповідну частину смужки прогресу певним кольором. Структура методу showє приблизно однаковою для всіх класах.
В класі horBarперевантажена віртуальна функція my_colors. Тобто перевизначити кольори можна також із класу horBar. Взагалі, використання віртуальної функції в даному випадку не є раціональним, оскільки метод my_colors і так буде успадковуватися в клас horBar. Використання віртуальної функції тут є прикладом використання концепції динамічного поліморфізму.
Підчас заповнення смужки прогресу у верхній частині екрану можна побачити відсоток заповнення. На відмітках 25%, 50%, 75% та 100% внутрішній динамік комп’ютера подає звуковий сигнал частотою 500 Гц тривалістю 0,3 сек для зручнішої орієнтації в обсязі виконаної роботи.
Аналогічний принцип дії має клас vertBar, на основі якого можна створювати вертикальні смужки прогресу. Цей клас також успадковуються від базових класів classProgressBar та font. Конструктор, деструктор та методи size, show класу vertBar виконують такі ж самі дії, що і в класі horBar, тільки у відповідних координатах (тобто, щоб смужка прогресу росла вгору). Також в класі vertBar визначена дружня функція my_size, яка може відігравати роль методу size, тобто визначення границь віконця. Функція my_size описана поза класу vertBar (як і треба для дружньої функції). Використання дружньої функції є раціональним, якщо вона використовується в декількох класах і в основній програмі. Тобто, це дозволяє скоротити програмний код. В нашому випадку використання дружньої функції не є раціональним, тому що вона використовується лише для класу vertBar.
Ще одною різницею між класами horBar та vertBar є те, що в останньому відсутній конструктор копіювання, і об’єкт, створений на основі цього класу ініциалізується за допомогою базового конструктора.
Класів ringBar (смужка прогресу в вигляді кільця) є похідним від класу roundBar (смужка прогресу у виді кругу), який в свою чергу успадковується від базових класів classProgressBar та font. Успадкування класів horBar, vertBar та roundBar від базових класів classProgressBar та font демонструє концепцію множинного успадкування. В цій курсовій роботі використання множинного успадкування є чисто демонстративним і не є раціональним, тому що один-єдиний метод класу font (my_font) можна було б помістити в клас classProgressBar. Використання множинного успадкування говорить о том, що методи та дані базових класів є загальними для усіх похідних (успадкованих) класів. Дійсно, вибір кольорів шрифту, фону, смужки прогресу та шрифту є загальними діями для усіх похідних класів.
Концепція поодинокого успадкування демонструється на успадкуванні класу ringBar від класу roundBar. Клас roundBar має конструктор, деструктор, методи size(intx0, inty0), size (intrad) та show, які виконують відповідні аналогічні дії як в класах horBar та vertBar. При об’яві класу-родителя класу ringBar вказано специфікатор virtual в разі використання вказівника на базовий клас roundBar (базовий для ringBar). Клас ringBar має свій метод show, але успадковує методи size (обидва) класу roundBar. Наявність двох функцій-методів в класі roundBar демонструє статичний поліморфізм. Тобто, ідентифікатори у функцій одинакові, а кількість змінних та відповідні дії, які виконуються функціями, – різні. Також в межах класу ringBar перевантажено стандартну функцію “+”. Це перевантаження передбачає збільшення радіуса віконця першого об’єкту при використанні її як суми двох об’єктів класу ringBar. Тобто, таким чином радіус першого об’єкту буде дорівнювати сумі радіусів доданих об’єктів.
Заповнення круга відповідним кольором в класі roundBar відбувається за допомогою функції pieslice модуля graphics.h. Ця функція дозволяє намалювати зафарбований сектор круга. Аналогічно організовано клас ringBar, тільки всередині круга розташований ще один зафарбований круг меншого радіуса.
2.4 Методи тестування програми
Розглянемо тіло основної процедури та методи тестування програми. На початку йде ініціалізація графічного режиму (в режимі VGA 640x480x16). Далі користувачеві надається можливість вибрати один з чотирьох PrograssBar. Після вибору на екрані з’являється віконце смужки прогресу. З цього моменту користувач може двигати її в різні сторони екрана, користуючись кнопками “a”,”s”,”d”,”w”. Закінчення руху позначається натисканням кнопки “r”. Недоліком такої організації руху є те, що щоб перемістити об’єкт треба 2 рази натиснути на відповідну кнопку. Це трапилося внаслідок подвійного використання функції getch() – запиту символу з клавіатури. Перший раз йде перевірка, чи є нажата кнопка “r”, а другий раз ідентифікує саму нажату кнопку та виконує відповідні дії.
Нехай вибрано варіант 1 – горизонтальна смужка прогресу. Тоді йде ініціалізація самого об’єкту, використовуючи основний конструктор horBar. Далі йде створення та ініціалізація такого ж самого об’єкту за допомогою конструктора копіювання та використання методів my_color та my_font базових класів. За допомогою метода sizeвибирається необхідний розмір віконця смужки прогресу. Далі, використовуючи метод show,смужка прогресу починає свій рух. Після зупинки об’єкт «горизонтальна смужка прогресу» знищується за допомогою деструктора.
Аналогічно тестується вертикальна смужка прогресу – варіант 2 (клас vertBar), тільки конструктор копіюванняне використовується.
Інший спосіб ініціалізації та користування об’єктів описаний при виклику смужки прогресу в вигляді круга (roundBar). Тут створюється спочатку сам об’єкт, потім створюється вказівник на нього за тим же типом (roundBar). Далі можна використовувати методи класу, звертаючись до них через вказівник. Тобто, тут використовується динамічна пам’ять для роботи з класом, його методами та даними.
Тестування класу ringBar проводилося як і для класів horBar та vertBar.
В результаті отримали бажані результати. При створенні об’єктів horBar та vertBar на екрані з’являється кероване віконце (горизонтальне та вертикальне відповідно) смужки прогресу, і після натискання кнопки “r” йде рівномірне заповнення віконця смужкою відповідного кольору. Паралельно йде відлік виконаного обсягу роботи у відсотках в верхній частині екрану.
При використанні об’єктів roundBar та ringBar на екрані з’являються відповідно керовані коло та кільце, і після натискання кнопки “r” йде рівномірне обертання радіуса з паралельним заповненням об’єктів певним кольором. Особливістю використання ringBar є те, що за рахунок різних частот (системна обумовленість) появи нового стану смужки прогресу та внутрішнього круга, іноді можна помітити внутрішню частину віконця (тобто, новий стан смужки прогресу вже є, а круга, який закриває внутрішню частину віконця, немає). Такий процес займає десяті долі секунди.
2.5 Результати виконання програми
У відповідності до обраних варіантів ProgressBarприводимо результати виконання програми.
1. Горизонтальний Progress Bar
2. Вертикальний Progress Bar
3. Круговий Progress Bar
4. Кільцевий ProgressBar