Application.ProcessMessages

Für Fragen von Einsteigern und Programmieranfängern...

Application.ProcessMessages

Beitragvon Vincman » 11. Feb 2017, 18:41 Application.ProcessMessages

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
Vincman
 
Beiträge: 16
Registriert: 5. Feb 2017, 12:35

Beitragvon m.fuchs » 11. Feb 2017, 19:19 Re: Application.ProcessMessages

Was spricht gegen die Nutzung eines Timers?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
m.fuchs
 
Beiträge: 1687
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (L 1.6, FPC 3.0) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon mschnell » 11. Feb 2017, 22:51 Re: Application.ProcessMessages

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
mschnell
 
Beiträge: 3159
Registriert: 11. Sep 2006, 09:24
Wohnort: Krefeld
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ) | 
CPU-Target: X32 / X64 / ARMv5
Nach oben

Beitragvon Vincman » 11. Feb 2017, 22:56 Re: Application.ProcessMessages

Vielen Dank!
Vincman
 
Beiträge: 16
Registriert: 5. Feb 2017, 12:35

Beitragvon Warf » 11. Feb 2017, 23:45 Re: Application.ProcessMessages

Ach ja statt deinem komischen Code für die Zeitberechnung solltest du lieber die Funktionen aus der DateUtils Unit verwenden wie z.B. IncSecond
Warf
 
Beiträge: 616
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon Mathias » 12. Feb 2017, 18:22 Re: Application.ProcessMessages

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3251
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Warf » 12. Feb 2017, 20:53 Re: Application.ProcessMessages

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
Warf
 
Beiträge: 616
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

• Themenende •

Zurück zu Einsteigerfragen



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried