Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.03.27;
Скачать: [xml.tar.bz2];

Вниз

Как написать часы со стрелками?   Найти похожие ветки 

 
tazik ©   (2005-03-15 21:17) [0]

Приспичило, а мозги не варят :) Помогите, чем сможете :)


 
Fenik   (2005-03-15 21:23) [1]

"Часы со стрелками". ты же сам уже правильно написал.


 
Leeechhhh   (2005-03-15 21:28) [2]

не, правильно "чисы са стрелкоми"

по теме: заюзай чейнить апишный компонент, или вобьми гденить гиф полноанимированного круга часов


 
tazik ©   (2005-03-15 21:29) [3]

Да ладно вам, ну может есть исходники. Вообщето мне нужно под turbo pascal


 
tazik ©   (2005-03-15 21:33) [4]

Да нет мне нужно стрелки самому рисовать. Я пробовал так:

var I: integer;
...
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Canvas.Pen.Color := clBlue;
Canvas.MoveTo(150,150);
for I := 0 to 360 do
Canvas.LineTo(Trunc(sin(i)),Trunc(cos(i)));
end;


 
Fenik   (2005-03-15 21:39) [5]

Canvas.MoveTo(Center.x, Center.y);
Canvas.LineTo(Center.x + Trunc(sin(i))*Radius, Center.y + Trunc(cos(i))*Radius);


 
tazik ©   (2005-03-15 21:40) [6]

Благодарю!


 
Virgo_Style ©   (2005-03-15 21:41) [7]


> Trunc(sin(i)),Trunc(cos(i))

Ох. А что, настало военное время, когда синус может быть больше единицы?


 
Fenik   (2005-03-15 21:42) [8]

sin(DegToRad(i)) !!


 
tazik ©   (2005-03-15 21:42) [9]

Дело в том, что LineTo требует integer-значения, вот я их и округляю. А увас есть предложение?


 
begin...end ©   (2005-03-15 21:44) [10]

> Fenik   (15.03.05 21:39) [5]

> Center.x + Trunc(sin(i))*Radius

Думаю, лучше было бы так: Center.x + Trunc(Sin(i) * Radius).

Потому что Trunc(Sin(...)) всегда будет равен либо -1, либо 0, либо 1.


 
tazik ©   (2005-03-15 21:44) [11]

Очень странно!!! У меня рисуется только крестик и все!


 
Fenik   (2005-03-15 21:46) [12]

>begin...end ©  (15.03.05 21:44) [10]

Верно :)


 
tazik ©   (2005-03-15 21:47) [13]

А теперь и вовсе только точка на форме!


 
begin...end ©   (2005-03-15 22:01) [14]

> tazik ©   (15.03.05 21:47) [13]

procedure TForm1.Timer1Timer(Sender: TObject);
const
 Radius = 100;
 X0     = 150;
 Y0     = 150;
begin
 if I < 59 then
   Inc(I)
 else
   I := 0;
 Refresh;
 Canvas.MoveTo(X0, Y0);
 Canvas.LineTo(X0 + Trunc(Sin(DegToRad(I * 6)) * Radius), Y0 - Trunc(Cos(DegToRad(I * 6)) * Radius))
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Canvas.Pen.Color := clBlue
end


Этот пример показывает только общий принцип вычисления координат конца очередной линии (через каждую секунду, например). Не более того.


 
begin...end ©   (2005-03-15 22:01) [15]

Забыл добавить: uses Math.


 
Юрий Зотов ©   (2005-03-15 22:34) [16]

И, конечно же, высшее образование...
Эх...


 
DrPass ©   (2005-03-16 00:33) [17]

Тригонометрию, кажется, в седьмом классе проходят :)


 
Германн ©   (2005-03-16 02:26) [18]

Мне больше всего понравилось:

>tazik ©   (15.03.05 21:29) [3]
>>Да ладно вам, ну может есть исходники. Вообщето мне нужно под >>turbo pascal

--------------------------------------------------------------------------------
>tazik ©   (15.03.05 21:33) [4]
>>Да нет мне нужно стрелки самому рисовать. Я пробовал так:

