Entwickler-Ecke

Sonstiges (Delphi) - Frage zu Timern, Ampeln und Autos


Farbklecks - Do 13.10.11 19:45
Titel: Frage zu Timern, Ampeln und Autos
Hallo!
Also ich bin nicht nur neu hier im Forum sondern auch neu beim Thema Delphi.

Das ist mein Problem: Ich arbeite mit Delphi 7. Nun muss ich eine Ampelschaltung erstellen, die nur mit dem Timer arbeitet. Allerdings sollen die verschiedenen Ampelphasen (Rot,Gelb,Grün) auch alle verschieden lange dauern. Meine Frage: Wo und wie mache ich das? das alles soll automatisch gehen. Mit "loadfromfile" lade ich die Bildchen für die Phasen hoch. aber den korrekten Quelltext bekomme ich nicht hin. Bei mir läd sich entweder direkt die rote Phase, aber dann keine andere mehr oder nur die gelbe Phase, die rote wird dann erst garnicht sichtbar.

Ich hoffe mir kann jmd helfen mit dem Quelltext, ich hab schon bei Google gesucht aber nichts für mich verständliches gefunden...

Danke schonmal !:D
Farbklecks :)

Moderiert von user profile iconNarses: Titel geändert, war: "Wichtige Frage zu Timern,Ampeln und Autos".


platzwart - Do 13.10.11 20:15

Hi,

na dann zeig uns doch mal deinen Quellcode, dann können wir dir einfacher helfen. Komplett fertigen Quellcode wird dir niemand liefern. Erster Tipp: Über (Timer1.)Interval kannst du die Anzahl der Millisekunden bis zum Auslösen des Timerevents einstellen.


Horschdware - Do 13.10.11 21:00

Besser als Quellcode:
Sag uns doch mal, wie deine Überlegungen zu dem Problem sind. Versuche mal in deutscher Sprache zu beschreiben, wann was passieren soll. Wenn du dir darüber im Klaren bist ist die Umsetzung in Code sicherlich einfacher .


Farbklecks - Do 13.10.11 21:55

Also der Quelltext ist leider nicht hier, dass gesamte Projekt wird auf dem PC meines Freundes gemacht.

Aber auf Deutsch kann ich das erklären ;)
Also wenn ich das Projekt öffne, soll die Ampel zunächst das Bild mit der roten Ampel laden. dieses soll dann 8 sek. lang vorhanden sein, dann soll sich das bild mit der gelben ampel laden für 1 sek. dann soll sich das bild mit der grünen ampel laden für wieder 8 sek, dann das bild mit der rot-gelb ampel wieder für 1 sek. Danach soll dieser prozess immer wiederholt werden.

Ich habe das Ganze mit if und than versucht, nur irgendwas lief falsch...

Danke für die schnellen Antworten ;)
LG


Narses - Do 13.10.11 22:03

Moin und :welcome: in der EE!

user profile iconFarbklecks hat folgendes geschrieben Zum zitierten Posting springen:
Also der Quelltext ist leider nicht hier, dass gesamte Projekt wird auf dem PC meines Freundes gemacht.
Hast du denn ein Delphi zur Hand? Oder ist das auch nur auf dem anderen PC. :nixweiss:

cu
Narses


Blup - Fr 14.10.11 12:53

Ein kleines Beispiel:

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:
55:
56:
57:
58:
59:
type
  TAmpelStatus = (asRot, asGruen, asGelb);
{}
  TAmpelphase = record
    Farbe: TAmpelStatus;
    Dauer: Integer;
  end;
{}
  TAmpelProgramm = array of TAmpelphase;
{}
  TForm1 = class(TForm)
{...}
    procedure FormCreate(Sender: TObject);
  private
    FAmpelProgramm: TAmpelProgramm;
    FAmpel: Integer; {Index im Ampelprogramm}
    FAmpelTimeOut: TDateTime; {wann wird das nächste mal umgeschalten}
    procedure SetAmpel(AValue: Integer);
    procedure ZeigeAmpelRot;
    procedure ZeigeAmpelGruen;
    procedure ZeigeAmpelGelb;
  end;
{}
implementation
{}
procedure TForm1.FormCreate(Sender: TObject);
begin
  {Ampel programmieren}
  SetLength(FAmpelProgramm, 3);
  FAmpelProgramm[0].Farbe := asRot;   FAmpelProgramm[0].Dauer := 10;
  FAmpelProgramm[1].Farbe := asGruen; FAmpelProgramm[1].Dauer := 10;
  FAmpelProgramm[2].Farbe := asGelb;  FAmpelProgramm[2].Dauer :=  5;
  {Ampelprogramm starten}
  SetAmpel(0);
  Timer1.Enabled := True;
end;
{}
procedure TForm1.OnTimer1(Sender: TObject);
begin
  if FAmpelTimeOut <= SysUtils.Now then
    SetAmpel(FAmpel + 1);
end;
{}
procedure TForm1.SetAmpel(AValue: Integer);
begin
  {am Ende des Programms von vorn beginnen}
  if AValue >= Length(FAmpelProgramm) then
    AValue := 0;
  {umschalten}
  FAmpel := AValue;
  {wann wird das nächste mal umgeschalten}
  FAmpelTimeOut := SysUtils.Now + EncodeTime(00, FAmpelProgramm[FAmpel].Dauer);
  {Status ausgeben}
  case FAmpelProgramm[FAmpel].Farbe;
    asRot:   ZeigeAmpelRot;
    asGruen: ZeigeAmpelGruen;
    asGelb:  ZeigeAmpelGelb;
  end;
end;


Farbklecks - Mo 17.10.11 17:52

Also erstmal vielen Dank !
@Narses also Delphi habe ich mir nun mal zugelegt, um alles auszurpobieren. :)
@Blup Vielen Dank !

Ich hab die Ampeschaltung mit allen Phasen jetzt fertig :)

Jetzt möchte ich nur noch die Autos so bewegen, dass es zur schaltung passt. Allerdings verstehe ich nicht ganz, wie ich die Autos dazu bringe um die Ecke zu fahren :?
Ich habe fürs bewegen an sich Left. genutzt.

Danke schonmal, wenn ihr mir nochmal helfen könntet :)
Lg, Farbklecks


platzwart - Mo 17.10.11 18:14

Dann probiers mal mit Top z.B. -> damit kannst du das Auto nach oben (-) bzw. nach unten(+) fahren lassen.