diff --git a/components/tvplanit/examples/gadgets/project1.lpi b/components/tvplanit/examples/gadgets/project1.lpi index 02ba4eb27..559083187 100644 --- a/components/tvplanit/examples/gadgets/project1.lpi +++ b/components/tvplanit/examples/gadgets/project1.lpi @@ -58,6 +58,9 @@ + + + diff --git a/components/tvplanit/source/vpclock.pas b/components/tvplanit/source/vpclock.pas index 3d7ec1f94..770d1d2e7 100644 --- a/components/tvplanit/source/vpclock.pas +++ b/components/tvplanit/source/vpclock.pas @@ -160,6 +160,7 @@ type FTimer: TTimer; {$ENDIF} FActive: Boolean; + FHold: Boolean; FClockMode: TVpClockMode; FDigitalOptions: TVpDigitalOptions; FDisplayMode: TVpClockDisplayMode; @@ -167,6 +168,7 @@ type FElapsedHours: Integer; FElapsedMinutes: LongInt; FElapsedSeconds: LongInt; + FElapsedTime: TDateTime; FHandOptions: TVpHandOptions; FTime: TDateTime; FMilitaryTime: Boolean; @@ -174,6 +176,7 @@ type FHourOffset: Integer; {Hours} FMinuteOffset: Integer; {Minutes} FSecondOffset: Integer; {Seconds} + FTimeResolution: Integer; {interval of the internal timer, in ms } {event variables} FOnHourChange: TNotifyEvent; FOnMinuteChange: TNotifyEvent; @@ -208,6 +211,7 @@ type procedure SetClockMode(Value: TVpClockMode); procedure SetDisplayMode(Value: TVpClockDisplayMode); procedure SetMinuteOffset(Value: Integer); + procedure SetHold(Value: Boolean); procedure SetHourOffset(Value: Integer); procedure SetSecondOffset(Value: Integer); {internal methods} @@ -243,6 +247,7 @@ type {virtual property methods} procedure SetTime(Value: TDateTime); virtual; property Active: Boolean read FActive write SetActive; + property Hold: Boolean read FHold write SetHold; property ClockMode: TVpClockMode read FClockMode write SetClockMode; property DigitalOptions: TVpDigitalOptions read FDigitalOptions write FDigitalOptions; @@ -251,6 +256,7 @@ type property MinuteOffset: Integer read FMinuteOffset write SetMinuteOffset; property HourOffset: Integer read FHourOffset write SetHourOffset; property SecondOffset: Integer read FSecondOffset write SetSecondOffset; + property TimeResolution: Integer read FTimeResolution write FTimeResolution default 500; {events} property OnHourChange: TNotifyEvent read FOnHourChange write FOnHourChange; property OnMinuteChange: TNotifyEvent read FOnMinuteChange write FOnMinuteChange; @@ -261,6 +267,12 @@ type constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override; + + procedure Start; + procedure Stop; + procedure Pause; + procedure Resume; + property DisplayMode: TVpClockDisplayMode read FDisplayMode write SetDisplayMode; property ElapsedDays: Integer read GetElapsedDays; property ElapsedHours: Integer read GetElapsedHours; @@ -287,6 +299,7 @@ type property DigitalOptions; property DisplayMode; property Hint; + property Hold; property AnalogOptions; property MinuteOffset; property ParentColor; @@ -295,6 +308,7 @@ type property SecondOffset; property ShowHint; property HourOffset; + property TimeResolution; property Visible; {events} property OnClick; @@ -315,8 +329,7 @@ uses VpConst, VpMisc; const - ckDToR = (Pi / 180); - ckInterval = 500; + ckDToR = (Pi / 180); {===== TVpLEDClockDisplay ===========================================} @@ -575,12 +588,6 @@ begin FClockMode := cmClock; - {$IFDEF DELPHI} - FTimerPool := TVpTimerPool.Create(self); - {$ELSE} - FTimer := TTimer.Create(self); - {$ENDIF} - FHandOptions := TVpHandOptions.Create; FHandOptions.OnChange := ckHandOptionChange; FHandOptions.HourHandColor := clBlack; @@ -602,9 +609,13 @@ begin ckDraw.Width := Width; ckDraw.Height := Height; + FTimeResolution := 500; + {$IFDEF DELPHI} + FTimerPool := TVpTimerPool.Create(self); ckClockHandle := -1; {$ELSE} + FTimer := TTimer.Create(self); FTimer.Enabled := false; {$ENDIF} end; @@ -720,7 +731,15 @@ var C, D: Integer; elapsed: TDateTime; begin + if FHold then + exit; + elapsed := now - FTimeStarted; + + Write('Now: ', FormatDateTime('hh:nn:ss', now), ', Elapsed: ', FormatDateTime('hh:nn:ss', elapsed)); + Write(' TimeStarted: ', FormatDateTime('hh:nn:ss', FTimeStarted)); + WriteLn(' CountdownStartTime: ', FormatDateTime('hh:nn:ss', FCountdownStartTime)); + case FClockMode of cmClock: begin { Clock } @@ -738,7 +757,7 @@ begin cmTimer: { Count-up timer } SetTime(elapsed); cmCountDownTimer: { Count-down timer } - if abs(FCountdownStartTime - elapsed) < 0.1 / SecondsInDay then + if elapsed >= FCountdownStartTime then begin SetTime(0); Active := false; @@ -1222,14 +1241,15 @@ begin if Value <> FActive then begin FActive := Value; if FActive then begin + FElapsedTime := 0.0; if FDisplayMode = dmDigital then FMilitaryTime := DigitalOptions.MilitaryTime; {$IFDEF DELPHI} if ckClockHandle = -1 then - ckClockHandle := FTimerPool.Add(ckTimerEvent, ckInterval); + ckClockHandle := FTimerPool.Add(ckTimerEvent, FTimeResolution); {$ELSE} FTimeStarted := now; - FTimer.Interval := ckInterval; + FTimer.Interval := FTimeResolution; FTimer.Enabled := FActive; FTimer.OnTimer := ckTimerEvent; {$ENDIF} @@ -1243,15 +1263,18 @@ begin end; end else - {$IFDEF DELPHI} - if ckClockHandle > -1 then begin - FTimerPool.Remove(ckClockHandle); - ckClockHandle := -1; + begin + {$IFDEF DELPHI} + if ckClockHandle > -1 then begin + FTimerPool.Remove(ckClockHandle); + ckClockHandle := -1; + end; + {$ELSE} + if FTimer.Enabled then + FTimer.Enabled := false; + {$ENDIF} + FHold := false; end; - {$ELSE} - if FTimer.Enabled then - FTimer.Enabled := false; - {$ENDIF} Invalidate; end; end; @@ -1443,6 +1466,25 @@ begin end; {=====} +procedure TVpCustomClock.SetHold(Value: Boolean); +begin + if (Value <> FHold) then + begin + if FActive then + begin + FHold := Value; + if FHold then + FElapsedTime := Now() - FTimeStarted + else + begin + FTimeStarted := Now() - FElapsedTime; +// FCountdownTimeStarted := FCountdownTimeStarted - + end; + end else + FHold := false; + end; +end; + procedure TVpCustomClock.SetHourOffset(Value: Integer); begin if (Value <> FHourOffset) and (Abs(Value) <= 24) then begin @@ -1465,6 +1507,26 @@ begin end; {=====} +procedure TVpCustomClock.Start; +begin + Active := true; +end; + +procedure TVpCustomClock.Stop; +begin + Active := false; +end; + +procedure TVpCustomClock.Pause; +begin + Hold := true; +end; + +procedure TVpCustomClock.Resume; +begin + Hold := false; +end; + {$IFNDEF LCL} procedure TVpCustomClock.WMResize(var Msg: TWMSize); {$ELSE}