Помощь - Поиск - Пользователи - Календарь
Полная версия: Аналоговые часы фиксированного размера
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
Rocket
Вот программа,которая создает аналоговые часы,которые выводят текущее время в часах, минутах и секундах. Нажатие пользователя мышью на компонент изменяет часовой пояс – нажатие в левой половине компонента увеличивает смещение, влевой – уменьшает.

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, TeeProcs, TeEngine, Chart, Buttons, ComCtrls,
ToolWin, ActnMan, ActnCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Timer1: TTimer;
Label1: TLabel;
Label2: TLabel;
procedure DrawArrows (DrawColor: TColor);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
KooRX,KooRY,Rad:Integer;
Arrow_H,Arrow_M,Arrow_S:Integer;
H,M,S,MS:Word;
HourAngle,MinAngle,SecAngle:Real;
i,c:integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender:TObject);
begin
Form1.BorderStyle:=bsSingle; //устанавливаем границы
Form1.BorderIcons:=[biSystemMenu,biMinimize]; // вид границ
Timer1.Interval:=1000;
Timer1.Enabled:=false;
KooRY:=Form1.ClientHeight div 2;
KooRX:=KooRY;
Rad:=KooRX-20;
Arrow_H:=Rad-30;
Arrow_M:=Rad-20;
Arrow_S:=Rad-10;
i:=0;
end;

procedure TForm1.FormPaint(Sender:TObject);
var i:integer;
begin
//Прорисовка циферблата
with Form1.Canvas do begin
//Вывод окружности
Pen.Color:=clAqua; // цвет линии
Pen.Width:=6; //толщиналинии
Brush.Color:=clblack; // цвет заливки
Ellipse(20,20,20+2*Rad,20+2*Rad);
Pen.Width:=2;
//Вывод рисок
for i:=0 to 11 do begin
moveto(KooRx+round((rad-9)*sin(i/6*pi)),
KooRy-round((rad-9)*cos(i/6*pi))); // переход на координаты
lineto(KooRx+round((rad)*sin(i/6*pi)), //рисование лини
KooRy-round((rad)*cos(i/6*pi)));
end;
//Вывод цифр
Font.Height:=10; //размер шрифта
Font.Color:=clBlack; //цвет шрифта
Brush.Color:=Form1.Color;
TextOut(KooRX-TextWidth('12') div 2,KooRY-Rad-TextHeight('12')-5,'12'); // вывод значений на циферблат
TextOut(KooRX+Rad+5,KooRY- TextHeight('3'),'3');
TextOut(KooRX-TextWidth('6') div 2,KooRY+Rad+5,'6');
TextOut(KooRX-Rad-TextWidth('9')-5,KooRY-TextHeight('9'),'9');
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if Button1.caption='Start' then begin
// zapusk chasov
drawarrows(clblack); //заливка
decodetime(time,h,m,s,ms); //считыввание времени
hourangle:=(h+i mod 12)/12*(2*pi);
minangle:=m / 60 * (2*pi);
secangle:=s / 60 * (2*pi);
drawarrows(clred);
Button1.Caption:='Stop';
timer1.Enabled:=true;
end
else begin
//ostanovka chasov
Button1.caption:='Start';
timer1.Enabled:=false;
end;
end;

procedure TForm1.Timer1Timer(Sender:TObject);
begin
//Стереть стрелки
drawarrows(clblack);
//narisovat strlki na novom meste
decodetime(time,h,m,s,ms);
hourangle:= (h+i mod 12)/12 * (2*pi);
minangle:=m / 60 * (2*pi);
secangle:=s / 60 * (2*pi);
drawarrows(clred);
Label1.Caption:=TimeToStr(Time);//Отображение текущего значения времени
end;

procedure tform1.drawarrows(drawcolor: tcolor);
begin
with form1.canvas do begin
pen.color:=drawcolor;
moveto(KooRx,KooRy);
//chasovaia strlka
pen.width:=4;
lineto(KooRx+round(arrow_H*sin(hourangle)),
KooRy-round(arrow_H*cos(hourangle)));
moveto(KooRx,KooRy);
//minutnaia strlka
pen.width:=3;
lineto(KooRx+round(arrow_M*sin(minangle)),
KooRy-round(arrow_M*cos(minangle)));
moveto(KooRx,KooRy);
//sekundnaia strlka
pen.width:=1;
lineto(KooRx+round(arrow_S*sin(secangle)),
KooRy-round(arrow_S*cos(secangle)));
end;
end;



procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
C:=Form1.ClientHeight div 2;
if x>c then i:=i+1
else i:=i-1;
end;

end.


Всё работает хорошо. Проблема заключается в том,что нужно создать и добавить свой компонет, а я не знаю как это сделать и связать это с моими часами. Пожайлуста, подскажите как организовать компонент! smile.gif очень нужно...
volvo
О создании собственных компонентов читай, например, тут:

http://www.citforum.ru/programming/32less/les41.shtml
Rocket
Цитата(volvo @ 17.06.2007 18:26) *

О создании собственных компонентов читай, например, тут:

http://www.citforum.ru/programming/32less/les41.shtml

Ну, а для моей программы какой-нибудь компонент по-быстрому накидать не можете помочь? Пожалуйста! yes2.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.