Пример создания нового события компонента

Попробуем теперь создать собственное событие. Для этого нужно сначала убедиться, что такого события нет в VCL Delphi. Предположим, возникла необходимость создания события, которое возникает каждые 30 секунд. Естественно, для этого случая можно воспользоваться компонентом Timer, который расположен на вкладке System палитры компонентов Delphi. Но, предположим, что компонент должен иметь такое событие для удобства работы с ним. Код для создания события представлен ниже:

unit Halfmin;

interface

uses

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

type

TTimeEvent = procedure (Sender: TObj'ect; TheTime: TDateTime) of object;

THalfMinute = class (TComponent)

private

FTimer: TTimer;

FOnHalfMinute: TTimeEvent;

FOldSecond, FSecond: Word;

procedure FTimerTimer (Sender: TObject);

protected

procedure DoHalfMinute (TheTime: TDateTime); dynamic;

public

constructor Create (AOwner: TComponent); override;

destructor Destroy; override;

published

property OnHalfMinute: TTimeEvent read FOnHalfMinute write

FOnHalfMinute;

end;

implementation

constructor THalfMinute.Create (AOwner: TComponent);

begin

inherited Create (AOwner);

if not (csDesigning in ComponentState) then begin

FTimer:=TTimer.Create(self);

FTimer.Enabled:=True;

FTimer.Interval:=500;

FTimer.OnTimer:=FTimerTimer;

end;

end;

destructor THalfMinute.Destroy;

begin

FTimer.Free;

inherited Destroy;

end;

procedure THalfMinute.FTimerTimer (Sender: TObject);

var

DT: TDateTime;

Temp: Word;

begin

DT:=Now;

FOldSecond:=FSecond;

DecodeTime (DT,Temp,Temp,FSecond,Temp);

if FSecond <> FOldSecond then

if ((FSecond=30) or (FSecond=0)) then DoHalfMinute(DT);

end;

procedure THalfMinute.DoHalfMinute(TheTime: TDateTime);

begin

if Assigned (FOnHalfMinute) then FOnHalfMinute (Self, TheTime);

end;

end.

Для проверки работоспособности вышеприведенного кода вы можете добавить еще одну процедуру для регистрации нового компонента с именем THalfMinute, предварительно добавив в interface-часть программы строку: procedure Register;

Ниже представлен код для регистрации компонента:

procedure Register;

begin

RegisterComponents('Samples', [THalfMinute]);

end;

Для просмотра работоспособности нового компонента после его регистрации создадим новую форму и разместим на ней новый компонент. Добавим на форму компонент TEdit. Затем добавим обработчик события OnHalfMinute для формы:

procedure TForml.HalfMinute1HalfMinute(Sender: TObject; TheTime: TDateTime);

begin

Edit1.Text: = ('Время '+TimeToStr(TheTime));

Edit1.Refresh;

end;

В результате работы данной программы в компоненте Editl будет выводиться текущее время каждые 30 секунд.