Удаление таймера осуществляется в деструкторе компоненты:
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() для перерисовки компоненты, и присваиваются новые координаты шарику.
8 Переопределениеметода CanResize(int &NewWidth, int &NewHeight).
Если пользователь изменит размеры компоненты в режиме разработки, пропорционально должны измениться размеры всех объектов, из которых состоит компонента.
//---------------------------------------------------------------------------
bool __fastcall TOsnova::CanResize(int &NewWidth, int &NewHeight)
{//изменяем
if (ComponentState.Contains(csDesigning))
{
D=this->Width/5*4; // диаметрыокружностей
d=this->Width/5*3;
Marshrut->Width=this->Width; //размерыэкз. классаТMarshrut
Marshrut->Height=this->Height;
Shar->Width=(D-d)/2; //размерыэкз. классаТShar
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(); //перерисовываемкомпоненту
}
if (NewWidth!=NewHeight) NewWidth=NewHeight;
return(NewWidth, NewHeight);
}
//---------------------------------------------------------------------------
Метод CanResize() возвращает новые значения ширины (NewWidth) и высоты (NewHeight), которые затем будут переданы методу WndProc(TMessage& Message), для того, чтобы компонента рисовалась в приложении с новыми размерами.
Наиболее простая форма события — это событие, просто уведомляющее о том, что оно произошло. Например, событие OnClick, которое присутствует в большинстве визуальных компонентов, имеет только один параметр — Sender:
void fastcall TForml::FormClick(TObject *Sender).
Этот тип события определяется в VCL как TNotifyEvent.
При создании события, обеспечивающего простое уведомление, можно
воспользоваться типом события TNotifyEvent. OnMyClick, событие TOsnova — простое событие уведомления. Оно объявляется следующим образом:
__propertyTNotifyEventOnMyClick = {read=FOnMyClick, write=FOnMyClick};
Каждое событие должно иметь виртуальный метод, который используется внутри компоненты, чтобы сообщить ей о своем возникновении. Такие методы объявляются виртуальными (чтобы классы-наследники могли получить к ним доступ) и в защищенном разделе.
Виртуальный метод, сообщающий о возникновении события OnMyClick, называется DoOnMyClick():
//---------------------------------------------------------------------------
void __fastcall TOsnova::DoOnMyClick()
{
if (FOnMyClick)
FOnMyClick(this);
}
//---------------------------------------------------------------------------
Сначала проверяется, был ли событию назначен обработчик. Если обработчик события был назначен, то вызывается функция, указатель на которую расположен в поле FOnMyClick, куда передается в качестве параметра указатель на компонент (this). Это событие будет отражено на вкладке Events в окне Инспектора Объектов.
При двойном клике Builder сгенерирует следующий код:
//---------------------------------------------------------------------------
void __fastcall TForm1::Osnova1MyClick(TObject *Sender)
{
//код обработчика события
}
//---------------------------------------------------------------------------
Для тестирования компоненты начнём новый проект (File®New®Application).
Добавим к проекту (Project®AddtoProject) файлы Osnova.cpp, Marshrut.cpp и Shar.cpp. В конструкторе формы создадим объект нашего класса
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
TOsnva *Osnova;
Osnova=new TOsnova(this);
Osnova->Parent=this;
}
//---------------------------------------------------------------------------
Теперь все изменения в компоненте мы сразу сможем увидеть при запуске этого проекта.
Компонента регистрируется функцией Register(), которая автоматически генерируется C++ Builder. Ключевое слово namespace устанавливает локальность имён данной процедуры регистрации. После этого ключевого слова следует имя файла, содержащего компоненту. В процедуре регистрации Register первый оператор создаёт массив регистрируемых компонентов classes типа TComponentClass и заносит его в регистрируемую компоненту. Следующий оператор регистрирует функцией RegisterComponents компоненты, занесённые в classes (второй параметр функции) на странице Samples (второй параметр).
//---------------------------------------------------------------------------
namespace Osnova
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(TOsnova)};
RegisterComponents("Samples", classes, 0);
}
}
//---------------------------------------------------------------------------
Для инсталляции компоненты выбираем меню Component, InstallComponent.
В появившемся окне выбираем вкладку Intonewpackage (в новый пакет), вводим имя пакета (APPKOsnova) и нажимаем ОК. Появляется окошко с предложением инсталлировать пакет.
Отвечаем No, так как наш пакет полностью ещё не собран - в него не включены классы TMarshrut и ТShar. В окне Диспетчера Пакетов (PackageManager) выбираем Add, AddUnit и добавляем файлы Marshrut.cpp и Shar.cpp
После компиляции можно инсталлировать нашу компоненту.
Деинсталлировать компоненту можно, выбрав вкладку Project-> Options->Remove.
13 Проверка готовой компоненты
Для проверки работоспособности компоненты начнём новый проект (File®New®Application).
Выбираем на палитре компонентов вкладку Samples и переносим нашу компоненту на форму.
Потянув за рамку, мы можем менять размеры компоненты
Добавим на форму две кнопки и в обработчике события OnClickнапишем код
//---------------------------------------------------------------------------
void __fastcall TForm1::Scororty_plusClick(TObject *Sender)
{
Form1->Osnova1->Skorosty-=5;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Scororty_minusClick(TObject *Sender)
{
Form1->Osnova1->Skorosty+=5;
}
//---------------------------------------------------------------------------
изапустимпроект. При каждом нажатии на кнопку Scororty_plusскорость вращения будет увеличиваться, а при нажатии на кнопку Scororty_minus-уменьшаться.
Список используемой литературы
1. А.Я. Архангельский «Программирование в С++ Builder 6».
2. К.Рейсдорф, К.Хендерсон «Borland C++ Builder. Освой самостоятельно
за 21 день».
3.Теллес М. « BorlandC++ Builder. Библиотека программиста(1998)»
4. Ч. Калверт, К. Рейсдорф «BorlandC++ Builder».