Аналоговые часы с будильником
Интерфейс:
Код программы:
unit unit2_;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, ComCtrls, Menus;
type
TForm2 = class(TForm)
Timer1: TTimer;
Label1: TLabel;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
// эти объявления вставлены вручную
procedure Vector(x0,y0,a,l: integer);
procedure DrawClock;
procedure N2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
a:string;
Form2: TForm2;
implementation
uses
DateUtils; // для доступа к SecondOf,
// MinuteOf и HourOf
const
R = 85 ; // радиус циферблата часов
var
x0,y0: integer; // центр циферблата
ahr,amin,asec: integer; // положение стрелок (угол)
// инициализация формы
procedure TForm2.FormCreate(Sender: TObject);
var
t: TDateTime;
begin
// зададим размер формы
// в соответствии с размером циферблата
x0 := R+10;
y0 := R+10;
t := Now();
// положение стрелок
ahr := 90 - HourOf(t)*30-(MinuteOf(Today)div 12)*6;
amin := 90 - MinuteOf(t)*6;
asec := 90 - SecondOf(Today)*6;
Timer1.Interval := 1000; // период сигнал от таймера 1 сек
Timer1.Enabled := True; // пуск таймера
end;
// вычерчивает вектор заданной длины из точки (x0,y0)
procedure TForm2.Vector(x0,y0: integer; a, l: integer);
// x0,y0 - начало вектора
// a - угол между осью x и вектором
// l - длина вектора
const
GRAD = 0.0174532; // коэффициент пересчета угла из градусов в радианы
var
x,y: integer; // координаты конца вектора
begin
Canvas.MoveTo(x0,y0);
x := Round(x0 + l*cos(a*GRAD));
y := Round(y0 - l*sin(a*GRAD));
Canvas.LineTo(x,y);
end;
// рисует стрелки
procedure TForm2.DrawClock;
var
t: TDateTime;
begin
// шаг секундной и минутной стрелок 6 градусов,
// часовой - 30.
// стереть изображение стрелок
Canvas.Pen.Color := clLime;
Canvas.Pen.Width :=3;
// часовую
Vector(x0,y0, ahr, R-30);
// минутную
Vector(x0,y0, amin, R-15);
// секундную
Vector(x0,y0, 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 := clWhite;
Vector(x0,y0, ahr, R-25);
// минутная стрелка
Canvas.Pen.Width := 2;
Canvas.Pen.Color := clWhite;
Vector(x0,y0, amin, R-10);
// секундная стрелка
Canvas.Pen.Width := 1;
Canvas.Pen.Color := clGreen;
Vector(x0,y0, asec, R-18);
end;
// прорисовка циферблата и начальных стрелок
procedure TForm2.FormPaint(Sender: TObject);
var
x,y: integer; // координаты маркера на циферблате
a: integer; // угол между OX и прямой (x0,yo) (x,y)
pc: TColor; // цвет карандаша
pw: integer; // ширина карандаша
s1,s2,s3,s4:string; //цифры циферблата
begin
pc := Canvas.Pen.Color;
pw := Canvas.Pen.Width;
Canvas.Pen.Width := 1;
Canvas.Pen.Color := clWhite;
a:=0; // метки ставим от 3-х часов, против
// часовой стрелки
// циферблат
while a < 360 do
begin
x:=x0+Round( R * cos(a*2*pi/360));
y:=x0-Round( R * sin(a*2*pi/360));
Form2.Canvas.MoveTo(x,y);
if (a mod 30) = 0
then Canvas.Ellipse(x-2,y-2,x+3,y+3)
else Canvas.Ellipse(x-1,y-1,x+1,y+1);
a:=a+6; // 1 минута - 6 градусов
begin
s1:='12';
Canvas.Font.Color :=clwhite;
Form2.Canvas.TextOut(86, 18, s1);
s2:='3' ;
Canvas.Font.Color :=clwhite;
Form2.Canvas.TextOut(165, 85, s2);
s3:='6';
Canvas.Font.Color :=clwhite;
Form2.Canvas.TextOut(89, 157, s3);
s4:='9';
Canvas.Font.Color :=clwhite;
Form2.Canvas.TextOut(15, 85, s4);
end;
end;
// восстановить карандаш кисть
Canvas.Pen.Width := pw;
Canvas.Pen.Color := pc;
END;
procedure TForm2.N2Click(Sender: TObject);
begin
end;
// прорисовка текущих положений стрелок часов
procedure TForm2.Timer1Timer(Sender: TObject);
begin
DrawClock;
form2.ClientHeight:=3*R;
form2.ClientWidth:=2*R+20;
label1.Caption:=timetostr (time); //цифровые часы
end;
end.
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TForm4 = class(TForm)
Edit1..2: TEdit;
Timer1..2: TTimer;
Button1..2: TButton;
Panel1: TPanel;
Label1..3: TLabel;
procedure Timer1Timer(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
var
st:systemtime;
Form4: TForm4;
implementation
//считываем время
procedure TForm4.Button1Click(Sender: TObject);
begin
Timer2.Enabled:=true;
end;
//сбрасываем время
procedure TForm4.Button2Click(Sender: TObject);
begin
Timer2.Enabled:=false;
end;
//Информируется текущем времени с Windows и вставляет в цифровые час
procedure TForm4.Timer1Timer(Sender: TObject);
begin
getlocaltime(ST);
Panel1.Caption:=IntToStr(ST.wHour)+':'+IntToStr(ST.wMinute)+
':'+IntToStr(ST.wSecond);
end;
//Сравнивает, если совпадает то дает сигнал
procedure TForm4.Timer2Timer(Sender: TObject);
begin
getlocaltime(ST);
if (ST.Whour=StrToInt(Edit1.Text))and (ST.WMinute=StrToInt(Edit2.Text)) then beep;
end;
end.
