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

Завдання для лабораторної роботи

  1. Створити віконний проект. Додати головне та контекстне меню, необхідні системні діалоги.

  2. Реалізувати текстовий редактор і переглядач графічних файлів.

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

  1. Пояснити чим відрізняються візуальні компоненти від невізуальних.

  2. Які системні діалоги представлені у Borland C++ Builder 6?

  3. Яким методом здійснюється виклик системного діалогу?

  4. Для чого призначена властивість Filter?

  5. Чи здійснює друк компонента PrintDialog?

  6. Чи здійснюють пошук та заміну компоненти FindDialog і ReplaceDialog?

  7. Пояснити призначення компоненти Timer.

  8. Як запустити/зупинити таймер?

  9. Продемонструвати використання компонент MainMenu та PopupMenu.

  10. В якій властивості компонент MainMenu та PopupMenu зберігаються елементи меню?

  11. Як приєднати головне меню до форми?

  12. Як приєднати контекстне меню до компоненти?

  13. Продемонструйте роботу з конструктором меню для компоненти MainMenu.

  14. Скільки компонент 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» (б)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]