Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Timer Verständnisfrage (https://www.delphipraxis.net/142632-timer-verstaendnisfrage.html)

Alois 31. Okt 2009 16:24


Timer Verständnisfrage
 
Hi,

Ich benutze in meinem Projekt einen Timer mit einem Intervall von 100ms.
Warume werden die einzelnen case-Anweisungen nicht durchlaufen?

Warum funktioniert folgender Code nicht?

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  Interval: integer;
begin
  if Interval > 10 then Interval := 1;
  case Interval of
   2, 4, 6, 8 : begin
     // alle 200ms
   end;
   5: begin
     // alle 500ms
   end;
   10 : begin
     // alle 1000ms
   end;
  end;
  Interval := Interval + 1;
end;
Gruss Alois ;)

omata 31. Okt 2009 16:26

Re: Timer Verständnisfrage
 
Weil Interval bei dir eine lokale Variable ist.

Alois 31. Okt 2009 16:37

Re: Timer Verständnisfrage
 
Zitat:

Zitat von omata
Weil Interval bei dir eine lokale Variable ist.

Ist mir schon klar. Das hat nichts mit dem Timer1.Interval zu tun.

Ich habs zum besseren Verständnis hier nochmal geändert:
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  ZeitInterval: integer;
begin
  if ZeitInterval > 10 then ZeitInterval := 1;
  case ZeitInterval of
   2, 4, 6, 8 : begin
     // alle 200ms
   end;
   5: begin
     // alle 500ms
   end;
   10 : begin
     // alle 1000ms
   end;
  end;
  ZeitInterval := ZeitInterval + 1;
Timer1.Interval ist im Design-Form auf 100 eingestellt und der der Timer wird mit Timer1.Enabled = true auch gestartet.

Der Wert ZeitInterval wird als Zähler benutzt, aber die einzelnen case-Abschnitte werden nicht durchlaufen.

Gruss Alois ;)

DeddyH 31. Okt 2009 16:39

Re: Timer Verständnisfrage
 
Was omata meinte ist, dass lokale Variablen nicht initialisiert werden, Du also nicht wissen kannst, was dort drin steht.

Klaus01 31. Okt 2009 16:42

Re: Timer Verständnisfrage
 
.. wenn Du die lokale Variable hochzählst bringt das nicht viel.
Sie ist bei Dir jedesmal wenn die Timerfunktion ausgeführt wird undefiniert.

Eine externe Variable ( Klassen variable) würde Dir hier helfen.

Grüße
Klaus

omata 31. Okt 2009 16:43

Re: Timer Verständnisfrage
 
Genau, die lokale Variable lebt nur so lange wie die Timer-Prozedur ausgeführt wird, wird sie ein zweites Mal aufgerufen ist das eine neue lokale Variable und sie enthält nicht den Wert, den du ihr zuvor mal zugewiesen hast.

Alois 31. Okt 2009 16:45

Re: Timer Verständnisfrage
 
Zitat:

Zitat von DeddyH
Was omata meinte ist, dass lokale Variablen nicht initialisiert werden, Du also nicht wissen kannst, was dort drin steht.

Ah jetzt ja... eben hat's geklingelt. :wall: Vielen Dank euch beide.

Gruss Alois ;)

lbccaleb 31. Okt 2009 16:45

Re: Timer Verständnisfrage
 
Auf gut Deutsch

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  ZeitInterval: integer;
begin
 // ZeitInterval ist hier an der Stelle 0
  if ZeitInterval > 10 then ZeitInterval := 1;
  case ZeitInterval of
   2, 4, 6, 8 : begin
     // alle 200ms
   end;
   5: begin
     // alle 500ms
   end;
   10 : begin
     // alle 1000ms
   end;
  end;
  ZeitInterval := ZeitInterval + 1;

omata 31. Okt 2009 16:49

Re: Timer Verständnisfrage
 
Eine nicht initialisierte Variable ist nicht Null, sie ist undefiniert.

himitsu 31. Okt 2009 16:54

Re: Timer Verständnisfrage
 
Zitat:

// ZeitInterval ist hier an der Stelle 0
NEIN
lokale Variablen werden nicht intitialisiert


Was man hier auch verwenden könnte, das wäre .Tag

[add]
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if Timer1.Tag > 10 then Timer1.Tag := 1;
  case Timer1.Tag of
    ...
  end;
  Timer1.Tag := Timer1.Tag + 1;
end;

// oder besser (dieses ist unabhängig vom Timer-Namen)

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if TTimer(Sender).Tag > 10 then TTimer(Sender).Tag := 1;
  case TTimer(Sender).Tag of
    ...
  end;
  TTimer(Sender).Tag := TTimer(Sender).Tag + 1;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:28 Uhr.
Seite 1 von 2  1 2      

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