Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.02.2007, 12:47   #1
VALIK
 
Регистрация: 21.02.2007
Сообщений: 4
Вопрос КАК поделить цыферблат часов на 10 равных частей?

Столкнулся с такой проблемой -- мне надо разбить цыферблат цасов не на 12 частей а на 10.

Я пыталься разбить на 10 частей в этом исходнике, но у меня нечего невышло, т.к. там разбивка задается формулой.



unit clock_;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;

type
TForm1 = class(TForm)
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure Timer1Timer(Sender: TObject);

// эти объявления вставлены вручную
procedure Vector(x0,y0,a,l: integer);
procedure DrawClock;

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


var
Form1: TForm1;

implementation
{$R *.dfm}

uses
DateUtils; // для доступа к SecondOf,
// MinuteOf и HourOf

const
R = 75 ; // радиус циферблата часов

var
x0,y0: integer; // центр циферблата
ahr,amin,asec: integer; // положение стрелок (угол)

// инициализация формы
procedure TForm1.FormCreate(Sender: TObject);
var
t: TDateTime;
begin
// зададим размер формы
// в соответствии с размером циферблата
ClientHeight := (R+10)*2;
ClientWidth := (R+10)*2;
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 TForm1.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 TForm1.DrawClock;
var
t: TDateTime;
begin
// шаг секундной и минутной стрелок 6 градусов,
// часовой - 30.

// стереть изображение стрелок
Canvas.Pen.Color := clBtnFace;
Canvas.Pen.Width :=3;
// часовую
Vector(x0,y0, ahr, R-20);
// минутную
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 := 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 TForm1.FormPaint(Sender: TObject);
var
x,y: integer; // координаты маркера на циферблате
a: integer; // угол между OX и прямой (x0,yo) (x,y)

pc: TColor; // цвет карандаша
pw: integer; // ширина карандаша
begin
pc := Canvas.Pen.Color;
pw := Canvas.Pen.Width;

Canvas.Pen.Width := 1;
Canvas.Pen.Color := clBlack;

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));
Form1.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 градусов
end;
// восстановить карандаш кисть
Canvas.Pen.Width := pw;
Canvas.Pen.Color := pc;

DrawClock;
end;


// прорисовка текущих положений стрелок часов
procedure TForm1.Timer1Timer(Sender: TObject);
begin
DrawClock;
end;

end.




Помогите плиз, если придложите чтото другое буду благодпрен.
VALIK вне форума Ответить с цитированием
Старый 28.02.2007, 13:15   #2
wiskas
Пользователь
 
Аватар для wiskas
 
Регистрация: 21.02.2007
Сообщений: 26
По умолчанию

попробуй сделать электронные часы там разбивать ничего не нада)
wiskas вне форума Ответить с цитированием
Старый 28.02.2007, 13:41   #3
SuperVisor
Павел Сергеевич
Форумчанин
 
Регистрация: 05.11.2006
Сообщений: 665
По умолчанию

Не стал пробовать код, опиши в чем именно проблема: в прорисовке часов, стрелок или и того и другого? И, кстати, а для чего тебе такие часики?
Познавая других, мы познаем себя.
С'est la vie...
SuperVisor вне форума Ответить с цитированием
Старый 28.02.2007, 14:27   #4
VALIK
 
Регистрация: 21.02.2007
Сообщений: 4
По умолчанию

Из этих часов я сделал визуальный счетчик для жидкости (мне это надо для стенда лабораторных работ по гидравлике)

Проблема именно в том чтобы слелать 10 делений (т.к. та счетчике должно быть 10 зассечек а не 12)
VALIK вне форума Ответить с цитированием
Старый 28.02.2007, 19:51   #5
ЧИЖ
Форумчанин
 
Аватар для ЧИЖ
 
Регистрация: 24.02.2007
Сообщений: 104
Восклицание

Вопервых в процедуре разбивки циферблата

a:real а не integer

и во вторых

a:=a+7.2 //сосответсвенно минута по 10 часовой шкале (если конечно в часу должно быть 5 делений)
а вообще раздели 360 на количество делений и получишь шаг
Разберемся.......
ЧИЖ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите пожалуйста при написании графических часов на С Black_Ak24 Общие вопросы C/C++ 7 12.06.2008 10:24
сколькими способами можно разрезать прямоугольник на n-ное количество частей? 4ingiz Общие вопросы Delphi 2 31.01.2008 06:40
Иконка у часов Lonix Безопасность, Шифрование 4 03.04.2007 22:49