AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Kreuzungs Ampel Problem

Offene Frage von "DeddyH"
Ein Thema von thejacensolo · begonnen am 11. Jun 2013 · letzter Beitrag vom 11. Jun 2013
Antwort Antwort
Seite 1 von 2  1 2   
thejacensolo

Registriert seit: 11. Jun 2013
Ort: Frankfurt am Main
13 Beiträge
 
FreePascal / Lazarus
 
#1

Kreuzungs Ampel Problem

  Alt 11. Jun 2013, 18:23
Also erstmal vorab:
1. falls dass in der falschen Kategorie steht bitte moven, bin neu sry.
2. ja ich habe die Suchfunktion von google dem Forum und diversen anderen Seiten benutzt und bin nie auf eine brauchbare lösung gekommen.
Ich habe von meinem Lehrer den Auftrag bekommen eine Ampel kreuzung zu schreiben, woran ich glorreich gescheitert bin, dann habe ich ein neues Projekt erstellt und mit einer einfachen Ampel von vorne angefangen
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  {Rot1.visible := true;
  sleep(1000);
  Application.ProcessMessages;
  if Rot1.visible = true then
  begin
    Rot1.visible := false;
    Gelb1.visible := false;
    Gruen1.visible := false;
    Rotgelb1.visible := true;
   end;}

  timer1.enabled := true;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Gruen1.visible := false;
  Gelb1.visible := false;
  Rot1.visible := false;
  Rotgelb1.visible := false;
  timer1.enabled := false;
end;

procedure TForm1.Timer1StopTimer(Sender: TObject);
begin

end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if Rot1.visible then
   begin
     Rot1.visible := false;
     Gelb1.visible := false;
     Gruen1.visible := false;
     Rotgelb1.visible := true;
     sleep(1000);
     Application.ProcessMessages;
   end
   else
    If RotGelb1.visible then
    begin
     Rot1.Visible:=False;
     Gelb1.Visible:=false;
     Gruen1.visible:=true;
     RotGelb1.visible:=False;
     sleep(1000);
     Application.ProcessMessages;
    end
    else
      If Gruen1.visible then
      begin
       Rot1.Visible:=False;
       Gelb1.Visible:=true;
       Gruen1.visible:=False;
       RotGelb1.visible:=False;
       sleep(1000);
       Application.ProcessMessages;
      end
        else
         If Gelb1.visible then
         begin
          Rot1.Visible:=true;
          Gelb1.Visible:=false;
          Gruen1.visible:=False;
          RotGelb1.visible:=False;
          Application.ProcessMessages;
          sleep(1000);

         end;
end;
Also eine einfache if then else reihenfolge, aber ich habe dass problemm, dass die Form nichts anzeigt (der button leuchtet nur) Timer intervall ist 1000
der befehl Application.ProcessMessages; klappt irgendwie nicht und auch die sleep funktion stellt nichts dar.(Mit einer Anweisung hats geklappt, aber nach einer Sekunde nichterscheinen erschien Zustand Rotgelb.) Wie kann ich es hinkriegen dass er mir bei code 2 regelmäßig etwas darstellt?
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#2

AW: Kreuzungs Ampel Problem

  Alt 11. Jun 2013, 18:31
Hallo,

