
- •Національний університет “львівська політехніка” Візуальне програмування при об’єктно-орієнтованому підході
- •Лабораторна робота № 1
- •Теоретичні відомості.
- •Завдання для лабораторної роботи
- •Контрольні питання
- •Лабораторна робота № 2
- •Теоретичні відомості.
- •Завдання для лабораторної роботи
- •Контрольні питання
- •Лабораторна робота № 3
- •Теоретичні відомості.
- •Завдання для лабораторної роботи
- •Контрольні питання
- •Лабораторна робота № 4
- •Теоретичні відомості.
- •Завдання для лабораторної роботи
- •Контрольні питання
- •Список літератури
- •Візуальне програмування при об’єктно-орієнтованому підході
Завдання для лабораторної роботи
Створити віконний проект. Додати головне та контекстне меню, необхідні системні діалоги.
Реалізувати текстовий редактор і переглядач графічних файлів.
Контрольні питання
Пояснити чим відрізняються візуальні компоненти від невізуальних.
Які системні діалоги представлені у Borland C++ Builder 6?
Яким методом здійснюється виклик системного діалогу?
Для чого призначена властивість Filter?
Чи здійснює друк компонента PrintDialog?
Чи здійснюють пошук та заміну компоненти FindDialog і ReplaceDialog?
Пояснити призначення компоненти Timer.
Як запустити/зупинити таймер?
Продемонструвати використання компонент MainMenu та PopupMenu.
В якій властивості компонент MainMenu та PopupMenu зберігаються елементи меню?
Як приєднати головне меню до форми?
Як приєднати контекстне меню до компоненти?
Продемонструйте роботу з конструктором меню для компоненти MainMenu.
Скільки компонент MainMenu та PopupMenu може міститись на формі?
Лабораторна робота № 4
Тема. Компоненти Borland C++ Builder 6 для представлення даних.
Мета. Створити віконний проект та продемонструвати використання компонент призначених для відображення та опрацювання даних.
Теоретичні відомості.
Середовище розробки Borland C++ Builder має набір компонент які призначені для відображення, редагування, розміщення та опрацювання даних. Найпростіший спосіб відобразити дані – представити їх у вигляді таблиці. Для цього у Borland C++ Builder 6 є компонента StringGrid.
4.1. Компонента StringGrid. Компонента StringGrid (рис. 47, 48) є таблицею, що містить рядки. Дані таблиці можуть бути лише для читання або такими, що можуть бути редаговані. Таблиця може мати смуги прокрутки, причому задане число перших рядків і стовпців може бути фіксованим і не прокручуватися. Таким чином, можна задати заголовки стовпців і рядків, що постійно присутні у вікні компоненти. Компонента призначена в першу чергу для представлення текстової інформації, однак є можливість відображати і графічну.
Рис. 47. Розташування компоненти StringGrid
Основні властивості компоненти, що відповідають за відображення текста в комірці:
System::AnsіString Cells [int ACol][int ARow] |
Рядок, що міститься у комірці з індексами стовпця і рядка ACol і ARow |
Classes::TStrings* Cols [int Index] |
Список рядків і пов’язаних з ними об’єктів, що містяться в стовпці з індексом Index |
Classes::TStrings* Rows [int Index] |
Список стовпців і пов’язаних з ними об’єктів, що містяться в рядку з індексом Index |
System::Tobject* Objects [int ACol][int ARow] |
Об’єкт, що зв’язаний із рядком, що міститься в комірці з індексами стовпця і рядка ACol і ARow |
Всі ці властивості доступні під час виконання. Задавати текст можна програмно або окремими комірками, або стовпцями і рядками за допомогою методів класу TStrings.
Рис. 48. Початковий вигляд компоненти на формі
Наприклад, наступний код:
int i, j;
for (i = 1; i < StringGrid1->ColCount; i++)
StringGrid1->Cells[i][0] = "стовпець " + IntToStr(i);
for (i = 1; i < StringGrid1->RowCount; i++)
{
StringGrid1->Cells[0][i] = "стрічка " + IntToStr(i);
for (j = 1 ; j < StringGrid1->RowCount; j++)
StringGrid1->Cells[j][i] =
IntToStr(i) + ':' + IntToStr(j);
}
забезпечить заповнення елементів таблиці текстом, показаним на рис. 49.
Рис. 49. Приклад роботи із компонентою StringGrid
Властивості ColCount і RowCount визначають відповідно кількість стовпців і рядків, властивості FixedCols і FixedRows – кількість фіксованих (не прокручуваних) стовпців і рядків. Колір фону фіксованих комірок задається властивістю FixedColor. Властивості LeftCol і TopRow визначають відповідно індекси першого видимого на екрані в даний момент прокручуваного стовпця і першого видимого прокручуваного рядка.
Властивість ScrollBars визначає наявність в таблиці смуг прокрутки. Смуги прокрутки з’являються і зникають автоматично залежно від того, чи поміщається таблиця у відповідний розмір компоненти, чи ні.
Властивість Options задає наступні параметри компоненти:
- наявність розділових вертикальних і горизонтальних ліній у фіксованих (goFixedVertLine і goFixedHorzLine) і не фіксованих (goVertLine і goHorzLine) комірках;
- можливість для користувача змінювати за допомогою миші розміри стовпців і рядків (goColSizing і goRowSizing);
- переміщати стовпці і рядки (goColMoving і goRowMoving) та ін.
Важливим елементом у властивості Options є goEditing – можливість редагувати вміст таблиці. Якщо значення goEditing = true, то користувач має змогу змінювати вміст комірок, у протилежному випадку – немає.
В основному компонента StringGrid використовується для введення користувачем певних значень, що відображуються у комірках. Властивості Col і Row показують індекси стовпця і рядка виділеної комірки. Компонента StringGrid дає змогу користувачу виділити множину комірок, рядків і стовпців.
Серед подій компоненти StringGrid слід відзначити подію OnSelectCell, що виникає у момент вибору користувачем комірки. В обробник цієї події передаються цілі параметри ACol і ARow – стовпець і рядок виділеної комірки, і булевий параметр CanSelect – допустимість вибору. Параметр CanSelect можна використовувати для заборони виділення комірки, задавши його значення false. Параметри ACol і ARow можуть використовуватися для певної реакції застосування на дії користувача. Наприклад, оператори:
Labell->Caption = "Вибрана комірка " + IntToStr(ARow) + ':' +
IntToStr(ACol) + ". Текст: " +
StringGridl->Cells[ACol][ARow];
виведуть в мітку Label1 повідомлення про рядок, стовпець і текст вибраної комірки (рис. 50).
Рис. 50. Вивід інформації про вибрану комірку
4.2. Створення гри із використанням базових компонент Borland C++ Builder 6. Суть гри полягає в наступному: на формі розміщено поле довільного розміру, на якому в комірках зображено числа «0». Із заданим інтервалом часу (задається рівнем гри) на полі з’являється і зникає число «1». Для перемоги гравець, маючи встановлену кількість спроб, повинен встигнути вибрати комірку із числом «1».
Для реалізації гри використаємо наступні компоненти Borland C++ Builder 6: зображення ігрового поля – StringGrid, таймер – Timer, для кнопки «Старт» – Button, для задання рівня гри – CspinEdit, для виводу допоміжної інформації – компоненти Label та Edit (рис. 51).
Рис. 51. Вигляд форми в режимі проектування
Крок 1. Ініціалізація ігрового поля. Добавимо в обробник події OnActivate форми заповнення StringGrid з іменем sgGameField числами «0». Число «0» неявно буде приведене до типу AnsiString.
void __fastcall TForm1::FormActivate(TObject *Sender)
{
for(int i = 0; i < sgGameField->ColCount; i++)
{
for(int j = 0; j < sgGameField->RowCount; j++)
{
sgGameField->Cells[i][j] = 0;
}
}
}
Крок 2. Добавимо обробник події OnTimer для таймеру. Потрібно розмістити у випадковій комірці ігорового поля число «1», а попереднє число затерти «0». Значення рядка і стовпця поточної комірки, що містить «1» зберігатимемо у глобальних змінних цілого типу posi та posj, а кількість спроб – у глобальній змінні цілого типу iAttempsNumber. Добавимо їх:
int posi, posj;
int iAttempsNumber;
Попереднє значення комірки з числом «1» замінимо на число «0»:
sgGameField->Cells[posi][posj] = 0;
Для вибору випадкової комірки використаємо функцію random(int value), а для ініціалізації випадкових чисел – метод Randomize().
Randomize();
posi = random(sgGameField->ColCount);
posj = random(sgGameField->RowCount);
Заносимо туди число «1»:
sgGameField->Cells[posi][posj] = 1;
Залишок часу відображатиметься в полі Edit з іменем editTime. Зменшимо його на 1:
editTime->Text = editTime->Text - 1;
Крім цього здійснимо перевірку чи закінчився час або спроби: якщо в значенні поля editTime->Text != 0 і iAttempsNumber != 0, то здійснюватимемо вище описані операції щодо вставновлення числа «1» у нову випадкову комірку, інакше зупинемо таймер і виведемо відповідне повідомлення:
Timer1->Enabled = false;
if(editTime->Text == 0)
{
ShowMessage("Час вичерпано :(");
}
else
{
ShowMessage("Спроби вичерпано :(");
}
Остаточно обробник події виглядатиме наступним чином:
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if(editTime->Text != 0 && iAttempsNumber != 0)
{
sgGameField->Cells[posi][posj] = 0 ;
Randomize();
posi = random(sgGameField->ColCount);
posj = random(sgGameField->RowCount);
sgGameField->Cells[posi][posj] = 1;
editTime->Text = editTime->Text - 1;
}
else
{
Timer1->Enabled = false;
if(editTime->Text == 0)
{
ShowMessage("Час вичерпано :(");
}
else
{
ShowMessage("Спроби вичерпано :(");
}
}
}
Крок 3. Добавимо обробник події OnSelectCell для StringGrid. Якщо гравець вибрав комірку, що містить число «1», то зупинемо таймер і виведемо відповідне повідомлення. Крім цього, зменшимо кількість спроб на 1:
if (sgGameField->Cells[ACol][ARow] == 1)
{
Timer1->Enabled = false;
ShowMessage("Вітання! Ви перемогли!");
}
labelAttemps->Caption = --iAttempsNumber;
Добавимо перевірку кількості спроб. Якщо iAttempsNumber != 0, то здійснимо перевірку вибраної комірки, інакше зупинемо таймер і виведемо відповідне повідомлення:
Timer1->Enabled = false;
ShowMessage("Спроби вичерпані :(");
Залишилося додати перевірку чи працює таймер: якщо таймер працює, будемо здійснювати вище описані операції, інакше очікуємо дій користувача. Остаточно код обробника події виглядає наступним чином:
void __fastcall TForm1::sgGameFieldSelectCell(
TObject *Sender, int ACol, int ARow, bool &CanSelect)
{
if (Timer1->Enabled)
{
if(iAttempsNumber != 0)
{
if (sgGameField->Cells[ACol][ARow] == 1)
{
Timer1->Enabled = false;
ShowMessage("Вітання! Ви перемогли! ");
}
Label5->Caption = --iAttempsNumber;
}
else
{
Timer1->Enabled = false;
ShowMessage("Спроби вичерпані :(");
}
}
}
Крок 4. Добавимо обробник події OnClick кнопки «Старт». Потрібно:
- попередню комірку із числом «1» замінити на число «0»:
sgGameField->Cells[posi][posj] = 0;
- задати початкове число спроб і вивести його у відповідний напис (labelAttemps) на формі:
iAttempsNumber = 10;
labelAttemps->Caption = "10";
- задати початковий проміжок часу, вказавши його на формі у полі Edit (в нашому випадку це поле із назвою editTime):
editTime->Text = 60;
- задати інтервал для таймера і включити його. Задамо наступні значення компоненти CSpinEdit1: MinValue = 1, MaxValue = 8. Тепер для кожного рівня гри визначимо інтервал часу для таймера наступним чином:
Timer1->Interval = 800 - (CSpinEdit1->Value - 1) * 100;
Timer1->Enabled = true;
Остаточно код обробника події виглядатиме наступним чином:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
sgGameField->Cells[posi][posj] = 0;
iAttempsNumber = 10;
labelAttemps->Caption = "10";
editTime->Text = 60;
Timer1->Interval = 800 - (CSpinEdit1->Value - 1) * 100;
Timer1->Enabled = true;
}
Крок 5. Додаткові налаштування. Для StringGrid встановимо наступні налаштування: FixedCols = 0, FixedRows = 0, Options->goEditing = false, Options->goRangeSelect = false.
На рис. 52, а зображено вигляд застосування при його старті, на рис. 52, б – вигляд при виборі комірки із числом «1».
а б
Рис. 52. Початковий вигляд застосування (а) та вибір комірки із «1» (б)