>>var I: integer;
...
>>procedure TForm1.Timer1Timer(Sender: TObject);
>>begin
>>Canvas.Pen.Color := clBlue;
>>Canvas.MoveTo(150,150);
>>for I := 0 to 360 do
>>Canvas.LineTo(Trunc(sin(i)),Trunc(cos(i)));
>>end;

И где-ж это все он нашел в turbo pascal?


 
SergP ©   (2005-03-16 07:21) [19]


>  tazik ©   (15.03.05 21:17)
> Приспичило, а мозги не варят :) Помогите, чем сможете :)


приблизиельно так:
Ищешь в инете флеш с часами (их дофига всяких разных есть).
Кидаешь на форму TWebbrowser, пишешь небольшую htm, засовываешь все что нужно в ресурсы.

:-))))


 
Руслана   (2005-03-16 09:10) [20]

Оставь мыло - вышлю


 
Kerk ©   (2005-03-16 09:25) [21]

program clock; {$N+}

uses Crt,Dos;

const
 ClockRadius = 80;
 SecArrow    = ClockRadius * 0.85;
 MinArrow    = ClockRadius * 0.80;
 HouArrow    = ClockRadius * 0.50;
 ScaleFactor = 1.2;
 CenterX     = 160;
 CenterY     = 100;

var
 H,M,S,S100: Word;

procedure Delay(msec: Word); assembler;
asm
 push ds
 mov ax,msec
 xor dx,dx
 mov ds,dx
 mov cx,55
 div cx
 add ax,word ptr ds:[46ch]
@@wait:
 cmp ax,word ptr ds:[46ch]
 jnc @@wait
 pop ds
end;

procedure PutPixel(x,y: Word; color: Byte);
begin
 mem[$A000:y*320+x] := color;
end;

function GetPixel(x,y :Word): Byte;
begin
 GetPixel := mem[$A000:y*320+x];
end;

procedure SetMode(Mode: Byte); assembler;
asm
 xor ax,ax
 mov al,Mode
 int 10h
end;

procedure Circle(X,Y,R: Word; Color: Byte);
var
 x1,y1,sigma,delta: Integer;
 f: Boolean;
begin
 x1 := 0; y1 := r;
 delta := 2*(1-r);
 while y1 >= 0 do
 begin
   PutPixel(x+x1,y+y1,color);
   PutPixel(x-x1,y+y1,color);
   PutPixel(x+x1,y-y1,color);
   PutPixel(x-x1,y-y1,color);
   
   f := False;
   if delta < 0 then
   begin
     sigma := 2*(delta+y1)-1;
     if sigma <= 0 then
     begin
       Inc(x1); f  := True;
       delta := delta + 2*x1+1;
     end;
   end else if delta > 0 then
   begin
     sigma := 2*(delta-x1)-1;
     if sigma > 0 then
     begin
       Dec(y1); f := True;
       delta := delta + 1-2*y1;
     end;
   end;
   if not f then
   begin
     Inc(x1); Dec(y1);
     delta := delta + 2*(x1-y1-1);
   end;
 end;
end;

Procedure Line(SX,SY,EX,EY:Integer; Color: Byte);
var
 t,dist,Xerr,Yerr,DX,DY,INCX,INCY: Integer;
Begin
 Xerr:=0; Yerr:=0;
 DX:=EX-SX; DY:=EY-SY;
 INCX:=1; INCY:=1;
 if DX = 0 then INCX := 0;
 if DX < 0 then INCX := -1;
 if DY = 0 then INCY := 0;
 if DY < 0 then INCY := -1;
 DX := Abs(DX); DY := Abs(DY);
 if DX > DY then Dist := DX else Dist := DY;
 Xerr := DX; Yerr := DY;
 for t := 0 to dist do
 begin
   PutPixel(Sx,Sy,Color);
   Xerr := Xerr + DX; Yerr := Yerr + DY;
   if Xerr > Dist then
   begin
     Xerr := Xerr - dist;
     Sx := Sx + INCX;
   end;
   if Yerr > Dist then
   begin
     Yerr := Yerr - dist;
     Sy := Sy + INCY;
   end;
 end;
