Код:
type
TWhatTimer = class
private
FTimer: TTimer;
FLabeledEdit: TLabeledEdit;
procedure SetOnTimer(Sender: TNotifyEvent);
procedure InnerOnTimer(Sender: TObject);
public
property OnTimer: TNotifyEvent write SetOnTimer;
constructor Create(ALabeledEdit: TLabeledEdit);
destructor Destroy; override;
end;
constructor TWhatTimer.Create(ALabeledEdit: TLabeledEdit);
begin
inherited Create;
FLabeledEdit:=ALabeledEdit;
FTimer:=TTimer.Create(nil);
FTimer.Interval:=500;
FTimer.OnTimer:=InnerOnTimer; // назначаем внутренний обработчик (default)
end;
destructor TWhatTimer.Destroy;
begin
FTimer.Free;
inherited Destroy;
end;
procedure TWhatTimer.InnerOnTimer(Sender: TObject);
begin
// внутренний обработчик событий
FLabeledEdit.Text:=IntToStr(FLabeledEdit.Tag);
FLabeledEdit.Tag:=FLabeledEdit.Tag+1;
end;
procedure TWhatTimer.SetOnTimer(Sender: TNotifyEvent);
begin
if Assigned(Sender) then FTimer.OnTimer:=Sender
else FTimer.OnTimer:=InnerOnTimer;
end;
использование:
Код:
TForm1 = class(TForm)
LabeledEdit1: TLabeledEdit;
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure TForm1.FormCreate(Sender: TObject);
begin
FWhatTimer:=TWhatTimer.Create(LabeledEdit1); // создаем TWhatTimer
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FWhatTimer.Free; // уничтожаем TWhatTimer
end;
procedure TForm1.OuterOnTimer(Sender: TObject);
begin
// внешний обработчик событий TWhatTimer
LabeledEdit1.Text:=IntToStr(LabeledEdit1.Tag);
LabeledEdit1.Tag:=LabeledEdit1.Tag-1;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
FWhatTimer.OnTimer:=OuterOnTimer; // назначаем внешний обработчик
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
FWhatTimer.OnTimer:=nil; // восстанавливаем внутренний обработчик
end;
http://zalil.ru/32393085
внутренний обработчик таймера (по умолчанию) увеличивает значение, когда подключаем внешний обработчик (нажатием на кнопку 1) значение будет уменьшаться. кнопка 2 снова восстанавливает внутренний обработчик.