| Autor |
Beitrag |
David Armstrong
      
Beiträge: 19
Win XP
Delphi 7
|
Verfasst: Di 28.03.06 12:55
hi,wir sollen eine ampelanlage in delhpi machen,die soll folgend aufgebaut sein:
eine straße auf der links eine ampel und in der mitte ein hindernis sein um das herum warnleuchten stehen
die ampel soll in einem bestimmten rhytmus wechseln:
-z.b. 30 sekunden grün,dann 1 sekunde gelb,dann 30 sekunden rot,1 sekunde gelb und wieder 30 sekunden grün...
die warnleuchten sollen auch in einem bestimmten rhytmus zwischen 2 farben wechseln
meine frage:
wie macht man das?
ich dachte man würde shape.brush.color benutzen wobei ich da nicht weiß wie man da die farbe auswählt und wie man den rhytmus eingibt(vielleicht mit einem timer)?
müsste man 3 shape felder für die ampel nehmen(daher für jede farbe eine) oder nur eins?
freue mich auf tipps und hilfe 
|
|
fly_2000
Hält's aus hier
Beiträge: 13
XP-Pro
|
Verfasst: Di 28.03.06 13:19
Hallo,
also ich würde an deiner stelle auf jeden fall wegen der optik schon drei shapes nehmen, welchen du die farben dann zuordnest.
für dein programm brauchst du endweder 2 timer, einen mit 30s und einen mit 1s. oder du benutzt nur einen mit 1s und zählst eine variable hoch bis 30ig. wenn ich heute noch zeit habe schreib ich nen quelltext..
Mfg
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Di 28.03.06 13:48
hallo,
ich würde an deiner stelle 3 shapes mit festgelegten farben (rot, gelb, grün) verwenden.
farben legts du am besten im OI an, um die übersicht im quelltext zu waren
Damit die "Ampel" auch umspringt, würde ich einfache if-Abfragen verwenden, s. quellcode.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| var time: byte; begin time := time + 1;
if time > 61 then time := 0;
if time <= 30 then begin shape1.Visible := true; .... |
so könnte der anfang deiner prozedur aussehen 
|
|
fly_2000
Hält's aus hier
Beiträge: 13
XP-Pro
|
Verfasst: Di 28.03.06 13:54
Der timer 2 ruft als ontimer ereignis die procedur button1click auf, und ist auf 1000ms eingestell.. zusätzlich noch die var merker: integer; eintragen!
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:
| procedure TForm1.Button1Click(Sender: TObject); begin merker:= merker+1; form1.Timer2.Enabled:=true; if merker= 1 then begin form1.Shape1.Brush.Color := clred; end; if merker= 11 then begin form1.Shape2.Brush.Color := clyellow; end; if merker= 14 then begin form1.Shape3.Brush.Color := clgreen; form1.Shape2.Brush.Color := clwindow; form1.Shape1.Brush.Color := clwindow; end; if merker= 24 then begin form1.Shape3.Brush.Color := clwindow; form1.Shape2.Brush.Color := clyellow; end; if merker= 26 then begin form1.Shape2.Brush.Color := clwindow; form1.Shape1.Brush.Color := clred; merker:= 0; end; end;
procedure TForm1.Button2Click(Sender: TObject); begin form1.Timer2.Enabled:= false; form1.Shape1.Brush.Color:= clwindow; form1.Shape2.Brush.Color:= clwindow; form1.Shape3.Brush.Color:= clwindow; merker:= 0; end; |
Moderiert von raziel: Delphi-Tags hinzugefügt
|
|
David Armstrong 
      
Beiträge: 19
Win XP
Delphi 7
|
Verfasst: Mi 29.03.06 19:37
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: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, Buttons, StdCtrls;
type TForm1 = class(TForm) SpeedButton1: TSpeedButton; SpeedButton2: TSpeedButton; SpeedButton3: TSpeedButton; Shape1: TShape; Shape2: TShape; Shape3: TShape; Button1: TButton; Timer1: TTimer; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); var merker:integer; begin merker:= merker+1; form1.Timer1.Enabled:=true ; if merker = 1 then begin form1.Shape1.Brush.Color := clred; end; if merker= 11 then begin form1.Shape2.Brush.Color := clyellow; end; if merker= 14 then begin form1.Shape3.Brush.Color := clgreen; form1.Shape2.Brush.Color := clwindow; form1.Shape1.Brush.Color := clwindow; end; if merker= 24 then begin form1.Shape3.Brush.Color := clwindow; form1.Shape2.Brush.Color := clyellow; end; if merker= 26 then begin form1.Shape2.Brush.Color := clwindow; form1.Shape1.Brush.Color := clred; merker:= 0; end; end;
procedure TForm1.Button2Click(Sender: TObject); var merker:integer; begin form1.Timer1.Enabled:= false; form1.Shape1.Brush.Color:= clwindow; form1.Shape2.Brush.Color:= clwindow; form1.Shape3.Brush.Color:= clwindow; merker:= 0; end;
end. |
also wenn ich starte wird zwar kein fehler angezeigt aber wenn ich button 1 oder 2 clicke passiert nix 
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Mi 29.03.06 19:58
diese code gehört ja auch in die timerprozedur!
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:
| var merker:integer; begin merker:= merker+1; form1.Timer1.Enabled:=true ; if merker = 1 then begin form1.Shape1.Brush.Color := clred; end; if merker= 11 then begin form1.Shape2.Brush.Color := clyellow; end; if merker= 14 then begin form1.Shape3.Brush.Color := clgreen; form1.Shape2.Brush.Color := clwindow; form1.Shape1.Brush.Color := clwindow; end; if merker= 24 then begin form1.Shape3.Brush.Color := clwindow; form1.Shape2.Brush.Color := clyellow; end; if merker= 26 then begin form1.Shape2.Brush.Color := clwindow; form1.Shape1.Brush.Color := clred; merker:= 0; end; end; |
mfg 
|
|
David Armstrong 
      
