Автор: Bonivur
Дата сообщения: 07.09.2012 11:02
Разбираю сейчас книгу Фаронова по созданию компонент (пример дан чуть ниже). Вопрос такой - в этом модуле определен метод Timer с параметрами (Sender: TObject). Далее этот метод вызывается в конструкторе Create , но уже БЕЗ параметров, более того, добавление параметров вызывает ошибку. Почему это так происходит? Зачем вобще этот параметр нужен? Это стандарт так вызывать процедуры и объявлять их в полях класса? Почему нельзя объявить метод Timer без параметра?
Вот пример -
[more=Код модуля]
Код:
unit FarWatchClock;
interface
uses
SysUtils, Windows, Messages, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, ExtCtrls, DateUtils;
type
TWatchView = (wvClock, wvInterval, wvClockInterval,
wvIntClock, wvClockIntClock);
type
TFarWatchClock = class(TCustomLabel)
private
FInterval: Integer;
FOnWatchTime: TNotifyEvent;
FTimer: TTimer;
FWatchTime: TDateTime;
FWatchView: TWatchView;
procedure SetInterval(Value: Integer);
procedure SetWatchTime(Value: TDateTime);
procedure SetWatchView(Value: TWatchView);
protected
procedure Timer(Sender: TObject); // ВОТ ЭТА ПРОЦЕДУРА
public
constructor Create(AOwner : TComponent); override;
procedure Paint; override;
published
property Align;
property Color;
property Font;
property Interval: Integer read FInterval write SetInterval;
property OnMouseEnter;
property OnMouseLeave;
property OnMouseMove;
property OnWatchTime: TNotifyEvent read FOnWatchTime write FOnWatchTime;
property ParentColor;
property ParentFont;
property ParentShowHint;
property ShowHint;
property Visible;
property WatchTime: TDateTime read FWatchTime write SetWatchTime;
property WatchView: TWatchView read FWatchView write SetWatchView;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples',[TFarWatchClock]);
end;
{
******************************************************** TFarWatchClock ********************************************************
}
constructor TFarWatchClock.Create(AOwner : TComponent);
begin
inherited;
FTimer := TTimer.Create(Self);
FTimer.OnTimer := Timer;
FTimer.Enabled := True;
Caption := TimeToStr(Time);
end;
procedure TFarWatchClock.Paint;
var
S: string;
begin
inherited;
S := TimeToStr(Time);
if FWatchTime <> 0 then
begin
FInterval := SecondsBetween(Time, FWatchTime);
case FWatchView of
wvInterval: S:= Format ('%Sc',[FloatToStrF(FInterval,ffNumber,15,0)]);
wvClockInterval: S:= Format ('%S %Sc',[S, FloatToStrF(FInterval,ffNumber,15,0)]);
wvIntClock: S:=TimeToStr(FWatchTime - Time);
wvClockIntClock: S:=Format('%S %S',[S, TimeToStr(FWatchTime - Time)]);
end;
end;
Caption:=S;
end;
procedure TFarWatchClock.SetInterval(Value: Integer);
begin
if Value<>FInterval then
begin
FInterval := Value;
if Value = 0 then
FWatchTime := 0
else
FWatchTime := Time + Value / (24 * 3600);
Invalidate;
end;
end;
procedure TFarWatchClock.SetWatchTime(Value: TDateTime);
begin
if Value <> FWatchTime then
begin
FWatchTime := Value;
Invalidate;
end;
end;
procedure TFarWatchClock.SetWatchView(Value: TWatchView);
begin
if Value <> FWatchView then
begin
FWatchView := Value;
Invalidate;
end;
end;
procedure TFarWatchClock.Timer(Sender: TObject);
begin
if FInterval > 0 then Dec(FInterval);
Invalidate;
if (TimeToStr(Time)=TimeToStr(FWatchTime)) and (Assigned(FOnWatchTime)) then
begin
FOnWatchTime(Self);
Interval := 0;
end;
end;
initialization
end.