source: branches/2.20_branch/Sibyl/Addon/CLOCKS.PAS

Last change on this file was 7, checked in by RBRi, 19 years ago

+ sibyl staff

  • Property svn:eol-style set to native
File size: 7.4 KB
Line 
1UNIT Clocks;
2
3INTERFACE
4
5USES Dos,Classes,Forms;
6
7TYPE TAnalogClock=CLASS(TControl)
8 PRIVATE
9 FVertRes,FHorzRes:LONGINT;
10 FCXPixel,FCYPixel:LONGINT;
11 FHour,FMinute,FSecond,FSec100:WORD;
12 FTimer:TTimer;
13 FHourColor,FMinuteColor,FSecondColor:TColor;
14 PROCEDURE MakePoints(VAR pts:ARRAY OF TPoint;Count,Angle:LONGINT);
15 PROCEDURE DrawHand(pts:ARRAY OF TPoint;Value:WORD);
16 PROPERTY Caption;
17 PROPERTY Font;
18 PROTECTED
19 PROCEDURE SetupComponent;OVERRIDE;
20 PROCEDURE SetupShow;OVERRIDE;
21 PROCEDURE Resize;OVERRIDE;
22 PROCEDURE TimerEvent(Sender:TObject);
23 PUBLIC
24 DESTRUCTOR Destroy;OVERRIDE;
25 PROCEDURE Redraw(CONST rec:TRect);OVERRIDE;
26 PUBLISHED
27 PROPERTY Align;
28 PROPERTY Color;
29 PROPERTY PenColor;
30 PROPERTY DragCursor;
31 PROPERTY DragMode;
32 PROPERTY ParentColor;
33 PROPERTY ParentPenColor;
34 PROPERTY ParentShowHint;
35 PROPERTY ShowHint;
36 PROPERTY Visible;
37 PROPERTY ZOrder;
38
39 PROPERTY OnCanDrag;
40 PROPERTY OnDragDrop;
41 PROPERTY OnDragOver;
42 PROPERTY OnEndDrag;
43 PROPERTY OnEnter;
44 PROPERTY OnExit;
45 PROPERTY OnMouseClick;
46 PROPERTY OnMouseDblClick;
47 PROPERTY OnMouseDown;
48 PROPERTY OnMouseMove;
49 PROPERTY OnMouseUp;
50 PROPERTY OnResize;
51 PROPERTY OnSetupShow;
52 PROPERTY OnStartDrag;
53 PROPERTY HourColor:TColor read FHourColor write FHourColor;
54 PROPERTY MinuteColor:TColor read FMinuteColor write FMinuteColor;
55 PROPERTY SecondColor:TColor read FSecondColor write FSecondColor;
56 END;
57
58IMPLEMENTATION
59
60{
61ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
62º º
63º Speed-Pascal/2 Version 2.0 º
64º º
65º Speed-Pascal Component Classes (SPCC) º
66º º
67º This section: TAnalogClock Class implementation º
68º º
69º Last modified: September 1995 º
70º º
71º (C) 1995 SpeedSoft. All rights reserved. Disclosure probibited ! º
72º º
73ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ
74}
75
76CONST aptlHour:ARRAY[0..4] OF TPoint=((X:0;Y:-15),(x:7;y:0),(x:0;y:60),
77 (x:-7;y:0),(x:0;y:-15));
78 aptlMinute:ARRAY[0..4] OF TPoint=((X:0;Y:-20),(X:5;Y:0),(X:0;Y:80),
79 (X:-5;Y:0),(X:0;Y:-20));
80 aptlSecond:ARRAY[0..1] OF TPoint=((X:0;Y:0),(X:0;Y:80));
81
82PROCEDURE TAnalogClock.SetupComponent;
83BEGIN
84 Inherited SetupComponent;
85
86 Name := 'AnalogClock';
87 FTimer.Create(SELF);
88 Include(FTimer.ComponentState,csDetail);
89 FTimer.Interval:=1000;
90 Color:=clBlack;
91 FHourColor:=clBlack;
92 FMinuteColor:=clBlack;
93 FSecondColor:=clBlack;
94 ParentColor:=TRUE;
95 Width:=150;
96 Height:=150;
97END;
98
99DESTRUCTOR TAnalogClock.Destroy;
100BEGIN
101 FTimer.Destroy;
102 FTimer:=NIL;
103 Inherited Destroy;
104END;
105
106PROCEDURE TAnalogClock.TimerEvent(Sender:TObject);
107VAR Hour,Minute,Second,Sec100:WORD;
108BEGIN
109 IF Handle=0 THEN exit;
110
111 IF TTimer(Sender)=FTimer THEN
112 BEGIN
113 GetTime(Hour,Minute,Second,Sec100);
114 Hour:=((Hour*5) MOD 60) + Minute DIV 12;
115
116 Canvas.ClipRect:=ClientRect;
117
118 Canvas.Pen.Color:=HourColor;
119 DrawHand(aptlHour,Hour);
120 Canvas.Pen.Color:=MinuteColor;
121 DrawHand(aptlMinute,Minute);
122 Canvas.Pen.Color:=SecondColor;
123 DrawHand(aptlSecond,Second);
124
125 Canvas.Pen.Color:=Color;
126
127 DrawHand(aptlSecond,FSecond);
128 IF ((Hour<>FHour)OR(Minute<>FMinute)) THEN
129 BEGIN
130 DrawHand(aptlHour,FHour);
131 DrawHand(aptlMinute,FMinute);
132 END;
133
134 Canvas.DeleteClipRegion;
135
136 FHour:=Hour;
137 FMinute:=Minute;
138 FSecond:=Second;
139 FSec100:=Sec100;
140 END;
141END;
142
143PROCEDURE TAnalogClock.SetupShow;
144BEGIN
145 Inherited SetupShow;
146
147 FVertRes:=Canvas.VerticalResolution;
148 FHorzRes:=Canvas.HorizontalResolution;
149 Resize;
150 GetTime(FHour,FMinute,FSecond,FSec100);
151 FHour:=(FHour*5) MOD 60 + FMinute DIV 12;
152 FTimer.OnTimer:=TimerEvent;
153 FTimer.Start;
154END;
155
156PROCEDURE TAnalogClock.Resize;
157VAR Temp:LONGINT;
158 CX,CY:LONGINT;
159BEGIN
160 Inherited Resize;
161
162 CX:=Width*1000 DIV FHorzRes;
163 CY:=Height*1000 DIV FVertRes;
164 IF CX<CY THEN Temp:=CX
165 ELSE Temp:=CY;
166
167 FCXPixel:=FHorzRes*Temp DIV 1000;
168 FCYPixel:=FVertRes*Temp DIV 1000;
169END;
170
171PROCEDURE TAnalogClock.MakePoints(VAR pts:ARRAY OF TPoint;Count,Angle:LONGINT);
172CONST SinTable:ARRAY[0..59] OF LONGINT=
173 (
174 0,105,208,309,407,500,588,669,743,809,
175 866,914,951,978,995,1000,995,978,951,914,
176 866,809,743,669,588,500,407,309,208,105,
177 0,-104,-207,-308,-406,-499,-587,-668,-742,-808,
178 -865,-913,-950,-977,-994,-999,-994,-977,-950,-913,
179 -865,-808,-742,-668,-587,-499,-406,-308,-207,-104
180 );
181VAR t:LONGINT;
182 Cos1,Sin1:LONGINT;
183 pt:TPoint;
184CONST
185 Factor: Single = 6 * PI / 180;
186BEGIN
187 Cos1:=SinTable[(Angle+15) MOD 60];
188 Sin1:=SinTable[Angle];
189 FOR t:=0 TO Count-1 DO
190 BEGIN
191 pt:=pts[t];
192 pt:=Point((pt.X*Cos1+pt.Y*Sin1) DIV 1000,(pt.Y*Cos1-pt.X*Sin1) DIV 1000);
193 pt.X:=((pt.X*FCXPixel) DIV 200);
194 inc(pt.x,Width DIV 2);
195 pt.Y:=((pt.Y*FCYPixel) DIV 200);
196 inc(pt.y,Height DIV 2);
197 pts[t]:=pt;
198 END;
199END;
200
201PROCEDURE TAnalogClock.DrawHand(pts:ARRAY OF TPoint;Value:WORD);
202VAR t:LONGINT;
203BEGIN
204 MakePoints(pts,High(pts)+1,Value);
205
206 Canvas.BeginPath;
207 Canvas.PenPos:=pts[0];
208 FOR t:=1 TO High(pts) DO Canvas.LineTo(pts[t].X,pts[t].Y);
209 Canvas.EndPath;
210 Canvas.FillPath;
211
212 Canvas.BeginPath;
213 Canvas.PenPos:=pts[0];
214 FOR t:=1 TO High(pts) DO Canvas.LineTo(pts[t].X,pts[t].Y);
215 Canvas.EndPath;
216 Canvas.PathToClipRegion(paDiff);
217END;
218
219PROCEDURE TAnalogClock.Redraw(CONST rec:TRect);
220VAR Angle:LONGINT;
221 pt:ARRAY[0..0] OF TPoint;
222 Radius:LONGINT;
223BEGIN
224 Canvas.Pen.Color:=HourColor;
225 DrawHand(aptlHour,FHour);
226 Canvas.Pen.Color:=MinuteColor;
227 DrawHand(aptlMinute,FMinute);
228 Canvas.Pen.Color:=SecondColor;
229 DrawHand(aptlSecond,FSecond);
230
231 Inherited Redraw(rec);
232
233 Canvas.Pen.Color:=PenColor;
234
235 FOR Angle:=0 TO 59 DO
236 BEGIN
237 IF Angle MOD 5<>0 THEN Radius:=1
238 ELSE Radius:=4;
239
240 pt[0]:=Point(0,90);
241 MakePoints(pt,1,Angle);
242
243 Canvas.FilledCircle(pt[0].X,pt[0].Y,Radius*FCXPixel DIV 200);
244 END;
245END;
246
247BEGIN
248 RegisterClasses([TAnalogClock]);
249END.
Note: See TracBrowser for help on using the repository browser.