Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   FreePascal Kreuzungs Ampel Problem (https://www.delphipraxis.net/175305-kreuzungs-ampel-problem.html)

thejacensolo 11. Jun 2013 17:23

Kreuzungs Ampel Problem
 
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?

Helmi 11. Jun 2013 17:31

AW: Kreuzungs Ampel Problem
 
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;)

DeddyH 11. Jun 2013 17:32

AW: Kreuzungs Ampel Problem
 
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]

Sir Rufo 11. Jun 2013 17:39

AW: Kreuzungs Ampel Problem
 
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?

thejacensolo 11. Jun 2013 18:14

AW: Kreuzungs Ampel Problem
 
Danke Helmi, ich habe rot auf visible gestell und auf einmal funktionierts.:-D
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

sx2008 11. Jun 2013 18:15

AW: Kreuzungs Ampel Problem
 
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.

DeddyH 11. Jun 2013 18:27

AW: Kreuzungs Ampel Problem
 
Genau dazu gibt es zumindest von mir irgendwo einen Beispielcode, der sollte sich über die Suche finden lassen.

thejacensolo 11. Jun 2013 18:37

AW: Kreuzungs Ampel Problem
 
Zitat:

Zitat von sx2008 (Beitrag 1218282)
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

DeddyH 11. Jun 2013 19:14

AW: Kreuzungs Ampel Problem
 
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.

Helmi 11. Jun 2013 19:19

AW: Kreuzungs Ampel Problem
 
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)


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:51 Uhr.
Seite 1 von 2  1 2      

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