Wenn du das ganze machen willst, um den Umgang mit Threads zu üben, kannst du das machen. Allerdings musst du bedenken, dass die
VCL nicht threadsafe ist und du alle Zugriffe auf das Canvas mit Synchronize absichern musst.
Andernfalls würde ich dir vorschlagen, die Sterne mitsamt ihrem jeweiligen "Enstehungszeitpunkt" und "Todeszeitpunkt" in einer Liste oder einem Array zu speichern und einen TTimer mit kleinem Intervall (z.B. 20ms) zu verwenden. Z.B. so (ungetestet, nur zur Illustration):
Delphi-Quellcode:
TStern = record
a,b: integer;
start: integer;
ende: integer;
end;
var
Sterne: array[0..49] of TStern;
procedure SternZeichnen(const Stern: TStern; const Farbe: TColor);
begin
Form1.Canvas.Pen.Color:=Farbe;
Form1.Canvas.MoveTo(Stern.a,Stern.b);
Form1.Canvas.LineTo((Stern.a+5),Stern.b);
Form1.Canvas.MoveTo(Stern.a,Stern.b);
Form1.Canvas.LineTo(Stern.a,Stern.b-5);
Form1.Canvas.MoveTo(Stern.a,Stern.b);
Form1.Canvas.LineTo(Stern.a,Stern.b+5);
Form1.Canvas.MoveTo(Stern.a,Stern.b);
Form1.Canvas.LineTo(Stern.a-5,Stern.b);
end;
procedure SternNeu(var Stern: TStern);
var
Zeit: integer;
y: integer;
begin
Zeit := GetTickCount;
y := random(400) + 100;
Stern.start := Zeit + y;
Stern.ende := Stern.start + y;
Stern.a := random(800);
Stern.b := random(800) - 10;
end;
procedure TForm1.Timer1Timer;
var
i: integer;
Zeit: integer;
begin
Zeit := GetTickCount;
for i := low(Sterne) to high(Sterne) do
begin
if Sterne[i].ende < Zeit then
begin
SternZeichnen(Sterne[i], clBlack);
SternNeu(Sterne[i]);
end;
if Sterne[i].start < Zeit then
SternZeichnen(Sterne[i], clYellow);
end;
end;