Beiträge: 19
Win XP
Delphi 7
|
Verfasst: Mi 29.03.06 20:05
ahhh^^ danke,kannste in 20min hier nochma vorbeischauen? falls ich immernoch probleme habe sage ich sie dir;)
|
|
David Armstrong 
      
Beiträge: 19
Win XP
Delphi 7
|
Verfasst: Mi 29.03.06 20:30
ich habs jetz so gemacht wie du meintest,starten tuts,aber passiern tut nix^^
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: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, Buttons, StdCtrls;
type TForm1 = class(TForm) SpeedButton1: TSpeedButton; SpeedButton2: TSpeedButton; SpeedButton3: TSpeedButton; Button1: TButton; Button2: TButton; Timer1: TTimer; Shape1: TShape; Shape2: TShape; Shape3: TShape; procedure Timer1Timer(Sender: TObject); procedure Button2Click(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject); var merker:integer; begin merker:= merker+1; form1.Timer1.Enabled:=true ; if merker = 1 then begin form1.Shape1.Brush.Color := clred; end; if merker= 11 then begin form1.Shape2.Brush.Color := clyellow; end; if merker= 14 then begin form1.Shape3.Brush.Color := clgreen; form1.Shape2.Brush.Color := clwindow; form1.Shape1.Brush.Color := clwindow; end; if merker= 24 then begin form1.Shape3.Brush.Color := clwindow; form1.Shape2.Brush.Color := clyellow; end; if merker= 26 then begin form1.Shape2.Brush.Color := clwindow; form1.Shape1.Brush.Color := clred; merker:= 0; end; end;
procedure TForm1.Button2Click(Sender: TObject); var merker:integer; begin form1.Timer1.Enabled:= false; form1.Shape1.Brush.Color:= clwindow; form1.Shape2.Brush.Color:= clwindow; form1.Shape3.Brush.Color:= clwindow; merker:= 0; end;
end. |
|
|
Miri
      
Beiträge: 657
Delphi 3 Prof., Delphi 2005 PE
|
Verfasst: Mi 29.03.06 20:52
Du musst schon beim Button1 auch den Timer starten... wenn du den nicht startest, kann ja auch nix passieren...
|
|
David Armstrong 
      
Beiträge: 19
Win XP
Delphi 7
|
Verfasst: Mi 29.03.06 21:14
und wie startet man den??
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Mi 29.03.06 21:32
mit Button 1. (Timer1.Enabled := true)
PS: deklariere "merker" global und nicht in der Timer Prozedur, denn so machts keinen Sinn, da sonst merker immer =1 ist...
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
fly_2000
Hält's aus hier
Beiträge: 13
XP-Pro
|
Verfasst: Mi 29.03.06 21:35
gude,
also nimm den quelltext so wie ich dir den geschrieben hab.
dann musst du noch bei variablen
var
merker: integer;
hinschreiben.
beim timer stellst du den enable auf false im objektinspektor, und tust bei ereignisse im ontimer ereignis Button1click wählen.
dann müsste es fun funktionieren
Mfg
|
|
David Armstrong 
      
Beiträge: 19
Win XP
Delphi 7
|
Verfasst: Mi 29.03.06 21:36
muhaha danke!!! kann ich dir nen orden oder ne bewertung geben???
wie kann ich es jetz noch machen das es bei der ampel nicht so ist: grün - gelb - rot - grün... sondern grün - gelb - rot - gelb - grün...?
|
|
fly_2000
Hält's aus hier
Beiträge: 13
XP-Pro
|
Verfasst: Mi 29.03.06 21:39
achso.. den merker global deklarieren, also oben wo var steht, unter implementation nicht innerhalb der proceduren..
|
|
fly_2000
Hält's aus hier
Beiträge: 13
XP-Pro
|
Verfasst: Mi 29.03.06 21:48
du kannst einfach die farben so ändern wie du lust hast, und genauso die zeitabstände
wenn du merker= 11 abfragst, dann wird dieser schritt nach 11sekunden durchlaufen, wenn du merker= 20 schreibst nach 20 sekunden, du kannst auch noch beliebig viele 'if then' anweisungen dazwischenmachen, bzw rauslöschen, du musst nur beim letzten den merker wieder auf null setzen, bzw wenn du den ablauf dann stoppen willst den Timer.enable auf false setzen
|
|
Miri
      
Beiträge: 657
Delphi 3 Prof., Delphi 2005 PE
|
Verfasst: Do 30.03.06 07:37
Nur mal so nebenbei... wär dann nicht grün - gelb - rot - rot/gelb - grün noch besser? 
|
|
David Armstrong 
      
Beiträge: 19
Win XP
Delphi 7
|
Verfasst: Fr 31.03.06 19:22
ja,hab ich jetz auch so gemacht^^
aber trotzdem danke das mir so viele geholfen haben 
|
|