Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
IZVP_lab-novi.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
16.14 Mб
Скачать

Завдання для самостійного виконання:

Написати програму з використанням компоненти MediaPlayer для відтворення звуку.

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

  1. Яка різниця між компонентами Animate та MediaPlayer?

  2. Яка властивість компонентами Animate відповідає за відтворення анімації?

  3. Як задати початковий і кінцевий кадри відтворення анімації?

  4. Що відбудеться при відкриті файлу зі звуком у компоненті Animate?

  5. Яке призначення функції FindFirst та її параметрів?

  6. Яке призначення у даній програмі блоку:

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;

}

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