Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Blinken mit Timer (https://www.delphipraxis.net/211-blinken-mit-timer.html)

Privateer3000 20. Jun 2002 16:54


Blinken mit Timer
 
Hallo Leuts,

wie kann man einen Timer so programmieren das er einen Befehl ausführt im
z.B. 3 sek-Takt.
z.B.:
Button1.Enabled := True;
(2 sek lang...)
Button1.Enabled := False;
.
.
.
.
Ergo er blinkt
Der Button ist natürlich nur ein Beispiel, aber sollte mit jeder anderen Komponente auch gehen.

Grüsse

toms 20. Jun 2002 16:58

Hi,

Ich würde keinen Timer nehmen sondern z.B Sleep.

Code:
procedure BlinkComponent(AControl: TControl);
begin
 AControl.Enabled := False;
 Sleep(1000);
 AControl.Enabled := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 i: Byte;
begin
 for i := 1 to 3 do
   BlinkComponent(Button1);
end;

jbg 20. Jun 2002 17:03

Und der Nebeneffekt ist, dass der Button nie Disabled dargestellt wird, da du mit Sleep das ganze Programm einfrierst und Windows den Button nicht neu zeichen (Status grafisch ändern) kann.

Alternative zu Sleep:
Code:
procedure Pause(time: Integer);
var t: Cardinal;
begin
   t := GetTickCount;
   while GetTickCount - t <= time do Application.ProcessMessages;
end;
Mit einem Timer würde ich das so lösen:
Code:
object Timer1: TTimer
  Interval = 3000
end
-----------
procedure TForm1.Timer1Timer(Sender: TObject);
begin
   Button1.Enabled := not Button1.Enabled;
end;

toms 20. Jun 2002 17:07

Wenn wir grad bei Pause sind. Ich würde deine Pause Funktion noch so optimieren,
damit die CPU Auslastung nicht zu hoch ist:
(Nicht unbedingt für obige Fragestellung relevant)

Code:
procedure Pause(time: Integer);
var
  t: Cardinal;
begin
  t := GetTickCount;
  while GetTickCount - t <= time do
  begin
    Application.ProcessMessages;
    Sleep(100);
  end;
end;

Privateer3000 20. Jun 2002 17:59

Danke an alle!

Ich glaube ich hab noch nicht alles verstanden?!

@jbg
Stimmt es das das ganze Programm einfriert???Das wäre fatal.
Die Beispiele sind für mich noch Bahnhof.Erklär mir das mal bitte in Deutsch.
Sieht nämlich sehr plausibel.

jbg 20. Jun 2002 18:33

Der Sleep-Befehl sagt Windows, dass dein Programm bzw. der Thread, der Sleep aufruft, (was in deinem Fall der Hauptthread ist) seine Rechenzeit für ms Millisekunden abgibt. Dadurch weiß Windows dann, dass dein Programm keine Rechenleistung in dieser Zeit benötigt und das Programm steht dann. Erst wenn die an Sleep übergebene Zeit vorbei ist, wird der Thread weiter ausgeführt und alle bis dahin aufgeschobenen Botschaften (Mouse, Tastatur, Neuzeichen, ...) können wieder abgearbeitet werden.

Mit der Methode Application.ProcessMessages lässt man Windows die anstehenden Botschaften abarbeiten. Dies verringert zwar die Geschwindigkeit deines Programms, aber der Anwender bekommt nicht den Eindruck, dass das Programm in einer Endlosschleife gefangen ist.

Christian Seehase 20. Jun 2002 18:40

Moin jbg,

kleine Korrektur (ich geh' mal davon aus, dass das ein Flüchtigkeitsfehler war):
Durch Application.ProcessMessages bekommt der Thread die Gelegenheit anstehende Windows Messages zu verarbeiten.
Eine Verzögerung dadurch findet allerdings auch nur dann statt, wenn den Messages zu verarbeiten sind. Lässt man das Programm weitestgehend in Ruhe, ist i.d.R. keine grosse Verzögerung zu spüren.

Privateer3000 20. Jun 2002 20:01

Also, für ein Nub wie mich war diese Version die beste:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Button1.Enabled := not Button1.Enabled;
end;

geht einwandfrei!!!

Danke


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz