2 Задание начальных условий

 

Начальные значения задаются в конструкторе класса TOsnova.

__fastcall TOsnova::TOsnova(TComponent* Owner)

: TCustomControl(Owner)

{

Width=200;//начальная ширина

Height=200;//начальная высота

D=this->Width/5*4;//диаметр большой окружности

d=this->Width/5*3; //диаметр маленькой окружности

a=0;//угол поворота

N=true;//для однократного захода в цикл

FSkorosty=20;//скорость вращения

}

Начальные значения для экземпляров классов TMarshrut и ТShar задаются при их создании в функции void __fastcall CreateWnd().

3 Задание свойств

В процессе работы желательно иметь возможность изменять скорость вращения шарика, поэтому добавим свойство FSkorosty. Тип этого свойства int. Изменение местоположения шарика будет происходить по сигналу таймера, поэтому, увеличивая или уменьшая значение интервала, можно менять скорость. Член данных FSkorosty размещён в секции private. Теперь надо объявить свойство - метод чтения и записи (в секции __published)

__property int Skorosty = { read=FSkorosty, write=SetSkorosty },

после чего это свойство отобразится в окне Инспектора Объектов.

Свойство Skorosty имеет прямой доступ к полю чтения, а для записи имеется метод SetSkorosty

//---------------------------------------------------------------------------

void __fastcall TOsnova::SetSkorosty(int Skorosty)

{

FSkorosty=Skorosty;

if (FSkorosty<5) FSkorosty=5; // если FSkorosty=0, шарик остановится

SetTimer(Handle, 1, FSkorosty, 0);

}

//---------------------------------------------------------------------------

4 Переопределённые методы базового класса

Переопределённые методы базового класса объявлены в секции protected.

5 Переопределение метода CreateWnd().

При работе компоненты необходимо динамически создать экземпляры классов TMarshrut и ТShar. Хотелось бы сделать это непосредственно в конструкторе класса TOsnova, но попытка запуска окончится генерированием исключения времени выполнения:

Control has no parent window (Управляющий элемент не имеет родительского окна). Решение состоит в переопределении метода CreateWnd().

//---------------------------------------------------------------------------

void __fastcall TOsnova::CreateWnd()

{

if (ComponentState.Contains(csDestroying))

return; //если компонента разрушается - выход

TCustomControl::CreateWnd(); //базовый метод

Marshrut=new TMarshrut(this); //создаём экземпляр класса

Marshrut->Parent=this;

Marshrut->Width=this->Width;

Marshrut->Height=this->Height;

Shar=new TShar(this); //создаём экземпляр класса

Shar->Parent=this;

Shar->Width=(D-d)/2;

Shar->Height=(D-d)/2;

Shar->Left=(this->Width-D)/2+D-Shar->Width;

Shar->Top=this->Height/2-Shar->Height/2;

if (ComponentState.Contains(csDesigning))

return; //если компонента разрабатывается - выход

else; //иначе запускаем таймер

SetTimer(Handle, 1, FSkorosty, 0);

}

//---------------------------------------------------------------------------

Сначала вызывается функция CreateWnd() базового класса, которая вернёт дескриптор окна. После этого мы можем создать экземпляры наших классов, а также функцией SetTimer() создать таймер.

6 Переопределение метода Paint()

//---------------------------------------------------------------------------

void __fastcall TOsnova::Paint()

{

this->Canvas->Brush->Color=clSkyBlue;

this->Canvas->Font->Size=this->Height/20;

this->Canvas->TextOutA(this->Width/4,3,"Моя компонента");

}

//---------------------------------------------------------------------------

С помощью метода Paint() выведем текст на компоненту.

7 Переопределение метода WndProc(TMessage& Message)

 

Каждый компонент, имеющий свой собственный дескриптор окна, имеет и виртуальный метод по имени WndProc(). Этот метод вызывается каждый раз, когда Windows или VCL посылает сообщение окну компонента.

Прежде чем начать описание применения метода WndProc(), сосредоточимся на использовании таймера в компоненте. Таймер запускается в методе CreateWnd():

