- •Методичні вказівки
- •Лабораторна робота №1
- •Хід роботи
- •Короткі теоретичні відомості
- •Контрольні питання
- •Лабораторна робота №2
- •Короткі теоретичні відомості
- •Котрольні питання
- •Лабораторна робота №3 Тема: Використання масивів
- •Хід роботи
- •Котрольні питання
- •Лабораторна робота №4
- •Хід роботи
- •Котрольні питання
- •Лабораторна робота №5
- •Котрольні питання
- •Лабораторна робота №6 Тема: Розробка мультимедійних програм
- •Хід роботи
- •Завдання для самостійного виконання:
- •Контрольні питання
- •Лабораторна робота №7 Тема: Створення нової компоненти
- •Хід роботи
- •1. Вибір базового класу
- •2. Створення модуля компоненту
- •3. Встановлення компоненту
- •4. Ресурси компоненту
- •5. Установка
- •6. Перевірка компоненти
- •Контрольні питання
- •Лабораторна робота №8 Тема: Створення довідкової системи
- •1. Підготовка довідкової інформації
- •2. Проект довідкової системи
- •2. Використання Microsoft Word
- •3. Використання html Help Workshop
- •4. Створення файлу довідки
- •5. Компіляція
- •6. Вивід довідкової інформації
- •Контрольні питання
- •Лабораторна робота №9 Тема: Створення інсталяційного пакету
- •1. Новий проект
- •2. Структура
- •3. Вибір встановлюваних компонентів
- •4. Конфігурування системи користувача
- •5. Настройка діалогів
- •6. Системні вимоги
- •7. Створення образу установчого диску
- •Котрольні питання
- •Лабораторна робота №10
- •Завдання для самостійної роботи:
- •Короткі теоретичні відомості Компонент tTable
- •Контрольні питання
- •Лабораторна робота №11
- •Хід роботи
- •12. Змінити дану програму так, щоб всі невізуальні компоненти мітились на модулі даних. Короткі теоретичні відомості
- •Модулі даних
- •Контрольні питання
- •Лабораторна робота №12 Тема: Налаштування та робота з базами даних
- •Хід роботи
- •Короткі теоретичні відомості
- •Контрольні питання
- •11. Розмітити на першій формі дві кнопки для перегляду створених звітів. Короткі теоретичні відомості Створення простого звіту
- •Створення звітів "master-detail"
- •Відображення графічних і мемо-полів в звітах
- •Попередній перегляд звітів
- •Котрольні питання
- •Лабораторна робота № 14
- •Хід роботи
- •Короткі теоретичні відомості
- •Контрольні питання
- •Література:
- •Студентами денного відділення спеціальності
- •5.05010301 «Розробка програмного забезпечення»
- •8 2100, Вул.Раневицька, 12, м.Дрогобич Львівської обл.
Завдання для самостійного виконання:
Написати програму з використанням компоненти MediaPlayer для відтворення звуку.
Контрольні питання
Яка різниця між компонентами Animate та MediaPlayer?
Яка властивість компонентами Animate відповідає за відтворення анімації?
Як задати початковий і кінцевий кадри відтворення анімації?
Що відбудеться при відкриті файлу зі звуком у компоненті Animate?
Яке призначення функції FindFirst та її параметрів?
Яке призначення у даній програмі блоку:
try{} catch (Exception &e)
Лабораторна робота №7 Тема: Створення нової компоненти
Мета: Навчитись створювати нові компоненти у C++ Builder.
Завдання: Створити компоненту NkEdit, яка забезпечує введення і редагування цілого або дробового числа. Компонента також повинна контролювати значення, що вводиться, на належність заданому діапазону. Тип числа і межі діапазону повинні задаватися під час розробки форми додатку, що використовує компоненту.
Хід роботи
1. Вибір базового класу
Визначаємо, який з компонентів C++ Builder найбільш близький по своєму призначенню, вигляду і функціональним можливостям до компоненту, який потрібно розробити. І вибраємо його як базовий.
2. Створення модуля компоненту
Перед початком роботи із створення нового компоненту потрібно створити окремий каталог для модуля і інших файлів компоненту. Після цього можна приступити до створення компоненту.
Щоб почати роботу над новим компонентом, треба активізувати процес створення нового додатку (команда File | New | Application), в меню Component вибрати команду New Component і в поля діалогового вікна New Component (рис. 1) ввести інформацію про компонент що створюємо.
Рис. 1. Початок роботи над новим компонентом
В полі Ancestor type треба ввести базовий тип створюваного компоненту: TEdit.
В полі Class Name необхідно ввести ім'я класу компоненту, що розробляється: TNkEdit.
В полі Palette Page потрібно ввести ім'я вкладки палітри компонентів, на яку буде поміщений значок компоненту: Samples
(Якщо в полі Palette Page ввести ім'я ще не існуючої вкладки палітри компонентів, то безпосередній перед додаванням компоненту вкладка з вказаним ім'ям буде створена.)
В полі Unit file name знаходиться автоматично сформоване ім'я файла модуля створюваного компоненту. C++ Builder привласнює модулю компоненту ім'я, яке співпадає з ім'ям типу компоненту, але без букви T. Натиснувши на кнопці з трьома крапками, можна вибрати каталог, в якому повинен бути збережений модуль компоненту.
В результаті натиснення на кнопці ОК буде сформований модуль компоненту, що складається з двох файлів: файлу заголовка (лістинг 1) і файлу реалізації (лістинг 2).
Лістинг 1: Файл NkEdit.h
#ifndef QNKEditH
#define QNKEditH
#include <SysUtils.hpp>
#include <Classes.hpp>
#include <QControls.hpp>
#include <QStdCtrls.hpp>
class PACKAGE TNKEdit : public TEdit
{
private:
protected:
public:
__fastcall TNKEdit(TComponent* Owner);
__published:
};
#endif
Лістинг 6.2. Файл NkEdit.cpp
#include <clx.h>
#pragma hdrstop
#include "QNKEdit.h"
#pragma package(smart_init)
static inline void ValidCtrCheck(TNKEdit *)
{
new TNKEdit(NULL);
}
__fastcall TNKEdit::TNKEdit(TComponent* Owner)
: TEdit(Owner)
{
}
namespace Qnkedit
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(TNKEdit)};
RegisterComponents("Samples", classes, 0);
}
}
У файлі заголовка NkEdit.h знаходиться оголошення нового класу. У файл реалізації NkEdit.cpp поміщена функція Register, яка забезпечує реєстрацію, установку значка компоненту на вказану вкладку палітри компонентів.
В сформований C++ Builder шаблон компоненту потрібно внести доповнення: оголосити поля даних, функції доступу до полів даних, властивості і методи. Якщо на деякі події компонент повинен реагувати не так, як базовий, то в оголошення класу потрібно помістити оголошення відповідних функцій обробки подій.
В лістингах 3 і 4 приведені файли заголовка і реалізації компоненту NkEdit після внесення всіх необхідних змін.
Лістинг 3. NKEdit.h
class PACKAGE TNKEdit : public TEdit
{
private:
bool FEnableFloat; // дозволено введення дробового числа
float FMin; // нижня межа
float FMax; // верхня межа
/* функція SetNumb використовується для зміни вмісту
поля редагування */
void __fastcall SetNumb (float n);
/*Функція CetNumb використовується для доступу до поля редагування */
float __fastcall GetNumb (void);
/*ці функції забезпечують зміну меж діапазону
допустимих значень */
bool __fastcall SetMin (float min) ;
bool __fastcall SetMax(float max);
protected:
public:
__fastcall TNKEdit(TComponent* Owner); // конструктор
/* Властивість Numb повинна бути доступна тільки в час роботи програми. Тому вона оголошена в секції public. Якщо треба, щоб властивість була доступна під час розробки форми і її значення можна було задати у вікні Object Inspector, то оголошення потрібно помістити в секцію published */
__property float Numb = {read= GetNumb}; //, write = SetNumb);
// Функція обробки події KeyPress
DYNAMIC void __fastcall KeyPress (char ikey) ;
// оголошені тут властивості доступні в Object Inspector
__published:
__property bool EnableFloat = { read = FEnableFloat, write = FEnableFloat };
__property float Min = {read = FMin, write = SetMin };
__property float Max = {read = FMax, write = SetMax } ;
};
#endif
Лістинг 4. NKEdit.cpp
#include <clx.h>
#pragma hdrstop
#include "QNKEdit.h"
#pragma package(smart_init)
//-------------------------------------------------------------------------
static inline void ValidCtrCheck(TNKEdit *)
{
new TNKEdit(NULL);
}
//-------------------------------------------------------------------------
__fastcall TNKEdit::TNKEdit(TComponent* Owner)
: TEdit(Owner)
{
// конструктор має прямий доступ до полів компоненту
Text = "0";
FMin = 0;
FMax = 100;
FEnableFloat = true;
}
//-------------------------------------------------------------------------
namespace Qnkedit
{
void __fastcall PACKAGE Register()
{ TComponentClass classes[1] = {__classid(TNKEdit)};
RegisterComponents("Samples", classes, 0);
}
}
void __fastcall TNKEdit::SetNumb (float n)
{
Text = FloatToStr (n) ;
}
// повертає значення, відповідне рядку яка знаходиться в полі редагування
float __fastcall TNKEdit::GetNumb (void)
{
if ( Text.Length ())
return StrToFloat (Text) ;
else return 0;
}
// функція обробки події KeyPress в полі компоненту NkEdit
void __fastcall TNKEdit::KeyPress (char Key)
{
// Коди заборонених клавіш замінимо нулем, внаслідок чого // ці символи в полі редагування не з'являться
switch (Key) {
case '0' :
case '1' :
case '2' :
case '3' :
case '4' :
case '5' :
case '6' :
case '7' :
case '8' :
case '9' : break;
case '.' :
case ',' :
Key = DecimalSeparator;
//if ((!FEnableFloat)||(Text.Pos(DecimalSeparator)))
Key = 0 ; break;
case '-' : // знак "мінус"
if (Text.Length() || (FMin >= 0))
// мінус вже введений або fMin >= 0
Key = 0;
break;
case VK_BACK: // клавіша <Backspace>
break;
default : // решта символів заборонена
Key = 0;
}
if ((Key>='0') && (Key <= '9')) {
/* Перевіримо, чи не приведе введення чергової цифри до виходу числа за межі діапазону. Якщо так, то замінимо введене число на максимальне або мінімальне*/
AnsiString st = Text + Key;
if (StrToFloat(st) < FMin) { Key = 0; Text = FloatToStr(FMin);
}
if (StrToFloat (st) > FMax) { Key = 0; Text = FloatToStr(FMax); }
}
// викликати функцію обробки події Keypress базового класу
TEdit:: KeyPress (Key);
}
// встановлює значення поля FMin
bool __fastcall TNKEdit::SetMin (float min)
{
if (min > FMax) return false;
FMin = min; return true;
}
// встановлює значення поля FMin
bool _fastcall TNKEdit:: SetMax(float max)
{
if ( max < FMin) return false;
FMax = max; return true;
}
