lazclock: Implements the initial clock control
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@2303 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
parent
05adebc953
commit
1ba866f87f
@ -5,9 +5,86 @@ unit clock_control;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
Classes, SysUtils;
|
Classes, SysUtils, Controls, Graphics, LCLType, DateUtils;
|
||||||
|
|
||||||
|
type
|
||||||
|
|
||||||
|
{ TLazClockControl }
|
||||||
|
|
||||||
|
TLazClockControl = class(TCustomControl)
|
||||||
|
public
|
||||||
|
BackgroundImage: TPortableNetworkGraphic;
|
||||||
|
constructor Create(AOwner: TComponent); override;
|
||||||
|
procedure EraseBackground(DC: HDC); override;
|
||||||
|
procedure Paint; override;
|
||||||
|
end;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
|
constructor TLazClockControl.Create(AOwner: TComponent);
|
||||||
|
begin
|
||||||
|
inherited Create(AOwner);
|
||||||
|
|
||||||
|
BackgroundImage := TPortableNetworkGraphic.Create;
|
||||||
|
BackgroundImage.LoadFromFile('skins\wallclock1.PNG');
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TLazClockControl.EraseBackground(DC: HDC);
|
||||||
|
begin
|
||||||
|
// Uncomment this to enable default background erasing
|
||||||
|
//inherited EraseBackground(DC);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TLazClockControl.Paint;
|
||||||
|
var
|
||||||
|
lCurTime: TDateTime;
|
||||||
|
lHours, lMinutes, lSeconds, lMilliseconds: word;
|
||||||
|
lPointerAngleMajor, lPointerAngleMinor: Double;
|
||||||
|
Lmajor, Lminor: Integer; // Size of the pointer, bigger and smaller parts, counting from the clock center
|
||||||
|
ClockCenter, MajorPos, MinorPos: TPoint;
|
||||||
|
begin
|
||||||
|
Canvas.Draw(0, 0, BackgroundImage);
|
||||||
|
lCurTime := Now();
|
||||||
|
SysUtils.DecodeTime(lCurTime, lHours, lMinutes, lSeconds, lMilliseconds);
|
||||||
|
ClockCenter := Point(Width div 2, Height div 2);
|
||||||
|
|
||||||
|
// Seconds indicator
|
||||||
|
lPointerAngleMajor := - 2 * Pi * (lSeconds / 60);
|
||||||
|
Lmajor := 150;
|
||||||
|
Lminor := 50;
|
||||||
|
MinorPos.X := Round(ClockCenter.X + Lminor * Sin(lPointerAngleMajor));
|
||||||
|
MinorPos.Y := Round(ClockCenter.Y + Lminor * Cos(lPointerAngleMajor));
|
||||||
|
MajorPos.X := Round(ClockCenter.X - Lmajor * Sin(lPointerAngleMajor));
|
||||||
|
MajorPos.Y := Round(ClockCenter.Y - Lmajor * Cos(lPointerAngleMajor));
|
||||||
|
Canvas.Pen.Color := clRed;
|
||||||
|
Canvas.Pen.Width := 3;
|
||||||
|
Canvas.Line(MinorPos, MajorPos);
|
||||||
|
|
||||||
|
// Minutes indicator
|
||||||
|
lPointerAngleMajor := - 2 * Pi * (lMinutes / 60);
|
||||||
|
Lmajor := 120;
|
||||||
|
Lminor := 30;
|
||||||
|
MinorPos.X := Round(ClockCenter.X + Lminor * Sin(lPointerAngleMajor));
|
||||||
|
MinorPos.Y := Round(ClockCenter.Y + Lminor * Cos(lPointerAngleMajor));
|
||||||
|
MajorPos.X := Round(ClockCenter.X - Lmajor * Sin(lPointerAngleMajor));
|
||||||
|
MajorPos.Y := Round(ClockCenter.Y - Lmajor * Cos(lPointerAngleMajor));
|
||||||
|
Canvas.Pen.Color := clBlack;
|
||||||
|
Canvas.Pen.Width := 5;
|
||||||
|
Canvas.Line(MinorPos, MajorPos);
|
||||||
|
|
||||||
|
// Hours indicator
|
||||||
|
if lHours > 12 then lHours := lHours - 12;
|
||||||
|
lPointerAngleMajor := - 2 * Pi * (lHours / 12);
|
||||||
|
Lmajor := 80;
|
||||||
|
Lminor := 20;
|
||||||
|
MinorPos.X := Round(ClockCenter.X + Lminor * Sin(lPointerAngleMajor));
|
||||||
|
MinorPos.Y := Round(ClockCenter.Y + Lminor * Cos(lPointerAngleMajor));
|
||||||
|
MajorPos.X := Round(ClockCenter.X - Lmajor * Sin(lPointerAngleMajor));
|
||||||
|
MajorPos.Y := Round(ClockCenter.Y - Lmajor * Cos(lPointerAngleMajor));
|
||||||
|
Canvas.Pen.Color := clBlack;
|
||||||
|
Canvas.Pen.Width := 7;
|
||||||
|
Canvas.Line(MinorPos, MajorPos);
|
||||||
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
@ -6,13 +6,14 @@ object Form1: TForm1
|
|||||||
Caption = 'LazClock'
|
Caption = 'LazClock'
|
||||||
ClientHeight = 444
|
ClientHeight = 444
|
||||||
ClientWidth = 400
|
ClientWidth = 400
|
||||||
|
OnCreate = FormCreate
|
||||||
LCLVersion = '0.9.31'
|
LCLVersion = '0.9.31'
|
||||||
object Notebook: TNotebook
|
object Notebook: TNotebook
|
||||||
Left = 0
|
Left = 0
|
||||||
Height = 400
|
Height = 400
|
||||||
Top = 44
|
Top = 44
|
||||||
Width = 400
|
Width = 400
|
||||||
PageIndex = 1
|
PageIndex = 0
|
||||||
Align = alBottom
|
Align = alBottom
|
||||||
TabOrder = 0
|
TabOrder = 0
|
||||||
TabStop = True
|
TabStop = True
|
||||||
@ -24,7 +25,7 @@ object Form1: TForm1
|
|||||||
Height = 25
|
Height = 25
|
||||||
Top = 68
|
Top = 68
|
||||||
Width = 75
|
Width = 75
|
||||||
Caption = 'btnStart'
|
Caption = 'Start'
|
||||||
OnClick = btnStartClick
|
OnClick = btnStartClick
|
||||||
TabOrder = 0
|
TabOrder = 0
|
||||||
end
|
end
|
||||||
@ -33,7 +34,7 @@ object Form1: TForm1
|
|||||||
Height = 25
|
Height = 25
|
||||||
Top = 100
|
Top = 100
|
||||||
Width = 75
|
Width = 75
|
||||||
Caption = 'btnStop'
|
Caption = 'Stop'
|
||||||
OnClick = btnStopClick
|
OnClick = btnStopClick
|
||||||
TabOrder = 1
|
TabOrder = 1
|
||||||
end
|
end
|
||||||
@ -42,7 +43,7 @@ object Form1: TForm1
|
|||||||
Height = 25
|
Height = 25
|
||||||
Top = 132
|
Top = 132
|
||||||
Width = 75
|
Width = 75
|
||||||
Caption = 'btnReset'
|
Caption = 'Reset'
|
||||||
OnClick = btnResetClick
|
OnClick = btnResetClick
|
||||||
TabOrder = 2
|
TabOrder = 2
|
||||||
end
|
end
|
||||||
@ -59,16 +60,25 @@ object Form1: TForm1
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
object btnCronometer: TButton
|
object btnCronometer: TButton
|
||||||
Left = 10
|
Tag = 1
|
||||||
|
Left = 88
|
||||||
Height = 25
|
Height = 25
|
||||||
Top = 11
|
Top = 11
|
||||||
Width = 75
|
Width = 75
|
||||||
Caption = 'Cronometer'
|
Caption = 'Cronometer'
|
||||||
OnClick = btnCronometerClick
|
OnClick = HandleChangePage
|
||||||
TabOrder = 1
|
TabOrder = 1
|
||||||
end
|
end
|
||||||
|
object btnClock: TButton
|
||||||
|
Left = 8
|
||||||
|
Height = 25
|
||||||
|
Top = 11
|
||||||
|
Width = 75
|
||||||
|
Caption = 'Clock'
|
||||||
|
OnClick = HandleChangePage
|
||||||
|
TabOrder = 2
|
||||||
|
end
|
||||||
object timerClock: TTimer
|
object timerClock: TTimer
|
||||||
Enabled = False
|
|
||||||
OnTimer = timerClockTimer
|
OnTimer = timerClockTimer
|
||||||
left = 312
|
left = 312
|
||||||
top = 110
|
top = 110
|
||||||
|
@ -6,7 +6,8 @@ interface
|
|||||||
|
|
||||||
uses
|
uses
|
||||||
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
|
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
|
||||||
ExtCtrls, DateUtils;
|
ExtCtrls, DateUtils,
|
||||||
|
clock_control;
|
||||||
|
|
||||||
type
|
type
|
||||||
|
|
||||||
@ -17,20 +18,23 @@ type
|
|||||||
btnStart: TButton;
|
btnStart: TButton;
|
||||||
btnStop: TButton;
|
btnStop: TButton;
|
||||||
btnReset: TButton;
|
btnReset: TButton;
|
||||||
|
btnClock: TButton;
|
||||||
labelCronometer: TLabel;
|
labelCronometer: TLabel;
|
||||||
Notebook: TNotebook;
|
Notebook: TNotebook;
|
||||||
Page1: TPage;
|
Page1: TPage;
|
||||||
pageCronometer: TPage;
|
pageCronometer: TPage;
|
||||||
timerCronometer: TTimer;
|
timerCronometer: TTimer;
|
||||||
timerClock: TTimer;
|
timerClock: TTimer;
|
||||||
procedure btnCronometerClick(Sender: TObject);
|
procedure HandleChangePage(Sender: TObject);
|
||||||
procedure btnResetClick(Sender: TObject);
|
procedure btnResetClick(Sender: TObject);
|
||||||
procedure btnStartClick(Sender: TObject);
|
procedure btnStartClick(Sender: TObject);
|
||||||
procedure btnStopClick(Sender: TObject);
|
procedure btnStopClick(Sender: TObject);
|
||||||
|
procedure FormCreate(Sender: TObject);
|
||||||
procedure timerClockTimer(Sender: TObject);
|
procedure timerClockTimer(Sender: TObject);
|
||||||
procedure timerCronometerTimer(Sender: TObject);
|
procedure timerCronometerTimer(Sender: TObject);
|
||||||
private
|
private
|
||||||
{ private declarations }
|
{ private declarations }
|
||||||
|
LazClockControl: TLazClockControl;
|
||||||
public
|
public
|
||||||
{ public declarations }
|
{ public declarations }
|
||||||
CronometerStarted: Boolean;
|
CronometerStarted: Boolean;
|
||||||
@ -48,7 +52,7 @@ implementation
|
|||||||
|
|
||||||
procedure TForm1.timerClockTimer(Sender: TObject);
|
procedure TForm1.timerClockTimer(Sender: TObject);
|
||||||
begin
|
begin
|
||||||
|
LazClockControl.Invalidate;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TForm1.timerCronometerTimer(Sender: TObject);
|
procedure TForm1.timerCronometerTimer(Sender: TObject);
|
||||||
@ -64,9 +68,9 @@ begin
|
|||||||
labelCronometer.Caption := SysUtils.TimeToStr(CronometerTime, lFormatSettings);
|
labelCronometer.Caption := SysUtils.TimeToStr(CronometerTime, lFormatSettings);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TForm1.btnCronometerClick(Sender: TObject);
|
procedure TForm1.HandleChangePage(Sender: TObject);
|
||||||
begin
|
begin
|
||||||
Notebook.PageIndex := 1;
|
Notebook.PageIndex := (Sender as TButton).Tag;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TForm1.btnResetClick(Sender: TObject);
|
procedure TForm1.btnResetClick(Sender: TObject);
|
||||||
@ -87,5 +91,16 @@ begin
|
|||||||
timerCronometer.Enabled := False;
|
timerCronometer.Enabled := False;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TForm1.FormCreate(Sender: TObject);
|
||||||
|
begin
|
||||||
|
LazClockControl := TLazClockControl.Create(Self);
|
||||||
|
LazClockControl.Height := 400;
|
||||||
|
LazClockControl.Width := 400;
|
||||||
|
LazClockControl.Top := 0;
|
||||||
|
LazClockControl.Left := 0;
|
||||||
|
LazClockControl.Parent := Notebook.Page[0];
|
||||||
|
LazClockControl.DoubleBuffered := True;
|
||||||
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user