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. |