end;

procedure Fill(X,Y: Word; Color: byte);
var
 MyColor: Byte;
 xr,xl,i: Word;
begin
 MyColor := GetPixel(X,Y);
 xr := x; xl := x-1;
 while GetPixel(xr,y) = MyColor do
 begin
   PutPixel(xr,y,Color);
   Inc(xr);
 end;
 while GetPixel(xl,y) = MyColor do
 begin
   PutPixel(xl,y,Color);
   Dec(xl);
 end;
 for i := xl+1 to xr-1 do
 begin
   if GetPixel(i,y+1) = MyColor then Fill(i,y+1,color);
   if GetPixel(i,y-1) = MyColor then Fill(i,y-1,color);
 end;
end;

procedure DrawMarks;
var
 i: Byte;
 x,y: Word;
begin
 for i := 0 to 11 do
 begin
   x := Round((CenterX+ClockRadius*cos(i*pi/6)*ScaleFactor));
   y := Round(CenterY-ClockRadius*sin(i*pi/6));
   Circle(x,y,2,1);
   Fill(x,y,1);
 end;
end;

procedure DrawArrows;
var
 Angle: Double;
begin
 Angle := 2*Pi*(m+45)/60;
 Line(CenterX,CenterY,Round(CenterX+MinArrow*cos(Angle)*ScaleFactor),
   Round(CenterY+MinArrow*sin(Angle)),0);
 Angle := 2 * Pi * (H + 9 + M / 60) / 12;
 Line(CenterX,CenterY,Round(CenterX+HouArrow*cos(Angle)*ScaleFactor),
   Round(CenterY+HouArrow*sin(Angle)),0);
 Angle := 2 * Pi * (S + 45) / 60;  
 Line(CenterX,CenterY,Round(CenterX+SecArrow*cos(Angle)*ScaleFactor),
   Round(CenterY+SecArrow*sin(Angle)),0);
 GetTime(H,M,S,S100);
 Angle := 2*Pi*(m+45)/60;
 Line(CenterX,CenterY,Round(CenterX+MinArrow*cos(Angle)*ScaleFactor),
   Round(CenterY+MinArrow*sin(Angle)),2);
 Angle := 2 * Pi * (H + 9 + M / 60) / 12;
 Line(CenterX,CenterY,Round(CenterX+HouArrow*cos(Angle)*ScaleFactor),
   Round(CenterY+HouArrow*sin(Angle)),2);
 Angle := 2 * Pi * (S + 45) / 60;  
 Line(CenterX,CenterY,Round(CenterX+SecArrow*cos(Angle)*ScaleFactor),
   Round(CenterY+SecArrow*sin(Angle)),4);
end;

begin
 SetMode($13);
 DrawMarks;
 repeat
   DrawArrows;
   Delay(1000);
 until KeyPressed;
 SetMode(3);
end.


 
Kerk ©   (2005-03-16 09:29) [22]

Kerk ©   (16.03.05 9:25) [21]

писано на 2м курсе. детали работы разбирать влом. сам давай.


 
Чапаев ©   (2005-03-16 10:26) [23]

> Ох. А что, настало военное время, когда синус может быть больше единицы?
Нет. Зато при выполнении приведенного кода часики будут очаровательно-военными -- "стрелки" будут тянуться к всего пяти точечкам. %*)

ЗЫ. Смех без причины -- признак неоконченного высшего образования.


 
TUser ©   (2005-03-16 12:30) [24]

Эх, могу дома покопаться. Один из первых "проектов"



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.03.27;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.052 c
14-1109937712
ex080D:07BBh
2005-03-04 15:01
2005.03.27
Пропаганда США?


1-1110308995
Дельфин
2005-03-08 22:09
2005.03.27
Консольные приложения


1-1110804922
starik30
2005-03-14 15:55
2005.03.27
Обработка нажатия клавиш ALT+ в Application.OnMessage


1-1110703188
Wistful
2005-03-13 11:39
2005.03.27
Html в TXT


3-1109582625
NeyroSpace
2005-02-28 12:23
2005.03.27
Нужно написать SQL запрос к таблицам EXCEL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский