AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Blinken mit Timer

Ein Thema von Privateer3000 · begonnen am 20. Jun 2002 · letzter Beitrag vom 20. Jun 2002
Antwort Antwort
Benutzerbild von Privateer3000
Privateer3000

Registriert seit: 10. Jun 2002
Ort: Jena
1.128 Beiträge
 
Delphi 10.4 Sydney
 
#1

Blinken mit Timer

  Alt 20. Jun 2002, 17:54
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
Peter
+++Versuch es nicht mit Gewalt + Nimm einen größeren Hammer! +++
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#2
  Alt 20. Jun 2002, 17: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;
Thomas
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3
  Alt 20. Jun 2002, 18: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;
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#4
  Alt 20. Jun 2002, 18: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;
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von Privateer3000
Privateer3000

Registriert seit: 10. Jun 2002
Ort: Jena
1.128 Beiträge
 
Delphi 10.4 Sydney
 
#5
  Alt 20. Jun 2002, 18: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.
Peter
+++Versuch es nicht mit Gewalt + Nimm einen größeren Hammer! +++
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#6
  Alt 20. Jun 2002, 19: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.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#7
  Alt 20. Jun 2002, 19: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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Privateer3000
Privateer3000

Registriert seit: 10. Jun 2002
Ort: Jena
1.128 Beiträge
 
Delphi 10.4 Sydney
 
#8
  Alt 20. Jun 2002, 21: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
Peter
+++Versuch es nicht mit Gewalt + Nimm einen größeren Hammer! +++
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:04 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