ich möchte ein TShape langsam "herunterfallen" lassen. Dafür soll "Top" vom TShape jede Sekunde inkrementiert werden, aber ich möchte, dass man z.B. weiterhin einen Button drücken kann, der das Programm schließt (oder andere Sachen). Dafür habe ich folgenden Code im Internet gefunden:
var
t, sn: double;
begin
sn := 1;
t := Now + (1.0/24.0/60.0/60.0) * sn;
repeat
Application.ProcessMessages;
until Now > t;
end;
Funktioniert eigentlich ganz gut, jetzt das Problem: Solange der Fokus auf Button1 liegt (den Code oben habe ich in Button1.Click eingebaut) nimmt er noch andere Eingaben an, aber sobald das nicht mehr der Fall ist -ich z.B. einen andere Button anklicke- nimmt er auch keinen anderen Eingaben an.
Ein Timer ist sicher eine gute Sache, aber will man möglichst viel in der Schleife abarbeiten, kann man folgendes machen.
Will man aber eine konstante Geschwindigkeit, wie es bei deiner Shape der Fall sein soll, ist ein Timer vorzuziehen.
procedure TForm1.Button1Click(Sender: TObject);
begin
Ende := False;
repeat
Canvas.Pen.Color := Random($FFFFFF);
Canvas.LineTo(Random(ClientWidth), Random(ClientHeight));
Application.ProcessMessages;
until Ende;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Ende := True;
end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mathias hat geschrieben:Ein Timer ist sicher eine gute Sache, aber will man möglichst viel in der Schleife abarbeiten, kann man folgendes machen.
Will man aber eine konstante Geschwindigkeit, wie es bei deiner Shape der Fall sein soll, ist ein Timer vorzuziehen.
procedure TForm1.Button1Click(Sender: TObject);
begin
Ende := False;
repeat
Canvas.Pen.Color := Random($FFFFFF);
Canvas.LineTo(Random(ClientWidth), Random(ClientHeight));
Application.ProcessMessages;
until Ende;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Ende := True;
end;
Wenn man in der Schleife arbeiten möchte sollte man einfach das Idle Event verwenden, da blockt man garantiert nichts und schöner ist es alle mal