Реферат по предмету "Информатика, программирование"


Построение компоненты в Builder C++

Содержание
Задание на курсовую работу
Введение
1 Разработка компоненты
2 Задание начальных условий
3 Задание свойств
4 Переопределённые методыбазового класса
5 Переопределениеметода CreateWnd()
6 Переопределениеметода Paint()
7 Переопределениеметода WndProc(TMessage& Message)
8 Переопределение метода CanResize(int&NewWidth, int &NewHeight)
9 Создание событий
10 Тестирование компоненты
11 Регистрациякомпоненты
12 Инсталляция компоненты
13 Проверка готовой компоненты
Список используемой литературы
 

/>Задание на курсовую работу
 
Разработатькомпоненту, состоящую из двух окружностей, одна из которых движется попериметру другой. Создать установочный пакет и тестовое приложение сиспользованием разработанного компонента.
 
/>
 

/>Введение
C++Builder представляет собой приложение, главное окно которого содержитнастраиваемую инструментальную панель и палитру компонентов. Помимо этого, поумолчанию при запуске C++ Builder появляются окно инспектора объектов и форманового приложения. Под окном формы приложения находится окно редактора кода.
Формыявляются основой приложений C++ Builder. Создание пользовательского интерфейсаприложения заключается в добавлении в окно формы элементов объектов C++Builder, называемых компонентами. Компоненты C++ Builder располагаются напалитре компонентов, выполненной в виде многостраничного блокнота. Важнаяособенность C++ Builder состоит в том, что он позволяет создавать собственныекомпоненты и настраивать палитру компонентов, а также создавать различныеверсии палитры компонентов для разных проектов.
/>Компоненты разделяются на видимые (визуальные) и невидимые (невизуальные).Визуальные компоненты появляются во время выполнения точно так же, как и вовремя проектирования. Примерами являются кнопки и редактируемые поля.Невизуальные компоненты появляются во время проектирования как пиктограммы наформе. Они никогда не видны во время выполнения, но обладают определеннойфункциональностью (например, обеспечивают доступ к данным, вызывают стандартныедиалоги Windows и др.)
Длядобавления компонента в форму можно выбрать мышью нужный компонент в палитре ищелкнуть левой клавишей мыши в нужном месте проектируемой формы. Компонентпоявится на форме, и далее его можно перемещать, менять размеры и другиехарактеристики.
Каждыйкомпонент C++ Builder имеет три разновидности характеристик: свойства, событияи методы.
Есливыбрать компонент из палитры и добавить его к форме, инспектор объектовавтоматически покажет свойства и события, которые могут быть использованы сэтим компонентом. В верхней части инспектора объектов имеется выпадающийсписок, позволяющий выбирать нужный объект из имеющихся на форме.
 

/>1 Разработка компоненты
 
