рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

Иначе это уже запущеная программа

Иначе это уже запущеная программа - раздел Изобретательство, Разработка собственных компонентов //получить Время Decodectime( Time, H, M, S); //получить Пре...

//Получить время
DecodeCTime( Time, H, M, S);
//Получить предыдущее время.
DecodeCTime( PrevTime, Hp, Mp, Sp);

//Сгенерировать событие OnSecond
if Assigned( FOnSecond) then FOnSecond(Self);
//Сгенерировать событие OnMinute
if Assigned( FOnMinute) AND (Mp < M) then FOnMinute(Self);
//Сгенерировать событие OnHour
if Assigned( FOnHour) AND (Hp < H) then FOnHour(Self);


 

 

//Сохранить текущее время в PrevTime
PrevTime := Time;

if ( NOT ShowSecondArrow) AND (Sp <= S) then exit;

 

//Прорисовать часы. DrawArrows; end;

Процедура DrawArrows напичкана математикой и она сейчас не имеет для нас особого значения. Немного ниже я приведу её в полном исходнике, а сейчас я рассказываю о том, как создавать компоненты, поэтому мы рассмотрим события генерируемые в функции TickerCall и узнаем, как они генерируются.

У нас уже объявлено три события в разделе privateкомпонента:

FOnSecond, FOnMinute, FOnHour: TNotifyEvent;

Все они появятся на закладке Events окна объектного инспектора, когда ты поставишь компонент на форму. Чтобы приложения могло поймать эти события, мы объявили переменные типа TNotifyEvent (это тип означает события).

Но всё это пока что переменные, а как же Delphi узнает, что это события, которые надо поместить на закладку Events объектного инспектора? Для этого, в разделе published мы должны описать само событие OnSecond и другие:

property OnSecond: TNotifyEvent read FOnSecond write FOnSecond; property OnMinute: TNotifyEvent read FOnMinute write FOnMinute; property OnHour: TNotifyEvent read FOnHour write FOnHour;

Вначале каждой строки стоит ключевое слово property, которое говорит о том, что мы объявляем свойство. После этого идёт имя свойства и после двоеточия стоит тип. Вот как раз по типу, Delphi и узнает, что объявленное свойство на самом деле событие.

После этого идёт ключевое слово read, за которым должна идти переменная или функция, которая будет использоваться при чтении события. У меня после этого ключевого слова стоит имя переменной, соответствующей событию. После ключевого слова writeнужно ставить переменную или функцию, которая будет использоваться для записи в событие. Тут опять стоит соответствующая переменная.

Для генерации события мы пишем следующий код:

FOnSecond(Self) для события OnSecond.

FOnMinute(Self) для события OnMinute.

FOnHour(Self) для события OnHour.

При генерации события в качестве переменной передаётся Self. Эта переменная всегда указывает на объект, в котором мы сейчас находимся, в данном случае компонент TGraphicClock. Вспомни любой обработчик события. В любом из них есть как минимум один параметр – переменная Sender, которая указывает на объект, который сгенерировал событие. Теперь посмотри на код, которым мы генерируем событие. Как видишь, мы при генерации указываем объект Self, который генерирует событие и пользователь получит его в переменной Sender обработчика события.

Но нельзя вслепую генерировать событие. Прежде чем это делать, нужно проверить, есть ли обработчик события. Для этого нужно вызвать функцию Assigned и в качестве параметра указать тип события. Получается, что следующий код проверяет, установлен ли обработчик события OnSecond, и если да, то генерирует событие:

if Assigned( FOnSecond) then FOnSecond(Self);

Теперь наш компонент сможет генерировать события.

С событиями вроде всё ясно (если нет, то посмотри на исходник на диске и попробуй разобраться, глядя на общую картину). Теперь переходим к свойствам. В разделе publishedмы можем создавать свойства, которые будут отображаться в объектном инспекторе при выделении наших часиков. Все свойства, которые есть у предка нужно просто описать

published property Align; property Enabled; property ParentShowHint; property ShowHint; property Visible;

Все эти свойства мы получаем от предков TGraphicControl, TControl и так далее. Слово propertyговорит о том, что мы описываем свойство. Для них не нужны процедуры или функции, потому что эти свойства уже есть у предка. Нам надо только описать их и всё. Я описал только маленькую часть из доступных у TGraphicControl функций. Ты можешь добавить любые из доступных. Чтобы узнать, какие функции можно добавлять, открой помощь (меню Help->Delphi Help) и найди там объект TGraphicControl. Щёлкни по нему дважды и в появившейся справке выбери пункт Properties (вверху окна). Появится окно с перечнем всех свойств. Ты можешь добавить любое из них. Например, чтобы добавить свойство Action нужно написать в разделе published:

published property Action;

Чтобы добавить новое свойство, которое не существует у предков, нужно немного попотеть. Например. Добавим возможность, чтобы пользователь мог менять картинку фона. Для этого описываем в разделе publishedсвойство BGBitmap:

property BGBitmap:TBitmap read FBGBitmap write SetBGBitmap;

Подобную строку ты видел при описания события, только там свойство имело тип события, а здесь это картинка типа TBatmap, так что Delphi воспримет эту запись, как свойство.

