Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задание на Дельфи.doc
Скачиваний:
7
Добавлен:
01.05.2025
Размер:
1 Мб
Скачать
☆

35. Напишите программу, которая в диалоговом окне выводит изображение идущих часов с часовой, минутной и секундной стрелками (рис. 1.33).

Рис. 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.