Autor Beitrag
benjamin_200
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Di 23.09.08 13:35 
hI jungs, oder auch mädels? sorry wenn dann.

ich hab ein Problem mit timern, während einer Ampelprogrammierung.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
procedure TForm1.Button1Click(Sender: TObject);
begin
edit1.color:= clred;
timer1.Enabled:= true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if edit1.color = clred then
begin
edit2.color:= clyellow;
edit1.Color:= clwindow;
timer2.Enabled:= true;
timer1.enabled:= false;
end;
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
if edit2.color = clyellow then
begin
edit3.color:= clgreen;
edit2.color:= clwindow;
timer3.Enabled:= true ;
timer2.enabled:= false;

end
end;


procedure TForm1.Timer3Timer(Sender: TObject);
begin
if edit3.color = clgreen then
begin
edit4.Color:= clyellow;
edit3.Color:= clwindow;
timer1.Enabled:= true ;
timer3.enabled:= false;

end
end;

procedure TForm1.Timer4Timer(Sender: TObject);
begin
if edit4.color = clgreen then
begin
edit4.color:= clwindow;
edit1.color:= clred;
timer1.Enabled:= true;
timer4.Enabled:= false;

end
end;



das is mein quellcode mit 4 timern und 4 editfeldern
Ich will dass die Ampel einfach durchläuft, nachdem ich einmal auf den Button geklickt hab.
Problem is fgolgendes: Es läuft alles von rot auf geld auf grün und auf gelb ( also 4tes Feld) aber dann wird es nicht wieder rot.
wieso? ich hab im letzten doch den ersten timer wieder aktiviert.
Wäre lieb wenn jemand helfen könnte.

Moderiert von user profile iconKlabautermann: Delphi-Tags hinzugefügt.
jackle32
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 183
Erhaltene Danke: 7

Win7
Delphi XE5 Starter, RAD Studio XE7 Pro
BeitragVerfasst: Di 23.09.08 13:57 
Hallo,

kleiner Fehler große Wirkung.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
procedure TForm1.Timer3Timer(Sender: TObject);  
begin  
if edit3.color = clgreen then  
begin  
edit4.Color:= clyellow;  //Hier setzt du edit4 auf gelb...
edit3.Color:= clwindow;  
timer1.Enabled:= true ;  
timer3.enabled:= false;  

 
end  
end;  

 
procedure TForm1.Timer4Timer(Sender: TObject);  
begin  
if edit4.color = clgreen then  //... frägst hier aber auf grün ab. Was bedeutet, dass deine Bedingung nie wahr wird.
begin  
edit4.color:= clwindow;  
edit1.color:= clred;  
timer1.Enabled:= true;  
timer4.Enabled:= false;  

 
end  
end;


Also entweder beides auf grün oder beides auf gelb.

Grundsätzlich ist dein Aufbau aber sehr umständlich. Hab mich auch schon mal mit der Ampelsteuerung rumschlagen dürfen und würde die eine Statemaschine empfehlen, da brauchst du dann auch nur einen Timer.

Grüße Jack

_________________
Es gibt keine dummen Fragen, nur dumme Antworten.
benjamin_200 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Di 23.09.08 16:31 
vielen dank,
soweit klappt das ganze jetzt.
Aber was eine State-Maschine ist weiß ich absolut gar nich:D
jackle32
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 183
Erhaltene Danke: 7

Win7
Delphi XE5 Starter, RAD Studio XE7 Pro
BeitragVerfasst: Mi 24.09.08 11:57 
Hi,

eine State-Machine ist ein Programm, dass Zustandsgesteuert ist. Wird dir jetzt auch nicht viel sagen is aber im Prinzip ganz einfach.
Du hast einen Timer, der gibt dir den Takt vor. Im einfachsten Fall lässt du jetzt von diesen Timer eine Variable hoch zählen. Jetzt baust du dir den Schaltungsablauf der Ampel mit diesen Taktschritten nach und sagst halt einfach bei welchen Zählerstand deiner Variablen welche Aktion ausgelöst werden soll.

Noch ein kurzes Beispiel:

Timerzeit auf 1s gesetzt.

d.h. du fängst bei 0 an und deine Ampel rot ist. Wenn jetzt der Timer einmal auslöst ist 1s rum. Folglich wenn du zu Beginn 3s rot haben willst dann kommt bei 3 eben die nächste Aktion (Abfrage über if oder switch/case) die dann eben heißt: schalte auf gelb. So kanns du deine ganze Schaltung durchplanen und hast dann halt eine maximale Schrittzahl, nach der du die Zählvariable wieder auf 0 setzt.

Vorteil ist einfach, dass du nur eine Timer hast und z.B. zum Simuliern den Takt des Timer (und da halt wirklich nur EINES Timers) ändern kannst und so schaun kannst ob alles richtig geht und musst dir nicht jedes mal die ganze Dauer in "Echtzeit" anschaun. Und wenn du die Schaltzeiten verändern willst änderst du einfach die Eventzeitpunkte für die Zählvariable und schon hast du eine sehr flexibles Programm geschrieben.

Kannst auch bei google mal suchen unter "state maschine" oder auch unter "Zustandsautomat"

Gruß Jack

_________________
Es gibt keine dummen Fragen, nur dumme Antworten.
benjamin_200 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Mi 24.09.08 15:48 
ja vielen dank,
ich habs jetzt mit einem timer und if clauses gemacht.
Außerdem hab ich mal mit shapes gearbeitet, das läuft runder;-)
vielen dank aber trotzdem