timer.pas 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. {
  2. This file is part of the Pas2JS run time library.
  3. Copyright (c) 2018 by warleyalex <[email protected]>
  4. See the file COPYING.FPC, included in this distribution,
  5. for details about the copyright.
  6. This program is distributed in the hope that it will be useful,
  7. but WITHOUT ANY WARRANTY; without even the implied warranty of
  8. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  9. **********************************************************************}
  10. {$mode objfpc}
  11. unit timer;
  12. Interface
  13. uses JS, Web, Classes;
  14. type
  15. TTimer = class(TComponent)
  16. private
  17. FEnabled: Boolean; // True
  18. FInterval: Integer; // 1000
  19. FOnTimer: TNotifyEvent;
  20. FID: Integer;
  21. procedure SetEnabled(Value: Boolean);
  22. procedure SetInterval(Value: Integer);
  23. protected
  24. function DesignEvent: Boolean; virtual;
  25. procedure DoUpdateTimer; virtual;
  26. procedure DoClearTimer; virtual;
  27. procedure DoTimer; virtual;
  28. public
  29. constructor Create(AOwner: TComponent); override;
  30. destructor Destroy; override;
  31. published
  32. { Specifies whether the timer is enabled }
  33. property Enabled: Boolean read FEnabled write SetEnabled default True;
  34. { Specifies the interval, in milliseconds, between timer events }
  35. property Interval: Integer read FInterval write SetInterval default 1000;
  36. property Tag;
  37. { Fired when the timer interval has elapsed }
  38. property OnTimer: TNotifyEvent read FOnTimer write FOnTimer;
  39. end;
  40. implementation
  41. { TTimer }
  42. constructor TTimer.Create(AOwner: TComponent);
  43. begin
  44. inherited Create(AOwner);
  45. FEnabled := True;
  46. FInterval := 1000;
  47. DoUpdateTimer;
  48. end;
  49. destructor TTimer.Destroy;
  50. begin
  51. Enabled := False;
  52. inherited Destroy;
  53. end;
  54. function TTimer.DesignEvent: Boolean;
  55. begin
  56. Result := False;
  57. end;
  58. procedure TTimer.DoUpdateTimer;
  59. begin
  60. FID := window.setInterval(@DoTimer, FInterval);
  61. end;
  62. procedure TTimer.DoClearTimer;
  63. begin
  64. if (FID <> 0) then
  65. begin
  66. window.clearInterval(FID);
  67. FID := 0;
  68. end;
  69. end;
  70. procedure TTimer.SetEnabled(Value: Boolean);
  71. begin
  72. if (Value <> FEnabled) then
  73. begin
  74. if Value then
  75. DoUpdateTimer
  76. else
  77. DoClearTimer;
  78. FEnabled := Value;
  79. end;
  80. end;
  81. procedure TTimer.SetInterval(Value: Integer);
  82. begin
  83. if (Value <> FInterval) then
  84. begin
  85. if Enabled then
  86. begin
  87. Enabled := False;
  88. try
  89. FInterval := Value;
  90. finally
  91. Enabled := True;
  92. end;
  93. end
  94. else
  95. FInterval := Value;
  96. end;
  97. end;
  98. procedure TTimer.DoTimer;
  99. begin
  100. if Assigned(FOnTimer) then
  101. FOnTimer(Self);
  102. end;
  103. end.