SetTimer (Handle, 1, FSkorosty, 0). В эту функцию в качестве параметров передаются дескриптор окна компонента, 1 - как идентификатор таймера, FSkorosty - как интервал таймера) и 0 в качестве значения последнего параметра, который используется только в случае, если вы применяете функцию обратного вызова таймера. В этом примере сообщается, что Windows следует посылать сообщение WM_TIMER моей оконной процедуре окна.

Удаление таймера осуществляется в деструкторе компоненты:

KillTimer (Handle, 1) ;

Внутри этого метода выполняется соответствующая обработка сообщения

WM_TIMER:

//---------------------------------------------------------------------------

void __fastcall TOsnova::WndProc(TMessage& Message)

{

TCustomControl::WndProc(Message); //базовый метод

if (Message.Msg == WM_TIMER)

{

//проверяем, изменились ли размеры

if ((N==true)&&( this->Width!=NewWidth)&&(this->Height!=NewHeight))

{

this->Width=NewWidth;

this->Height=NewHeight;

D=this->Width/5*4;

d=this->Width/5*3;

Marshrut->Width=this->Width;

Marshrut->Height=this->Height

Shar->Width=(D-d)/2;

Shar->Height=(D-d)/2;

Shar->Left=(this->Width-D)/2+D-Shar->Width;

Shar->Top=this->Height/2-Shar->Height/2;

this->Canvas->Font->Size=this->Height/20;

this->Canvas->TextOutA(this->Width/4,3,"Моя компонента");

this->Invalidate();//перерисовываем компоненту

N=false;//больше сюда не заходим

}

a+=0.2;//увеличиваем значение угла поворота (процесс движения)

Shar->Left=(Marshrut->Width-(D-(D-d)/2))/2+(D-(D-d)/2)/2+(D-(D-d)/2)/2*cos(a)-

Shar->Width/2;

Shar->Top=(Marshrut->Height-(D-(D-d)/2))/2+(D-(D-d)/2)/2-(D-(D-d)/2)/2*sin(a)-

Shar->Height/2;

}

}

//---------------------------------------------------------------------------

Сначала вызывается метод базового класса TCustomControl::WndProc(Message), затем устанавливаются новые размеры (если они были изменены), вызывается функция Invalidate() для перерисовки компоненты, и присваиваются новые координаты шарику.


Информация о работе «Построение компоненты в Builder C++»
Раздел: Информатика, программирование
Количество знаков с пробелами: 18584
Количество таблиц: 0
Количество изображений: 10

Похожие работы

Скачать
5563
0
0

... Timer (Таймер) с изображением циферблата часов со стрелками, а затем по самой форме в любой ее рабочей части. Этот компонент во время работы приложения является невидимым. А вот во время построения проекта приложения таймер виден на форме, и поэтому программисту удобно в любое время быстро обратиться к его свойствам или к функции обработки Timer1Timer события OnTimer (Таймер включен). На форме ...

Скачать
133555
12
12

... регламентирует информационные связи и предопределяет состав и содержание всей системы информационного отображения. Применительно к системы «ОБМЕННЫЙ ПУНКТ», входящего в состав автоматизированной банковской системы, первоочередной задачей при его разработке является организация внутримашинной информационной базы (ВИБ), которая представляет собой совокупность специальным образом организованных ...

Скачать
200759
5
11

... доступа с записью равной байту. Такие файлы называются двоичными. Файлы прямого доступа незаменимы при написании программ, которые должны работать с большими объемами информации, хранящимися на внешних устройствах. В основе обработке СУБД лежат файлы прямого доступа.  Кратко изложим основные положения работы с файлами прямого доступа. 1). Каждая запись в файле прямого доступа имеет свой номер ...

Скачать
19597
2
0

... , которая необходима для работы с ним. Все внутренние механизмы, о которых пользователю не нужно знать, скрыты от взгляда. Все это входит в концепцию объектно-ориентированного программирования. Программы C++Builder являются объектно-ориентированными по причине интенсивного использования объектов. После того, как объект (ваш собственный или встроенный в C++Builder) создан, он может использоваться в ...

0 комментариев


Наверх