Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Objekt soll blinken bis Button gedrückt wird


judomichi - So 27.02.11 13:28
Titel: Objekt soll blinken bis Button gedrückt wird
So, noch keine 2 Stunden Mitglied (und 2 Stunden die Suche bemüht und Threads gelesen) und schon wieder eine Frage.

Nachdem ich das mit dem Kreis (nach dem Denkanstoss mit dem Shape) hinbekommen habe und meine Ampelschaltung funzt, möchte ich jetzt den nächsten Schritt machen:

Wenn die Ampel grün ist und auf gelb zurückspringt soll das gelb blinken. Die Schaltung mache ich jedesmal wenn ich einen Button drücke; also ohne Timer. Dabei frage ich den Zustand der Ampel ab.
Also: Wenn Gelb = true dann gelb := blinken und raus und auf nächsten Tastendruck warten.

Ist das verständlich?

Den Zustand frage ich ab:

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:
54:
// flag
// 1= rot
// 3 = gelb
// 4 = rot/gelb
// 5 = grueb


case flag of
   1:    begin;
            v_rot();
            v_gelb();
            v_gruen_del();
            h_rot_del();
            h_gelb();
            h_gruen_del();
            flag := 4;
         end;
   3:    begin;
            v_rot();
            v_gelb_del();
            v_gruen_del();
            h_rot_del();
            h_gelb_del();
            h_gruen();
            flag := 1;
         end;
   4:    begin;
            v_rot_del();
            v_gelb_del();
            v_gruen();
            h_rot();
            h_gelb_del();
            h_gruen_del();
            flag := 5;
         end;
   5:    begin;              hier muss das blinken hin
            v_rot_del();
            v_gelb();
            v_gruen_del();
            h_rot();
            h_gelb();
            h_gruen_del();
            flag := 3;
         end;
   else  begin
            v_rot();
            v_gelb_del();
            v_gruen_del();
            h_gruen();
            h_rot_del();
            h_gelb_del();
            flag := 1;
         end;
end;


Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


jaenicke - So 27.02.11 13:32

Das Stichwort hast du schon selbst genannt:
Ein Timer ;-)

Darin kannst du dann jeweils nach dem festgelegten Intervall die Farbe umschalten. Soll es nicht mehr blinken, schaltest du den Timer wieder ab.


judomichi - So 27.02.11 13:41

Also, eines ist mir klar:

Wenn ich die gelbe Apel setze schalte ich den Timer an. Damit verbunden soll die gelbe Ampel dann blinken. Wenn der Anwender jetzt wieder den Button "Schalten" drückt soll die Ampel auf rot springen und gelb wird unsichtbar.

Aber wie erreiche ich das das Shape für gelb z.B. für eine halbe sek an und dann für eine halbe sek aus ist bis zum nächste buttonklick?
die halbe sek über timer on/timer off???

Sorry, aber soweit bin ich noch nicht.


jaenicke - So 27.02.11 13:57

Du musst den Timer nur einmal anschalten und das Intervall auf 500 Millisekunden gestellt haben, dann kannst du im Timer einfach umschalten:

Delphi-Quelltext
1:
2:
3:
4:
if MyShape.Color = clYellow then
  MyShape.Color := clBlack
else
  MyShape.Color := clYellow;
Wobei es natürlich sauberer ist auch diesen Status extern zu speichern.


KleinesPferd - So 27.02.11 14:15

user profile iconjudomichi hat folgendes geschrieben Zum zitierten Posting springen:
Also, eines ist mir klar:

Wenn ich die gelbe Apel setze schalte ich den Timer an. Damit verbunden soll die gelbe Ampel dann blinken. Wenn der Anwender jetzt wieder den Button "Schalten" drückt soll die Ampel auf rot springen und gelb wird unsichtbar.

Aber wie erreiche ich das das Shape für gelb z.B. für eine halbe sek an und dann für eine halbe sek aus ist bis zum nächste buttonklick?
die halbe sek über timer on/timer off???

Sorry, aber soweit bin ich noch nicht.



Delphi-Quelltext
1:
2:
Timer1.Interval:=500;  //Interval entspricht Millisekunden, 1000 = 1 Sekunde
Timer1.enable:=true;



Delphi-Quelltext
1:
2:
3:
4:
Procedure TForm1.YellowButton1CLick(Sender:TObject);
begin
Timer1.enable:=true; //false für ausschalten, 'Gelb' aber noch definiert ausschalten
end;



Grüße


judomichi - So 27.02.11 16:50

jaenicke, kleines Pferd,

jetzt ist die Verwirrung groß! Danke erst einmal für Eure Hilfe.

Vielleicht ist die blinkende Ampel noch ein bischen zu viel für meine 4 Stunden Delphi Schulung.

Wenn ich es recht verstanden habe muss ich doch eine Schleife haben, in der ich immer "gelb an" - "gelb-aus" durchlaufe. Aber dann komme ich doch nicht aus der Schleife raus, da das Blinklicht ja erst ausgehen soll wenn ich die nächste Ampelphase (rot) schalte.

Mein Verständnis:

IST-Code

Letzte Phase war grün
Neue Phase ist gelb, also Rot und Grün ausschalten und Gelb anschalten sowie status "Gelb ist an" setzen
Fertig

Schaltbutton drücken

letzte Phase war gelb
neue Phase ist rot
...

SOLL-Code

Letzte Phase war grün
Neue Phase ist gelb, also Rot und Grün ausschalten und Gelb anschalten sowie status "Gelb ist an" setzen
blinken lassen
Fertig

Schaltbutton drücken (gelb blinkt immer noch)

letzte Phase war gelb
neue Phase ist rot, also rot an, gelb und grün aus.
...

In meinem Source in Zeile 36, da soll gelb gesetzt werden und blinken. Dann ist die Prozedur durchlaufen und wartet auf Button2 Klick. Dann geht es mit Zeile 18 weiter ...


bummi - So 27.02.11 17:09

in h_gelb() Gelb setzen und den Timer anschalten, in h_gelb_del() den Timer abschalten und Gelb auf schwarz setzen....


judomichi - So 27.02.11 17:17

Danke an Euch alle. Manchmal findet man den Wald vor Bäumen nicht. Irgendwo in einem Thread habe ich diesen beiläufigen Satz gefunden:

OnTimer-Ereignis deine Bewegung programmieren.

Das habe ich ausprobiert und es funzt!

Timer auf false
Bei Gelb Timer auf true
On timer ereignis: die If abfrage wie oben beschrieben
bei Rot Timer auf false

Danke, danke, danke!!! Mal sehen wann das nächste Problem kommt.