Zegar analogowy - slady po wskazówkach

0

Witam...
Jak poprawić poniższe dyrdymały aby wskazówki nie pozostawiały sladów na tarczy zegara?

unit Unit1;

interface

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

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

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

var
  Form1: TForm1;
  stary:real;
implementation

{$R *.DFM}


procedure TForm1.Timer1Timer(Sender: TObject);
var
czas:real;
xt,yt:integer;
alfarad:real;
begin
czas:=time;
Form1.Canvas.Pen.color:=clwhite;
Form1.Canvas.Pen.Width:=1;
Form1.Canvas.MoveTo(clientwidth shr 1, clientheight shr 1);
alfarad:=stary*4*pi-pi/2;
xt:=(clientwidth+round((clientwidth shr 1)*cos(alfarad))) shr 1;
yt:=(clientheight+round((clientheight shr 1)*sin(alfarad))) shr 1;
//Form1.Canvas.LineTo(xt,yt);
//Form1.Canvas.Pen.Width:=1;
//Form1.Canvas.MoveTo(clientwidth shr 1, clientheight shr 1);
alfarad:=(round(stary*24*3600) mod 3600 - 900)*pi/1800;
xt:=(clientwidth+round((clientwidth-35)*cos(alfarad))) shr 1;
yt:=(clientheight+round((clientheight-35)*sin(alfarad))) shr 1;
Form1.Canvas.LineTo(xt,yt);

Form1.Canvas.Pen.color:=clyellow;
Form1.Canvas.Pen.Width:=3;
Form1.Canvas.MoveTo(clientwidth shr 1, clientheight shr 1);
alfarad:=czas*4*pi-pi/2;
xt:=(clientwidth+round((clientwidth shr 1)*cos(alfarad))) shr 1;
yt:=(clientheight+round((clientheight shr 1)*sin(alfarad))) shr 1;
Form1.Canvas.LineTo(xt,yt);
Form1.Canvas.Pen.Width:=1;
Form1.Canvas.Pen.color:=clgreen;
Form1.Canvas.MoveTo(clientwidth shr 1, clientheight shr 1);
alfarad:=(round(czas*24*3600) mod 60 - 15)*pi/30;
xt:=(clientwidth+round((clientwidth-25)*cos(alfarad))) shr 1;
yt:=(clientheight+round((clientheight-25)*sin(alfarad))) shr 1;
Form1.Canvas.LineTo(xt,yt);
Form1.Canvas.Pen.Width:=2;
Form1.Canvas.Pen.color:=clblue;
Form1.Canvas.MoveTo(clientwidth shr 1, clientheight shr 1);
alfarad:=(round(czas*24*3600) mod 3600 - 900)*pi/1800;
xt:=(clientwidth+round((clientwidth-35)*cos(alfarad))) shr 1;
yt:=(clientheight+round((clientheight-35)*sin(alfarad))) shr 1;
Form1.Canvas.LineTo(xt,yt);
stary:=czas;

end;

procedure TForm1.FormPaint(Sender: TObject);
var
alfa,xt,yt:integer;
alfarad:real;
begin
if clientheight < 100 then clientheight:=100;
Form1.Canvas.Pen.Color:=clWhite;
form1.Canvas.Rectangle(0,0,form1.clientwidth,form1.clientheight);
Form1.Canvas.Pen.Color:=clred;
  for alfa:=1 to 60 do
   begin
    alfarad:=(alfa*pi/30);
    xt:=(clientwidth+round(clientwidth*cos(alfarad))) shr 1;
    yt:=(clientheight+round(clientheight*sin(alfarad))) shr 1;
    Form1.Canvas.MoveTo(xt,yt);
    xt:=(clientwidth+round((clientwidth-20)*cos(alfarad))) shr 1;
    yt:=(clientheight+round((clientheight-20)*sin(alfarad))) shr 1;
    if alfa mod 5 = 0 then
       Form1.Canvas.Pen.Width:=7
       else
       Form1.Canvas.Pen.Width:=1;
    Form1.Canvas.lineTo(xt,yt);
 end;
{timer1timer(sender);}
end;

end.
1

Przed narysowaniem strzałki narysuj ją na starym miejscu w kolorze tarczy lub przerysuj całą tarczę.

0

A jak to będzie wyglądać w programie? Tzn. nie jestem totalnym laikiem jesli chodzi o Delphi, ale nie bardzo wiem gdzie co wstawić w tak rozbudowanym dosyć programie..:/

0

Dokładnie tak jak wygląda teraz, tylko że masz dwa rozwiązania.

  1. rysujesz wszystko od początku za każdym razem: wystarczy przenieść fragmenty kodu;
  2. najpierw usuwa stare strzałki: kopiujesz fragment kodu rysujący te strzałki; przerabiasz aby rysowali czas o jedną sekundę wstecz; przerabiasz aby ten fragment rysował strzałki w kolorze tła; wstawiasz ten fragment przed właściwym rysowaniem strzałek.

1 użytkowników online, w tym zalogowanych: 0, gości: 1