![]() |
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 |
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; |
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:
Mit einem Timer würde ich das so lösen:
procedure Pause(time: Integer);
var t: Cardinal; begin t := GetTickCount; while GetTickCount - t <= time do Application.ProcessMessages; end;
Code:
object Timer1: TTimer
Interval = 3000 end ----------- procedure TForm1.Timer1Timer(Sender: TObject); begin Button1.Enabled := not Button1.Enabled; end; |
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; |
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. |
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. |
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. |
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 10:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz