mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-05 17:37:53 +02:00
217 lines
6.3 KiB
ObjectPascal
217 lines
6.3 KiB
ObjectPascal
{
|
|
/***************************************************************************
|
|
customtimer.pas
|
|
---------------
|
|
Lazarus Component Library TCustomTimer
|
|
|
|
***************************************************************************/
|
|
|
|
*****************************************************************************
|
|
This file is part of the Lazarus Component Library (LCL)
|
|
|
|
See the file COPYING.modifiedLGPL.txt, included in this distribution,
|
|
for details about the license.
|
|
*****************************************************************************
|
|
}
|
|
unit CustomTimer;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, CustApp,
|
|
// LCL
|
|
LCLStrConsts, LCLType, InterfaceBase;
|
|
|
|
type
|
|
|
|
{ TCustomTimer }
|
|
|
|
TCustomTimer = class (TComponent)
|
|
private
|
|
FInterval : Cardinal;
|
|
FOnStartTimer: TNotifyEvent;
|
|
FOnStopTimer: TNotifyEvent;
|
|
FTimerHandle : TLCLHandle;
|
|
FOnTimer : TNotifyEvent;
|
|
FEnabled : Boolean;
|
|
procedure Timer;
|
|
protected
|
|
procedure SetEnabled(Value: Boolean); virtual;
|
|
procedure SetInterval(Value: Cardinal); virtual;
|
|
procedure SetOnTimer(Value: TNotifyEvent); virtual;
|
|
procedure DoOnTimer; virtual;
|
|
procedure UpdateTimer; virtual;
|
|
procedure KillTimer; virtual;
|
|
procedure Loaded; override;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
property Enabled: Boolean read FEnabled write SetEnabled default True;
|
|
property Interval: Cardinal read FInterval write SetInterval default 1000;
|
|
property OnTimer: TNotifyEvent read FOnTimer write SetOnTimer;
|
|
property OnStartTimer: TNotifyEvent read FOnStartTimer write FOnStartTimer;
|
|
property OnStopTimer: TNotifyEvent read FOnStopTimer write FOnStopTimer;
|
|
end;
|
|
|
|
|
|
implementation
|
|
|
|
const
|
|
cIdNoTimer = TLCLHandle(-1); { timer ID for an invalid timer }
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TCustomTimer.Create
|
|
Params: AOwner: the owner of the class
|
|
Returns: Nothing
|
|
|
|
Constructor for a timer.
|
|
------------------------------------------------------------------------------}
|
|
constructor TCustomTimer.Create(AOwner: TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
FInterval := 1000;
|
|
FTimerHandle := cIdNoTimer;
|
|
FEnabled := true;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TCustomTimer.Destroy
|
|
Params: Nothing
|
|
Returns: Nothing
|
|
|
|
Destructor for a timer.
|
|
------------------------------------------------------------------------------}
|
|
destructor TCustomTimer.Destroy;
|
|
begin
|
|
FOnTimer:=nil;
|
|
FEnabled:=false;
|
|
KillTimer;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TCustomTimer.KillTimer
|
|
Params: Nothing
|
|
Returns: Nothing
|
|
|
|
Kills the current timer object.
|
|
------------------------------------------------------------------------------}
|
|
procedure TCustomTimer.KillTimer;
|
|
begin
|
|
if FTimerHandle <> cIdNoTimer then begin
|
|
//DebugLn(['TCustomTimer.KillTimer ',dbgsName(Self)]);
|
|
WidgetSet.DestroyTimer(FTimerHandle);
|
|
FTimerHandle := cIdNoTimer;
|
|
if Assigned(OnStopTimer) then OnStopTimer(Self);
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomTimer.Loaded;
|
|
begin
|
|
inherited Loaded;
|
|
UpdateTimer;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TCustomTimer.UpdateTimer
|
|
Params: Nothing
|
|
Returns: Nothing
|
|
|
|
Updates the timer to match the current properties.
|
|
------------------------------------------------------------------------------}
|
|
procedure TCustomTimer.UpdateTimer;
|
|
begin
|
|
KillTimer;
|
|
if (FEnabled) and (FInterval > 0)
|
|
and (([csLoading,csDestroying]*ComponentState=[]))
|
|
and Assigned (FOnTimer) then begin
|
|
//DebugLn(['TCustomTimer.UpdateTimer ',dbgsName(Self),' WidgetSet.CreateTimer']);
|
|
FTimerHandle := WidgetSet.CreateTimer(FInterval, @Timer);
|
|
if FTimerHandle=0 then begin
|
|
FTimerHandle:=cIdNoTimer;
|
|
raise EOutOfResources.Create(SNoTimers);
|
|
end;
|
|
if Assigned(OnStartTimer) then OnStartTimer(Self);
|
|
end;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TCustomTimer.Timer
|
|
Returns: Nothing
|
|
|
|
Is called when the timer has expired and calls users OnTimer function.
|
|
------------------------------------------------------------------------------}
|
|
procedure TCustomTimer.Timer;
|
|
begin
|
|
{$IFDEF VerboseTimer}
|
|
DebugLn(['TCustomTimer.Timer ',dbgsName(Self),' ',FEnabled,' ',FInterval]);
|
|
{$ENDIF}
|
|
if (FEnabled) and (FInterval > 0) then
|
|
try
|
|
DoOnTimer;
|
|
except
|
|
CustomApplication.HandleException(nil);
|
|
end;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TCustomTimer.SetOnTimer
|
|
Params: value - users notification function
|
|
Returns: Nothing
|
|
|
|
Assigns the users notification callback.
|
|
------------------------------------------------------------------------------}
|
|
procedure TCustomTimer.SetOnTimer (value : TNotifyEvent);
|
|
begin
|
|
// Value=FOnTimer only compares code part
|
|
if CompareByte(Value,FOnTimer,SizeOf(Value))=0 then exit;
|
|
FOnTimer := value;
|
|
UpdateTimer;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
procedure TCustomTimer.DoOnTimer;
|
|
|
|
------------------------------------------------------------------------------}
|
|
procedure TCustomTimer.DoOnTimer;
|
|
begin
|
|
if Assigned(FOnTimer) then
|
|
FOnTimer(Self);
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TCustomTimer.SetEnabled
|
|
Params: value - new "enabled" state of the timer
|
|
Returns: Nothing
|
|
|
|
En/Disables the timer
|
|
------------------------------------------------------------------------------}
|
|
procedure TCustomTimer.SetEnabled (value : boolean);
|
|
begin
|
|
if (Value <> FEnabled) then
|
|
begin
|
|
FEnabled := value;
|
|
UpdateTimer;
|
|
end;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TCustomTimer.SetInterval
|
|
Params: value - timer interval
|
|
Returns: Nothing
|
|
|
|
Sets interval for the timer.
|
|
------------------------------------------------------------------------------}
|
|
procedure TCustomTimer.SetInterval (value : cardinal);
|
|
begin
|
|
if (value <> FInterval) then
|
|
begin
|
|
FInterval := value;
|
|
UpdateTimer;
|
|
end;
|
|
end;
|
|
|
|
end.
|