Главная » Delphi » Компонент TddgDigitalClock — создание событий компонента

0

Компонент TddgDigitalClock иллюстрирует процесс создания событий, опре деленных пользователем, и предоставления доступа к ним.  Здесь  используется та же технология, что  и при  создании событий описанного выше  компонента TddgHalf- Minute.

Компонент TddgDigitalClock является производным от  компонента TPanel. Мы решили, что  класс  TPanel идеально подходит для  предка  создаваемого компо нента, так как содержит свойства BevelXXXX, благодаря которым компоненту TddgDigitalClock можно  придать привлекательный внешний вид.  К тому же  для отображения системного времени можно использовать свойство TPanel.Caption.

Компонент TddgDigitalClock содержит следующие события, для обработки ко

торых пользователь может назначить необходимый код:

OnHour — происходит каждый час; OnHalfPast — происходит каждые полчаса;  OnMinute — происходит каждую минуту; OnHalfMinute — происходит каждые полминуты; OnSecond — происходит каждую секунду.

Компонент TddgDigitalClock использует встроенный в него компонент TTimer. Его обработчик события OnTimer реализует логику отображения информации о вре мени  и вызывает методы  диспетчеризации перечисленных выше  событий. В листин ге 11.15 приведен исходный код модуля DdgClock.pas.

Листинг 11.15. DdgClock.pas — исходный код компонента TddgDigitalClock{$IFDEF VER110}

{$OBJEXPORTALL ON}

{$ENDIF}

unit DDGClock;

interface uses

Windows, Messages, Controls, Forms, SysUtils, Classes, ExtCtrls;

type

{ Объявление типа события, которому в качестве параметров будут

передаваться источник события и переменная TDateTime. }

TTimeEvent = procedure(Sender: TObject;

DDGTime: TDateTime) of object;

TddgDigitalClock = class(TPanel)

private

{ Поля данных }

FHour,

FMinute,

FSecond: Word;

FDateTime: TDateTime;

FOldMinute,

FOldSecond: Word;

FTimer: TTimer;

{ Обработчики событий }

FOnHour: TTimeEvent;             // Происходит каждый час

FOnHalfPast: TTimeEvent;         // Происходит каждые полчаса

FOnMinute: TTimeEvent;           // Происходит каждую минуту

FOnSecond: TTimeEvent;           // Происходит каждую секунду

FOnHalfMinute: TTimeEvent; // Происходит каждые 30 секунд

{ Определение обработчика события OnTimer для внутренней

переменной FTimer типа TTimer. }

procedure TimerProc(Sender: TObject);

protected

{ Переопределение метода Paint }

procedure Paint; override;

{ Определение методов диспетчеризации различных событий. }

procedure DoHour(Tm: TDateTime); dynamic;

procedure DoHalfPast(Tm: TDateTime); dynamic;

procedure DoMinute(Tm: TDateTime); dynamic;

procedure DoHalfMinute(Tm: TDateTime); dynamic;

procedure DoSecond(Tm: TDateTime); dynamic;

public

{ Переопределение конструктора Create и деструктора Destroy. }

constructor Create(AOwner: TComponent); override;

destructor Destroy; override;

published

{ Определение свойств-событий. }property OnHour: TTimeEvent read FOnHour write FOnHour;

property OnHalfPast: TTimeEvent read FOnHalfPast

write FOnHalfPast;

property OnMinute: TTimeEvent read FOnMinute write FOnMinute;

property OnHalfMinute: TTimeEvent read FOnHalfMinute

write FOnHalfMinute;

property OnSecond: TTimeEvent read FOnSecond write FOnSecond;

end;

implementation

constructor TddgDigitalClock.Create(AOwner: TComponent);

begin

inherited Create(AOwner); // Вызвать унаследованный конструктор

Height := 25; // Установить размеры по умолчанию

Width := 120;

BevelInner := bvLowered; // Установить стандартные свойства

BevelOuter := bvLowered;

{ Назначить унаследованному свойству Caption пустую строку. }

inherited Caption := ”;

{ Создать экземпляр компонента TTimer и установить его

свойство Interval и обработчик события OnTime. }

FTimer:= TTimer.Create(self);

FTimer.interval:= 200;

FTimer.OnTimer:= TimerProc;

end;

destructor TddgDigitalClock.Destroy;

begin

FTimer.Free;           // Освободить экземпляр компонента TTimer

inherited Destroy; // Вызывать унаследованный метод Destroy

end;

procedure TddgDigitalClock.Paint;

begin

inherited Paint; // Вызывать унаследованный метод Paint

{ Теперь унаследованному свойству Caption назначить

текущее время. }

inherited Caption := TimeToStr(FDateTime);

end;

procedure TddgDigitalClock.TimerProc(Sender: TObject);

var

HSec: Word;

begin

{ Сохранить старые значения минут и секунд для дальнейшего

использования. }

FOldMinute := FMinute;

FOldSecond := FSecond;

FDateTime := Now; // Получить текущее время.

{ Извлечение отдельных составляющих времени }

DecodeTime(FDateTime, FHour, FMinute, FSecond, Hsec);

refresh; // Перерисовать компонент для отображения нового// времени.

{ Вызов обработчиков событий времени }

if FMinute = 0 then

DoHour(FDateTime);

if FMinute = 30 then

DoHalfPast(FDateTime);

if (FMinute <> FOldMinute) then

DoMinute(FDateTime);

if FSecond <> FOldSecond then

if ((FSecond = 30) or (FSecond = 0)) then

DoHalfMinute(FDateTime)

else

DoSecond(FDateTime);

end;

{ Приведенные ниже методы диспетчеризации событий проверяют наличие соответствующих обработчиков событий отсчета времени и вызывают их.

}

procedure TddgDigitalClock.DoHour(Tm: TDateTime);

begin

if Assigned(FOnHour) then

TTimeEvent(FOnHour)(Self, Tm);

end;

procedure TddgDigitalClock.DoHalfPast(Tm: TDateTime);

begin

if Assigned(FOnHalfPast) then

TTimeEvent(FOnHalfPast)(Self, Tm);

end;

procedure TddgDigitalClock.DoMinute(Tm: TDateTime);

begin

if Assigned(FOnMinute) then

TTimeEvent(FOnMinute)(Self, Tm);

end;

procedure TddgDigitalClock.DoHalfMinute(Tm: TDateTime);

begin

if Assigned(FOnHalfMinute) then

TTimeEvent(FOnHalfMinute)(Self, Tm);

end;

procedure TddgDigitalClock.DoSecond(Tm: TDateTime);

begin

if Assigned(FOnSecond) then

TTimeEvent(FOnSecond)(Self, Tm);

end;

end.

Логическая структура этого компонента разъясняется в комментариях к исходному коду. Применяемые здесь методы не отличаются от рассмотренных выше при созда нии  событий. В компонент TddgDigitalClock лишь добавлено большее количество событий и включена логика для определения того, какое из событий произошло.

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии