Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Timer mit delay (https://www.delphipraxis.net/69371-timer-mit-delay.html)

Zidane 14. Mai 2006 14:04


Timer mit delay
 
Hallo,

ich möchte einen Timer so einbauen, dass während der Timer Prozedur eine gewisse Zeit gewartet wird.
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
     Form1.ShapeRot.Brush.Color := clred;
     Form1.ShapeGelb.Brush.Color := clyellow;
     //hier 2 Sekunden warten
     Form1.ShapeRot.Brush.Color := clwhite;
     Form1.ShapeGelb.Brush.Color := clwhite;
     Form1.ShapeGruen.Brush.Color := cllime;
end;
Wenn ich die Anwendung so abrufe springt das untere Shape (soll eine Ampel sein, oben ShapeRot, dann ShapeGelb, dann ShapeGruen) direkt auf grün, sprich nur Form1.ShapeGruen.Brush.Color := cllime; wird ausgeführt. Hab ich irgendetwas übersehen warum die anderen beiden Shapes nicht vorher noch eingefärbt werden?

Und, um auf meine eigentliche Frage zurückzukommen, wie baue ich eine Art Verzögerung bei "//hier 2 Sekunden warten" ein? Habe bereits gesucht, aber unter delay finde ich nichts und sleep friert das ganze ein, aber ich möchte ja nur, so. oben, 2 Sekunden warten! :D

Danke und viele Grüße,

Zidane

Matze 14. Mai 2006 14:09

Re: Timer mit delay
 
Hi,

ein Delay in einem Timer ist irgendwie unlogisch. Ich würde wohl den Timer auf ein Intervall wie 1 Sek stellen (gehen natürlich auch kleinere), eine Variable hochzählen lassen und so die Wartezeit umsetzen:

Delphi-Quellcode:
inc(CounterVar);

...

// bei Intervall 1000 sind das nun 2 Sek
if CounterVar = 2 then
begin
  // Code ausführen
  CounterVar := 0;
end;

MrKnogge 14. Mai 2006 14:13

Re: Timer mit delay
 
Zitat:

Zitat von Zidane
sprich nur Form1.ShapeGruen.Brush.Color := cllime; wird ausgeführt.?

Ich würde behaupten, dass alles ausgeführt wird, aber dein Shape nicht neugezeichnet wird.

gruss

Zidane 14. Mai 2006 14:24

Re: Timer mit delay
 
@Matze: Danke, klingt gut, aber ich habe mit dem implementieren Probleme.
Hab CounterVar deklariert aber weiß nun nicht genau wo ich das Inc einbinden soll.

Delphi-Quellcode:
var
  Form1: TForm1;
  CounterVar: Integer;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
     Timer1.Enabled := true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Inc(CounterVar);
end;

begin
      // bei Intervall 1000 sind das nun 2 Sek
     if CounterVar = 2 then
     Form1.ShapeRot.Brush.Color := clred;
     Form1.ShapeGelb.Brush.Color := clyellow;
     Form1.ShapeRot.Brush.Color := clwhite;
     Form1.ShapeGelb.Brush.Color := clwhite;
     Form1.ShapeGruen.Brush.Color := cllime;
     CounterVar := 0;
end;

end.
@MrKnogge: Wenn alles ausgeführt werden würde könnte man aber bevor ShapeGruen aber lime umgestellt wird die anderen beiden Shapeumänderungen erkennen, oder? :)

Danke,

Zidane

Matze 14. Mai 2006 14:26

Re: Timer mit delay
 
Ganz einfach so:

Delphi-Quellcode:
var
  Form1: TForm1;
  CounterVar: Integer = 0; // <= wichtig, initialisieren!

implementation

{$R *.DFM} 

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Inc(CounterVar);

  // dein normaler Code

  if CounterVar = 2) then
  begin
    // dein verzögerter Code
    CounterVar := 0;
  end;
end;

Zidane 14. Mai 2006 14:29

Re: Timer mit delay
 
Ah ok! :)

Durch CounterVar: Integer = 0; wird der Zähler also auf 0 gesetzt oder?

Vielen Dank, wieder was dazu gelernt! ;)

Helmi 14. Mai 2006 14:29

Re: Timer mit delay
 
Hallo,

ich denke er meinte es so:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
     Timer1.Enabled := true;
     CounterVar := 0;
end;


//Timer = 1000
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  //nach 1 Sek. Ampel rot
  If CounterVar = 1 then
    begin
      ShapeRot.Brush.Color := clRed;
      ShapeGelb.Brush.Color := clWhite;
      ShapeGruen.Brush.Color := clWhite;
    end;

  //nach 3 Sek. Ampel rot/gelb
  If CounterVar = 3 then
    begin
      ShapeRot.Brush.Color := clRed;
      ShapeGelb.Brush.Color := clyellow;
      ShapeGruen.Brush.Color := clWhite;
    end;

  //nach 4 Sek. Ampel grün
  If CounterVar = 4 then
    begin
      ShapeRot.Brush.Color := clWhite;
      ShapeGelb.Brush.Color := clWhite;
      ShapeGruen.Brush.Color := clLime;
    end;
 
//andere Abläufe gleich wie oben....

  Inc(CounterVar);
end;
[edit]
Wobei es mit Case schöner ausschaut:
Delphi-Quellcode:
case CounterVar of
  1: begin
       //Ampel rot
     end;
  3: begin
       //Ampel rot/gelb
     end;
  4: begin
       //Ampel grün
     end;
{...}
end;

  inc(CounterVar)

DGL-luke 14. Mai 2006 14:34

Re: Timer mit delay
 
Zitat:

Wenn alles ausgeführt werden würde könnte man aber bevor ShapeGruen aber lime umgestellt wird die anderen beiden Shapeumänderungen erkennen, oder?
Klar solltest du es erkennen können - allerdings für den zeitraum von etwa einem sechzigstel sekunden, wenn dein monitor eine frequenz von 60 Hz hat. Also nicht wirklich lange.

Du kannst ein sleep(2000) reinpacken(vorsicht, stoppt den gesamten prozess). Andere Möglichkeit: Noch einen timer einbauen, den du startest und der dann auf grün schaltet.

Zidane 14. Mai 2006 14:34

Re: Timer mit delay
 
Nun ja, Case ist dann wieder was neues für mich, ich bleib erstmal beim vorherigen! :)

Aber dankeschön, im Nachhinein erscheint das alles immer so logisch! :gruebel:

Gracias! :thumb:

kenuvis 14. Mai 2006 15:16

Re: Timer mit delay
 
case ist realtiv einfach und übersichtlicher.

if a = 2 then ....
if a = 3 then ....
if a = 4 then ....
....

bei 3 if abfragen geht das noch, aber wenn du dann 10 oder 20 hast, wird das sehr unübersichtlich.
in solchen fällen nimt man dann case abfragen. ein tipp von mir, schau mal in der delphi hilfe nach und informiere dich dann da über case.

so sieht das dann in einer case abfrage aus.

case a of
2: ....
3: ....
4: ....
....
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:53 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