Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ Часы с маятником

Автор: sheka 20.12.2009 2:55

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Timer1: TTimer;
Image0: TImage;
Timer2: TTimer;
Image2: TImage;
Image1: TImage;
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

const
cl1=clblack;
x0=100;
w1=2;
y1=100;
L1=70;
w2=3;
L2=60;
w3=4;
L3=40;

cl4=clBlack;
w4=10;
A=50;
L4=330;
L40=130;
t0=1000;
y4=-120;

r=20;

var
w:real;
t:integer;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
with image1.Canvas do
begin
Brush.Color := ClWhite;
FillRect(Canvas.ClipRect);
pen.Color:=cl1;
pen.Width:=w1;
moveto(x0,y1);
lineto(x0+round(L1*cos(SecondOf(now)*6*pi/180-pi/2)),y1+round(L1*sin(SecondOf(now)*6*pi/180-pi/2)));
pen.Width:=w2;
moveto(x0,y1);
lineto(x0+round(L2*cos(MinuteOf(now)*6*pi/180-pi/2)),y1+round(L2*sin(MinuteOf(now)*6*pi/180-pi/2)));
pen.Width:=w3;
moveto(x0,y1);
lineto(x0+round(L3*cos(HourOf(now)*15*pi/180-pi/2)),y1+round(L3*sin(HourOf(now)*15*pi/180-pi/2)));
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
w:=2*pi/(T0*0.001);;
end;

procedure TForm1.Timer2Timer(Sender: TObject);
var
x,y:integer;
f:real;
begin
with image2.Canvas do
begin
x:=round(A*sin(w*t*0.01));
y:=round(sqrt(L4*L4-x*x));
f:=arctan(x/y);

Brush.Color := ClWhite;
FillRect(Canvas.ClipRect);
pen.Color:=cl4;
brush.Color:=cl4;
pen.Width:=w4;
MoveTo(x0+round(L40*sin(f{-pi/2})),y4+round(L40*cos(f{-pi/2})));
LineTo(x0+x,y4+y);
pie(x0+x-r,y4+y-r,x0+x+r,y4+y+r,0,0,0,0);
end;
inc(t);
if t=t0 then t:=0;
end;

end.

Прикрепленный файл  Project1.rar ( 255.14 килобайт ) Кол-во скачиваний: 473

вот код. все работает, но так как Transparent картинки маятника установлено в true, оно очень моргает. подскажите как от этого избавиться.

Автор: volvo 20.12.2009 3:05

Ты б лучше проект присоединил полностью (с картинками), а не EXE-шник, а то неизвестно, что там у тебя в настройках формы творится, в частности DoubleBuffered = True или нет...

Автор: sheka 20.12.2009 3:38

Установил в OnCreate формы
form1.DoubleBuffered:=true;
работает!


Добавлено через 11 мин.
Назначение этого свойства понял. А что оно вообще делает? чаще сохраняет какие-то изменяющиеся данные экрана? и забирает много ресурсов поэтому автоматически не стоит?
Извините, просто нигде эту информацию не нашел

Автор: volvo 20.12.2009 5:08

Что такое http://ru.wikipedia.org/wiki/%D0%94%D0%B2%D0%BE%D0%B9%D0%BD%D0%B0%D1%8F_%D0%B1%D1%83%D1%84%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F, знаешь?

Автор: sheka 20.12.2009 5:16

Ну по этому принципу в паскале происходит работа с видеостраницами. Перед тем как создать тему и задать вопрос пробовал сам сделать что-то подобное: две картинки, поочередно меняется их свойство visible, и в этот же момент отрисовывается новое положение на невидимой картинке, потом все заново. Только почему- то эффекта это не дало.