Процессразработки компоненты TOsnova проходит через выполнение следующих этапов:
1. Созданиемодуля для новой компоненты.
2.Наследование производного класса от существующего базового компонентногокласса.
3. Добавлениенужных свойств, событий и методов.
4.Регистрация компоненты в C++Builder.
Для созданиянового компонента необходимо начать новый проект. Но сначала необходимо решить,от какого базового класса будет порождён наш компонент.
Мне видится,что наиболее правильным решением будет выбор в качестве базового классTCustomControl. TCustomControl был выбран потому, что для полноценной работы нашейкомпоненте необходимы свойства Handle (дескриптор окна для получения сообщенийтаймера) и Canvas (холст для вывода текста). TCustomControl имеет оба свойства,за счет чего он, по сути, является идеальным выбором базового класса.
Также нампонадобится создать класс TMarshrut для рисования маршрута движения шарика и классТShar, рисующий сам шарик. Оба этих класса должны лишь уметь рисовать себя,поэтому в качестве базового класса выбираем TCustomGraphic.
Теперь можноприступать к созданию компоненты. Открываем вкладку Component и выбираем New Component. В появившемся окневыбираем базовый класс (Ancestor type) — TCustomControl, вводимимя своего класса (Class Name) — TOsnova, выбираем вкладкупалитры компонентов, на которую компонента будет установлена (Palette page) -Samples, и путь, где будутхранится файлы компоненты. После щелчка на кнопке ОК C++ Builder создаст для нашейкомпоненты новый модуль и сохранит его в указанном месте.
/>
Аналогичнымобразом создаём два класса TMarshrut и ТShar. Для совместной работы трёх классовнеобходимо подключить h-файлы с помощью директивы #include.
Теперьрассмотрим созданные нами классы. TMarshrut и ТShar должны уметь рисовать себя,поэтому в них достаточно переопределить виртуальный метод базового класса Paint():
virtual void __fastcall Paint();
Переопределенныйметод Paint() этих классов должен включать в себя код их рисования. Ниже показанисходный код метода Paint() класса ТShar:
void__fastcall TShar::Paint()
{
Canvas->Brush->Color=clGreen;
Shar->Width=(D-d)/2;
Shar->Height=(D-d)/2;
Canvas->Ellipse(0,0,Shar->Width,Shar->Height);
}
Исходный кодметода Paint() класса TMarshrut
//---------------------------------------------------------------------------
// рисуем двеокружности заданного цвета
void __fastcall TMarshrut::Paint()
{
Canvas->Brush->Color=clRed;
Marshrut->Ris_Marshrut(D/2);
Canvas->Brush->Color=clBtnFace;
Marshrut->Ris_Marshrut(d/2);
}
//---------------------------------------------------------------------------
Реализацияфункции Ris_Marshrut(int R) (прототип находится в секции protected класса ТMarshrut):
//---------------------------------------------------------------------------
//рисуемокружность заданного радиуса
void__fastcall TMarshrut::Ris_Marshrut(int R)
{
Marshrut->Canvas->Ellipse(Marshrut->Width/2-R,Marshrut->Height/2-R,
Marshrut->Width/2+R,Marshrut->Height/2+R);
}
//---------------------------------------------------------------------------
Так какникаких действий (перемещение, изменение размеров и т.д.) не планируется,маршрут движения рисуется методом Paint() при помощи функции Ris_Marshrut (int R). В противном случаелучше создать два экземпляра класса
ТMarshrut.
2 Задание начальных условий
 
Начальные значениязадаются в конструкторе класса TOsnova.
__fastcallTOsnova::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 intSkorosty = { read=FSkorosty, write=SetSkorosty },
после чегоэто свойство отобразится в окне Инспектора Объектов.
/>
Свойство Skorosty имеет прямой доступ кполю чтения, а для записи имеется метод SetSkorosty
//---------------------------------------------------------------------------
void__fastcall TOsnova::SetSkorosty(int Skorosty)
{
FSkorosty=Skorosty;
if(FSkorosty
SetTimer(Handle,1, FSkorosty, 0);
}
//---------------------------------------------------------------------------
4 Переопределённыеметодыбазовогокласса
Переопределённые методыбазового класса объявлены в секции protected.
5 Переопределение метода CreateWnd().
При работекомпоненты необходимо динамически создать экземпляры классов TMarshrut и ТShar. Хотелось бысделать это непосредственно в конструкторе класса TOsnova, но попытка запускаокончится генерированием исключения времени выполнения:
Control has no parentwindow (Управляющий элемент не имеет родительского окна). Решение состоит впереопределении метода CreateWnd().
//---------------------------------------------------------------------------
void __fastcall TOsnova::CreateWnd()
{
if(ComponentState.Contains(csDestroying))
return; //если компонентаразрушается — выход
TCustomControl::CreateWnd(); //базовый метод
Marshrut=newTMarshrut(this); //создаём экземпляр класса
Marshrut->Parent=this;
Marshrut->Width=this->Width;
Marshrut->Height=this->Height;
Shar=newTShar(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() для перерисовки компоненты, иприсваиваются новые координаты шарику.
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), для того, чтобыкомпонента рисовалась в приложении с новыми размерами.
 
9 Создание событий
 
Наиболеепростая форма события — это событие, просто уведомляющее о том, что онопроизошло. Например, событие OnClick, которое присутствует в большинствевизуальных компонентов, имеет только один параметр — Sender:
voidfastcall TForml::FormClick(TObject *Sender).
Этот типсобытия определяется в VCL как TNotifyEvent.
При созданиисобытия, обеспечивающего простое уведомление, можно
воспользоватьсятипом события TNotifyEvent. OnMyClick, событие TOsnova — простое событиеуведомления. Оно объявляется следующим образом:
__property TNotifyEvent OnMyClick = {read=FOnMyClick, write=FOnMyClick};
Каждоесобытие должно иметь виртуальный метод, который используется внутри компоненты,чтобы сообщить ей о своем возникновении. Такие методы объявляются виртуальными(чтобы классы-наследники могли получить к ним доступ) и в защищенном разделе.
Виртуальныйметод, сообщающий о возникновении события OnMyClick, называется DoOnMyClick():
//---------------------------------------------------------------------------
void__fastcall TOsnova::DoOnMyClick()
{
if(FOnMyClick)
FOnMyClick(this);
}
//---------------------------------------------------------------------------
Сначалапроверяется, был ли событию назначен обработчик. Если обработчик события былназначен, то вызывается функция, указатель на которую расположен в поле FOnMyClick, куда передается вкачестве параметра указатель на компонент (this). Это событие будет отражено навкладке Events в окне Инспектора Объектов.
/>
При двойномклике Builder сгенерирует следующий код:
//---------------------------------------------------------------------------
void__fastcall TForm1::Osnova1MyClick(TObject *Sender)
{
//кодобработчика события
}
//---------------------------------------------------------------------------

10 Тестирование компоненты
 
Для тестированиякомпоненты начнём новый проект (File®New®Application).
Добавим к проекту (Project®Add to Project) файлы Osnova.cpp, Marshrut.cpp и Shar.cpp. В конструкторе формы создадим объект нашегокласса
//---------------------------------------------------------------------------
__fastcallTForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
TOsnva*Osnova;
Osnova=newTOsnova(this);
Osnova->Parent=this;
}
//---------------------------------------------------------------------------
Теперь все изменения вкомпоненте мы сразу сможем увидеть при запуске этого проекта.
11 Регистрация компоненты
 
Компонентарегистрируется функцией Register(), которая автоматически генерируется C++Builder. Ключевое слово namespace устанавливает локальность имён даннойпроцедуры регистрации. После этого ключевого слова следует имя файла,содержащего компоненту. В процедуре регистрации Register первый операторсоздаёт массив регистрируемых компонентов classes типа TComponentClass и заносит его врегистрируемую компоненту. Следующий оператор регистрирует функцией RegisterComponents компоненты, занесённые вclasses (второй параметрфункции) на странице Samples (второй параметр).
//---------------------------------------------------------------------------
namespaceOsnova
{
void__fastcall PACKAGE Register()
{
TComponentClassclasses[1] = {__classid(TOsnova)};
RegisterComponents(«Samples»,classes, 0);
}
}
//---------------------------------------------------------------------------
 
12 Инсталляция компоненты
 
Дляинсталляции компоненты выбираем меню Component, Install Component.
/>
В появившемсяокне выбираем вкладку Into new package (в новый пакет), вводимимя пакета (APPKOsnova) и нажимаем ОК. Появляется окошко с предложением инсталлироватьпакет.
/>
Отвечаем No, так как наш пакетполностью ещё не собран — в него не включены классы TMarshrut и ТShar. В окнеДиспетчера Пакетов (Package Manager) выбираем Add, Add Unit и добавляем файлы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. Теллес М. « Borland C++ Builder. Библиотека программиста(1998)»
4. Ч. Калверт, К. Рейсдорф «Borland C++ Builder».


Не сдавайте скачаную работу преподавателю!
Данный реферат Вы можете использовать для подготовки курсовых проектов.

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

Пишем реферат самостоятельно:
! Как писать рефераты
Практические рекомендации по написанию студенческих рефератов.
! План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом.
! Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач.
! Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты.
! Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ.

Читайте также:
Виды рефератов Какими бывают рефераты по своему назначению и структуре.

Сейчас смотрят :

Реферат Хищения в российском уголовном праве 2
Реферат Профессиональное самоопределение старшеклассников
Реферат Анпилов Виктор Иванович
Реферат А. О. Аредарук створення психологічних умов для збереження здоров’я молоді в процесі навчання в загальноосвітніх та спеціальних закладах
Реферат Право на необходимую оборону
Реферат Определение координат оптимального расположения двух складов в регионе
Реферат Интернет телефония
Реферат Администрация анастасьевского сельского поселения шегарского района томской области
Реферат Искандер-кульская экспедиция
Реферат Классификации исторических источников в отечественной историографии
Реферат Ammar Textile Essay Research Paper ACKNOWLEDGMENTWe bow
Реферат Геологическая характеристика процесса оползней
Реферат Причины и условия преступного поведения
Реферат Ананда
Реферат Сократ о жизни, смерти и бессмертии