Для чтения свойства BGBitmap я поставил переменную FBGBitmap. Это тоже картинка, и когда мы будем обращаться к свойству с целью прочитать картинку, то она будет просто копироваться из переменной FBGBitmap.

Для записи используется процедура SetBGBitmap. В принципе, можно было и для чтения написать функцию, но это не имеет смысла. А вот для записи сложных переменных (для которых выделяется память) лучше использовать функции. Для простых переменных (числа, булевы переменные), писать процедуры не надо, но если ты напишешь, то это ошибкой не будет.

Итак, для записи свойства BGBitmap я написал следующую процедуру:

procedure TGraphicClock.SetBGBitmap(Value: TBitmap);

begin FBGBitmap.Assign(Value); invalidate;

end;

В первой строке я просто копирую в переменную FBGBitmap переданную в качестве параметра картинку. Во второй строке я заставляю наш компонент прорисоваться.

Теперь ты можешь изменять фон простой операцией GraphicClock1.BGBitmap:=bitmap.

Если ты хочешь создать свойство с выпадающим списком (как например у свойства Align), по щелчку которого выпадает список возможных параметров, то тут уже немного сложнее. В моих часах есть такой параметр, который делает выбор, какого типа будут часы -аналоговые или цифровые. Объявление делается так:

property ClockStyle:TClockStyle read FClockStyle write SetStyleStyle default scAnalog;

Мы объявляем свойство ClockStyle типа TClockStyle. Тип TClockStyle мы должны описать в самом начале, до описания нашего объекта TGraphicClock, в разделе type:

type TClockStyle = (scAnalog, scDigital);

TGraphicClock = class(TGraphicControl) private Ticker: TTimer;

Строка TClockStyle = (scAnalog, scDigital) -объявляет список переменных, которые и будут выпадать по выбору свойства.

Всё остальное происходит так же, за исключением нового слова default, которое устанавливает значение по умолчанию для данного свойство -scAnalog.

Остальной код я приводить не буду, потому что там сплошная математика, которой достаточно много, но тебе советую с ним разобраться.

На компакт диске, в директорииПримерыГлава 19Componentты можешь увидеть пример этой программы.

 

19.4 Создание иконки компонента.

сли ты установил созданный нами компонент в Delphi, то заметил, что он имеет абсолютно некрасивую картинку. Эта иконка выбирается по умолчанию для всех компонентов, если у них нет своей. У нас пока нет своей иконки и её

сейчас предстоит создать.

 

Для создания иконки будем пользоваться программой Image Editor, которая входит в поставку Delphi. Её главное окно ты можешь увидеть на рисунке 19.4.1. Здесь нужно выбрать из меню File пункт Newi и затем Component Resource File (.dcr) (файл ресурсов для компонентов). Программа создаст новое окно, содержащее дерево, в котором пока только один элемент Contents.

Для создания нового элемента, нужно щёлкнуть правой кнопкой мыши в созданном окне проекта ресурса и в появившемся меню выбрать пункт New->Bitmap. Перед тобой откроется окно свойств создаваемой картинки (рисунок 19.4.2).

Ширина и высота (параметры Width и Height) картинки должны быть равны 24. Режим оставляем VGA, потому что для иконки 16 цветов достаточно. Жми «ОК». Теперь у тебя в дереве элементов ресурсов появился раздел Bitmap и в нём наша картинка Bitmap1 (рисунок 19.4.3). Щёлкни по элементу Bitmap1 и в появившемся меню выбери пункт Rename. Переименуй нашу картинку, дав ей имя нашего компонента TGraphicClock. Картинка обязательно должна иметь то же имя, что и компонент, которому она предназначена, потому что в одном файле исходника может быть несколько компонентов и по имени картинки Delphi будет определять, к какому компоненту она относиться.

Теперь дважды щёлкни по элементу картинки и появиться графический редактор, в котором ты можешь нарисовать что угодно. Нарисуй какие-нибудь часы. После этого, файл ресурсов можно закрывать. На вопрос о сохранении файла, сохрани его под именем GraphicClock.dcr. Скопируй этот файл в директорию, где у тебя находиться исходник компонента, оба файла должны находиться в одной директории.

Теперь открывай в Delphi наш пакет othercomponents.dpk. Удали из него файл исходника часов и откомпилируй пакет. Это заставит Delphi удалить из оболочки наш компонент. После этого снова добавь файл исходника и откомпилируй пакет ещё раз. Теперь компонент установился обратно, но уже с нашей иконкой.

На компакт диске, в директорииПримерыГлава 19IconForComponentты можешь увидеть пример моей иконки.

 

– Конец работы –

Эта тема принадлежит разделу:

Разработка собственных компонентов

Глава Разработка собственных компонентов...

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Иначе это уже запущеная программа

Что будем делать с полученным материалом:

Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Все темы данного раздела:

Инициализируем растры TBitmap, в которых будут хранится
//фон и сам рисунок часов. FBGBitmap:= TBitmap.Create; FFont:=TFont.Create;; FBitmap:= TBitmap.Create; FBitmap.Width := Width; FBitmap.Height := Height;

Для часов обязательно понадобится таймер
Ticker: TTimer; //Картинки часов и фона FBitmap, FBGBitmap: TBitmap; /События FOnSecond, FOnMinute, FOnH

Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • Популярное
  • Облако тегов
  • Здесь
  • Временно
  • Пусто
Теги