Рис. 1.33. Окно программы Часы

unit clock2_;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialo.gs, ExtCtrls;type
TForml = class(TForm)
Timerl: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure TimerlTimer(Sender: TObject); // эти объявления вставлены вручную
procedure Vector(xO, yO, a, 1: integer);
procedure DrawClock; private
/ Private declarations j
public
( Public declarations }
end;var
Forml: TForral;implementation
{$R *.dfm}uses
DateUtils; // для доступа к SecondOf,
// MinuteOf и HourOfconst
R = 75; // радиус циферблата часовvar
xO,yO: integer; // центр циферблата
ahr,amin,asec: integer; // положение стрелок (угол)// инициализация формы
procedure TForml.FormCreate(Sender: TObject);
var
t: TDateTime;
begin
// зададим размер формы
// в соответствии с размером циферблата
ClientHeight := (R+30)*2;
ClientWidth := (R+30)*2;
xO := R+30;
yO := R+30; t := Now(); // положение стрелок
ahr := 90 - HourOf(t)*30-(MinuteOf(Today)div 12)*6;
amin := 90 - MinuteOf(t)*6;
asec := 90 - SecondOf(Today)*6; Timerl.Interval := 1000; // период сигналов от таймера 1 сек
Timerl.Enabled := True; // пуск таймера
end;// вычерчивает вектор заданной длины из точки (х0,у0)
procedure TForral.Vector(x0,y0: integer; a, 1: integer);
// х0,у0 — начало вектора
// а — угол между осью х и вектором
// 1 — длина вектора
const
GRAD = 0.0174532; // коэффициент пересчета угла из градусов
// в радианы
var
х,у: integer; // координаты конца вектора
begin
Canvas.MoveTo(x0, y0) ;
х := Round(xO + l*cos(a*GRAD));
у := Round(y0 - l*sin(a*GRAD));
Canvas.LineTo(x,y);
end;// рисует стрелки
procedure T Fo rml.DrawClock;
var
t: TDateTime;
begin
// шаг секундной и минутной стрелок 6 градусов,
// часовой — 30.

// стереть изображение стрелок
Canvas.Pen.Color := clBtnFace;
Canvas.Pen.Width :=3;
// часовую
Vector(xO,yO, ahr, R-20);
// минутную
Vector(xO,yO, amin, R-15);
// секундную
Vector(xO,yO, asec, R-7); t := Now(); // новое положение стрелок
ahr := 90 - HourOf(t)*30-(MinuteOf(t)div 12)*6;
amin := 90 - MinuteOf(t)*6;
asec := 90 - SecondOf(t)*6; // нарисовать стрелки
// часовая стрелка
Canvas.Pen.Width := 3;
Canvas.Pen.Color := clBlack;
Vector(x0,y0, ahr, R-20); // минутная стрелка
Canvas.Pen.Width := 2;
Canvas.Pen.Color := clBlack;
Vector(x0,y0, amin, R-15); // секундная стрелка
Canvas.Pen.Width := 1;
Canvas.Pen.Color := clYellow;
Vector(x0,y0, asec, R-7);
end;// прорисовка циферблата и начальных стрелок
procedure TForml.FormPaint(Sender: TObject);
var
x,y: integer; // координаты маркера на циферблате
a: integer; // угол между ОХ и прямой (х0,у0) (х,у)
h: integer; // метка часовой риски bs: TBrushStyle; // стиль кисти
рс: TColor; // цвет карандаша
pw: integer; // ширина карандаша
begin
bs := Canvas.Brush.Style;
pc := Canvas.Pen.Color;
pw := Canvas.Pen.Width; Canvas.Brush.Style := bsClear;
Canvas.Pen.Width := 1;
Canvas.Pen.Color := clBlack; a:=0; // метки ставим от 3-х часов, против
// часовой стрелки
h:=3; // угол 0 градусов — это 3 часа // циферблат
while a < 360 do
begin
x:=xO+Round( R * cos(a*2*pi/360));
y:=xO-Round( R * sin(a*2*pi/360));
Forml.Canvas.MoveTo(x,y);
if (a mod 30) = 0 then
begin
Canvas.Ellipse(x-2,y-2,x+3, y+3);
// цифры по большему радиусу
x:=xO+Round( (R+15) * cos(a*2*pi/360));
y:=xO-Round( (R+15) * sin(a*2*pi/360));
Canvas.TextOut(x-5,y-7,IntToStr(h));
dec(h);
if h = 0 then h:=12;
end
else Canvas.Ellipse(x-l,y-l,x+l,y+l);
a:=a+6; // 1 минута — 6 градусов
end;
// восстановить карандаш-кисть
Canvas.Brush.Style := bs;
Canvas.Pen.Width := pw;
Canvas.Pen.Color :- pc; DrawClock;
end;// прорисовка текущих положений стрелок часов
procedure TForml.TimerlTimer(Sender: TObject);
begin
DrawClock;
end;end.