beim Starten sind keine Ampelfarben aktiv (siehe OnCreate: dort versteckst du alle (visible := false).

Versuch doch mal folgendes:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Rot1.visible := true;
  timer1.enabled := true;
end;
Ach ja, wenn der Timer-Intervall auf 1000 steht (1000ms = 1s), dann kannst du dir die sleeps sparen (ebenso: Application.ProcessMessages
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<

Geändert von Helmi (11. Jun 2013 um 18:33 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.533 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Kreuzungs Ampel Problem

  Alt 11. Jun 2013, 18:32
Du brauchst weder Application.ProcessMessages noch Sleep. Dein Problem ist: Du fragst Komponenten ab, ob sie sichtbar sind. Leider stellst Du intial alle auf unsichtbar, daher trifft keine der Bedingungen im Timer zu.

[edit] Was z.B. eine Möglichkeit wäre, im Timer die letzte Bedingung einfach wegzulassen:
Zitat:
Delphi-Quellcode:
        else
         If Gelb1.visible then
         begin
          Rot1.Visible:=true;
          Gelb1.Visible:=false;
          Gruen1.visible:=False;
          RotGelb1.visible:=False;
          Application.ProcessMessages;
          sleep(1000);

         end;
-->
Delphi-Quellcode:
        else
// If Gelb1.visible then
         begin
          Rot1.Visible:=true;
          Gelb1.Visible:=false;
          Gruen1.visible:=False;
          RotGelb1.visible:=False;
         end;
[/edit]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Kreuzungs Ampel Problem

  Alt 11. Jun 2013, 18:39
Zum Thema Ampel gibt es alleine hier im Forum reichlich Beiträge

Hier im Forum suchenAmpel (125 Treffer)
und bei Tante google
Bei Google suchendelphi ampel ... ein ganzes Pfund mehr

Wonach hast du gesucht?
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
thejacensolo

Registriert seit: 11. Jun 2013
Ort: Frankfurt am Main
13 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Kreuzungs Ampel Problem

  Alt 11. Jun 2013, 19:14
Danke Helmi, ich habe rot auf visible gestell und auf einmal funktionierts.
Aber wenn ich ausführe springt er ganz schnell von Grün über Gelb auf Rot, schneller als er runterschaltet
-------------------------------------------
Edit: Es lag an dem Sleep und an dem Application.processmessages. ich habe dass weg gemacht und dann funkts

Geändert von thejacensolo (11. Jun 2013 um 19:17 Uhr) Grund: Sleep vergessen weg zu machen
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#6

AW: Kreuzungs Ampel Problem

  Alt 11. Jun 2013, 19:15
Ein Ampel hat doch verschiedene (Ampel-)Phasen.
Diese Phasen kann man durchnumerieren (0=alles aus, 1=rot, 2=rot+gelb,...)
Dann braucht man doch nur noch im Timer die Ampelphase hochzählen und entsprechend der Phase die Lämpchen an- und ausmachen.
Und natürlich noch aufpassen, dass nachdem die letzte Pase erreicht wurde wieder auf Phase 1 zurückgesetzt wird.
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.533 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Kreuzungs Ampel Problem

  Alt 11. Jun 2013, 19:27
Genau dazu gibt es zumindest von mir irgendwo einen Beispielcode, der sollte sich über die Suche finden lassen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
thejacensolo

Registriert seit: 11. Jun 2013
Ort: Frankfurt am Main
13 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Kreuzungs Ampel Problem

  Alt 11. Jun 2013, 19:37
Ein Ampel hat doch verschiedene (Ampel-)Phasen.
Diese Phasen kann man durchnumerieren (0=alles aus, 1=rot, 2=rot+gelb,...)
Dann braucht man doch nur noch im Timer die Ampelphase hochzählen und entsprechend der Phase die Lämpchen an- und ausmachen.
Und natürlich noch aufpassen, dass nachdem die letzte Pase erreicht wurde wieder auf Phase 1 zurückgesetzt wird.
Dies habe ich auch versucht und es hat nicht geklappt
ich habe den code gelöscht, aber ich weiß dass er entweder gar nicht oder direkt zur endphase geschaltet hat.
ich habe dass mit in(i) gemacht
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.533 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Kreuzungs Ampel Problem

  Alt 11. Jun 2013, 20:14
Ich kann Dich schwer einschätzen, aber das ist Dir vermutlich noch zu hoch. Trotzdem mal eine kleine Klasse:
Delphi-Quellcode:
type
  TAmpel = class;
  TAmpelphase = (apRot, apGelbRot, apGruen, apGelb);
  TOnNextPhase = procedure(Sender: TAmpel; Phase: TAmpelphase) of object;

  TAmpel = class
  private
    FPhase: TAmpelphase;
    FOnNextPhase: TOnNextPhase;
  public
    procedure NextPhase;
    property OnNextPhase: TOnNextPhase read FOnNextPhase write FOnNextPhase;
  end;

...

procedure TAmpel.NextPhase;
begin
  case FPhase of
    apRot:
      FPhase := apGelbRot;
    apGelbRot:
      FPhase := apGruen;
    apGruen:
      FPhase := apGelb;
    apGelb:
      FPhase := apRot;
  end;
  if Assigned(FOnNextPhase) then
    FOnNextPhase(self, FPhase);
end;
Nun musst Du "nur noch" eine Instanz dieser Klasse erzeugen, dem Event eine kompatible Methode zuweisen und in einem Timer NextPhase aufrufen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#10

AW: Kreuzungs Ampel Problem

  Alt 11. Jun 2013, 20:19
auch wenn beim erzeugen der Instanz die Variablen initialisiert werden, aber du solltest vielleicht
die Variable "FPhase" im Create initialisieren (theoretisch steht sie aber auf apRot)
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:16 Uhr.
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