Application.ProcessMessages

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Vincman
Beiträge: 16
Registriert: So 5. Feb 2017, 12:35

Application.ProcessMessages

Beitrag von Vincman »

Hallo,

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:

Code: Alles auswählen

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.

Danke im Vorraus,
Gruß Vincman

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Application.ProcessMessages

Beitrag von m.fuchs »

Was spricht gegen die Nutzung eines Timers?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Application.ProcessMessages

Beitrag von mschnell »

Vincman hat geschrieben: repeat
Application.ProcessMessages;
until Now > t;

Ganz schlechte Methode, weil es den kompletten Rechner lahmlegt.

Lazarus hat dafür TTimer.

Wann der Button Eingaben annimmt kann man über "Enable" sauber steuern.

-Michael

Vincman
Beiträge: 16
Registriert: So 5. Feb 2017, 12:35

Re: Application.ProcessMessages

Beitrag von Vincman »

Vielen Dank!

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Application.ProcessMessages

Beitrag von Warf »

Ach ja statt deinem komischen Code für die Zeitberechnung solltest du lieber die Funktionen aus der DateUtils Unit verwenden wie z.B. IncSecond

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Application.ProcessMessages

Beitrag von Mathias »

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.

Code: Alles auswählen

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

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Application.ProcessMessages

Beitrag von Warf »

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.

Code: Alles auswählen

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

Antworten