Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Einfache Ampelsimulation funktioniert nicht... (https://www.delphipraxis.net/92892-einfache-ampelsimulation-funktioniert-nicht.html)

deepdragon 28. Mai 2007 13:53


Einfache Ampelsimulation funktioniert nicht...
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo Leute,

Ich habe mich hier neu angemeldet, weil ich ein Problem mit meiner Ampelsimulation habe... Wir sollen für die Schule jeder einzeln ein Projekt erarbeiten... Ich habe mir das Thema Ampelsimulation ausgesucht... Ich soll eine Ampelsimulation machen und der Umfang, also wie komplex wir das Thema gestalten, ist uns überlassen... Nur ist die Note natürlich umso besser, umso komplexer das Programm ist^^ Ich dachte mir, dass ich in einem ersten Formular erstmal eine einzige Ampel zeige, die automatisch mit einem Timer die Farben in einem vorher definiertem Intervall wechselt... Das geht völlig automatisch und man kann nicht eingreifen, außer dass man auf Start und Stop klicken kann... Das hört sich ziemlich einfach an, deshalb will ich in einem zweiten Formular dann eine Kreuzung oder zumindest etwas komplexeres machen... Aber jetzt bin ich schon beim ersten Formular hängen geblieben... :(

Ich denke, ich habe alles richtig programmiert und wenn ich das Programm testen will, meckert Delphi auch nicht wegen irgendwelchen Fehlern... Aber wenn ich jetzt auf Start klicke, passiert nichts... :( Ich habe schon rumgerätselt, an was es liegen könnte, aber mir ist es einfach nicht aufgefallen...

Vielleicht kann da mal einer von euch drüber gucken und mir sagen, was ich falsch gemacht habe??
Und ich will nicht, dass ihr meine Hausaufgaben macht, es ist nur so, dass ich absolut nicht weiß, was falsch sein könnte und euer geschultes Auge das sicher sofort erkennt^^

Vielen Dank schon mal im voraus... :)
Deepdragon

P.S.: Bei der Angabe, welche Programmiersprache ich nutzen würde, wusste ich nicht, was das für eine ist, also habe ich einfach mal Delphi Win32 ausgewählt... Ich habe als Programm Delphi 7 Personal benutzt und mein Betriebssystem ist Windows XP... naja ich denke, ihr wisst, was damit gemeint ist ;)

Jelly 28. Mai 2007 14:03

Re: Einfache Ampelsimulation funktioniert nicht...
 
Du hast den Fehler im Timer. Wenn du die Ampel von "Aus" auf "grün" stellst (deine erste if-Bedingung), vergisst du dein IAmpelAus.visible auf false zu setzen. Folglich ist beim 2. Timerdurchlauf deine erste Bedingung immer noch erfüllt, und es wird nie ein else-Zweig abgehandelt.

Ich würde versuchen, das Ganze etwas übersichtlicher zu gestalten, und dir eine TAmpel Klasse zu bilden. Denn spätestens wenn du deine Kreuzung mit mehreren Ampeln abbilden willst, wird deine if-Abfragerei ziemlich unübersichtlich. Wie die TAmpel Klasse aussehen könnte, wäre noch zu überlegen.

messie 28. Mai 2007 14:05

Re: Einfache Ampelsimulation funktioniert nicht...
 
Zitat:

Zitat von deepdragon
Aber wenn ich jetzt auf Start klicke, passiert nichts... :( Ich habe schon rumgerätselt, an was es liegen könnte, aber mir ist es einfach nicht aufgefallen...

Vielleicht kann da mal einer von euch drüber gucken und mir sagen, was ich falsch gemacht habe??

Also, bei mir passiert schon etwas mit Deinem Beispiel... nur bleibt die Ampel immer grün, weil der Block
Delphi-Quellcode:
if IAmpelaus.Visible then
    begin
      IAmpelgruen.Visible := true;
      IAmpelrot.Visible := false;
      IAmpelgelb.Visible := false;
      IAmpelrotgelb.Visible := false;
      Timer1.Interval := 4000;
    end
noch die Zeile
Delphi-Quellcode:
IAmpelaus.Visible := false;
braucht, sonst fährst Du immer in den ersten if-Block rein.

Übrigens ist es übersichtlicher, den Quelltext hier zu posten, und zwar ohne die Deklarationen..

Grüße, Messie

deepdragon 28. Mai 2007 14:07

Re: Einfache Ampelsimulation funktioniert nicht...
 
Zitat:

Zitat von Jelly
Du hast den Fehler im Timer. Wenn du die Ampel von "Aus" auf "grün" stellst (deine erste if-Bedingung), vergisst du dein IAmpelAus.visible auf false zu setzen. Folglich ist beim 2. Timerdurchlauf deine erste Bedingung immer noch erfüllt, und es wird nie ein else-Zweig abgehandelt.

Also ich habe jetzt "IAmpelaus.Visible := false;" eingegeben... hattest recht, das hatte ich noch vergessen... jetzt ist es aber trotzdem so, dass sich nichts tut, wenn ich auf Start klicke...??

Zitat:

Ich würde versuchen, das Ganze etwas übersichtlicher zu gestalten, und dir eine TAmpel Klasse zu bilden. Denn spätestens wenn du deine Kreuzung mit mehreren Ampeln abbilden willst, wird deine if-Abfragerei ziemlich unübersichtlich. Wie die TAmpel Klasse aussehen könnte, wäre noch zu überlegen.
Tut mir leid, aber das habe ich gar nicht verstanden... :( Was ist denn ein TAmpel? sry, aber das habe ich noch nie gehört... :(

deepdragon 28. Mai 2007 14:09

Re: Einfache Ampelsimulation funktioniert nicht...
 
Zitat:

Zitat von Jelly
Du hast den Fehler im Timer. Wenn du die Ampel von "Aus" auf "grün" stellst (deine erste if-Bedingung), vergisst du dein IAmpelAus.visible auf false zu setzen. Folglich ist beim 2. Timerdurchlauf deine erste Bedingung immer noch erfüllt, und es wird nie ein else-Zweig abgehandelt.

Also ich habe jetzt "IAmpelaus.Visible := false;" eingegeben... hattest recht, das hatte ich noch vergessen... jetzt ist es aber trotzdem so, dass sich nichts tut, wenn ich auf Start klicke...??

Hier noch mal der aktuelle Quelltext:

Delphi-Quellcode:
procedure TProjekt_Ampelsimulation_Form1.Timer1Timer(Sender: TObject);
begin
   if IAmpelaus.Visible then
    begin
      IAmpelaus.Visible := false;
      IAmpelgruen.Visible := true;
      IAmpelrot.Visible := false;
      IAmpelgelb.Visible := false;
      IAmpelrotgelb.Visible := false;
      Timer1.Interval := 4000;
    end

   else if IAmpelgruen.Visible then
    begin
      IAmpelaus.Visible := false;
      IAmpelgruen.Visible := false;
      IAmpelrot.Visible := false;
      IAmpelrotgelb.Visible :=false;
      IAmpelgelb.Visible := true;
      Timer1.Interval := 1000;
    end

   else if IAmpelgelb.Visible then
    begin
      IAmpelgelb.Visible := false;
      IAmpelgruen.Visible := false;
      IAmpelaus.Visible := false;
      IAmpelrotgelb.Visible := false;
      IAmpelrot.Visible := true;
      Timer1.Interval := 4000;
    end

   else if IAmpelrot.Visible then
    begin
      IAmpelrot.Visible := false;
      IAmpelaus.Visible := false;
      IAmpelgruen.Visible := false;
      IAmpelgelb.Visible := false;
      IAmpelrotgelb.Visible := true;
      Timer1.Interval := 1000;
    end

   else if IAmpelrotgelb.Visible then
    begin
      IAmpelaus.Visible := false;
      IAmpelrot.Visible := false;
      IAmpelrotgelb.Visible := false;
      IAmpelgruen.Visible := false;
      IAmpelgelb.Visible := true;
      Timer1.Interval := 1000;
    end

   else if IAmpelgelb.Visible then
    begin
      IAmpelaus.Visible := false;
      IAmpelgelb.Visible := false;
      IAmpelrot.Visible := false;
      IAmpelrotgelb.Visible := false;
      IAmpelgruen.Visible := true;
      Timer1.Interval := 4000;
    end
end;
Wíe gesagt, bei mir gehts immer noch nicht... :(



Zitat:

Ich würde versuchen, das Ganze etwas übersichtlicher zu gestalten, und dir eine TAmpel Klasse zu bilden. Denn spätestens wenn du deine Kreuzung mit mehreren Ampeln abbilden willst, wird deine if-Abfragerei ziemlich unübersichtlich. Wie die TAmpel Klasse aussehen könnte, wäre noch zu überlegen.
Tut mir leid, aber das habe ich gar nicht verstanden... :( Was ist denn ein TAmpel? sry, aber das habe ich noch nie gehört... :(

Robert Marquardt 28. Mai 2007 14:24

Re: Einfache Ampelsimulation funktioniert nicht...
 
Ich wuerde mal das Forum absuchen. Ampelsteuerung hatten wir schon mal.

Apollonius 28. Mai 2007 14:26

Re: Einfache Ampelsimulation funktioniert nicht...
 
TAmpel ist, wenn man das Ganze richtig ordentlich machen will, aber ich glaube, das ist momentan ein paar Nummern zu groß für dich :shock: . Allerdings hatten meine Vorredner schon recht: Ohne eine Klasse (das war mit TAmpel gemeint) wird es extrem unübersichtlich, wenn es auf mehrere Ampeln hinauslaufen soll. Also liest du dich entweder mal in objektorientierte Programmierung ein oder du beschränkst das Ganze auf maximal 3 Ampeln.

Klaus01 28. Mai 2007 14:28

Re: Einfache Ampelsimulation funktioniert nicht...
 
Wenn der Startbutton gedrückt wird einen definierten Anfangszustand für IAmpelAus.visible schaffen.

Delphi-Quellcode:
procedure TProjekt_Ampelsimulation_Form1.BStartEinfacheSimulationClick(
  Sender: TObject);
begin
    Timer1.Enabled := true;
    IAmpelAus.Visible:=true;
end;
Grüße
Klaus

deepdragon 28. Mai 2007 14:58

Re: Einfache Ampelsimulation funktioniert nicht...
 
Zitat:

Zitat von Klaus01
Wenn der Startbutton gedrückt wird einen definierten Anfangszustand für IAmpelAus.visible schaffen.

Delphi-Quellcode:
procedure TProjekt_Ampelsimulation_Form1.BStartEinfacheSimulationClick(
  Sender: TObject);
begin
    Timer1.Enabled := true;
    IAmpelAus.Visible:=true;
end;
Grüße
Klaus

Vielen Dank Klaus :)

Dank dir, startet die Ampel^^ Aber jetzt habe ich ein Problem... Die Ampel ist zuerst aus, so wie es sein soll... klicke ich auch Start, springt sie auf grün, wartet dann vier sekunden und springt dann auf gelb, dann auf rot und wartet bei rot wieder vier sekunden... das läuft alles prima. Dann springt die Ampel auf RotGelb und dann auf Gelb. Nur jetzt sollte sie auf Grün springen und wieder vier sekunden warten und dann wieder alles von vorne starten. Nur das geschieht nicht. Die Ampel springt nach Gelb wieder auf Rot und dann wiederholt sich nur die Prozedur: rot --> rotgelb --> gelb --> rot --> rotgelb --> gelb --> rot ... usw... Also da muss irgendwie ein Fehler sein... Ich gucke selbst noch mal drüber, aber wäre nett, wenn ihr es auch machen könntet. :)

Vielen Dank aber bis jetzt schon mal. Ihr seid echt spitze :)

Robert Marquardt 28. Mai 2007 15:18

Re: Einfache Ampelsimulation funktioniert nicht...
 
Ich habe in einem anderen Thread hier erklaert wie man eine Ampel repraesentiert.
Delphi-Quellcode:
type
  TAmpelZustand = (azRot, azRotGelb, azGruen, azGelb);
Man sollte nun eine Zustandsvariable einrichten die man im Timer weiterschaltet (von azGelb auf azRot zuruecksetzen natuerlich). Das ist die eigentliche Ampel. Vom Zustand der Ampel leitet man nun die visuelle Repraesentation ab.

Delphi-Quellcode:
var
  Ampel: TAmpelZustand;
...
begin
  // immer schoen Pascal ausnutzen
  // den kleinsten und groessten Wert einer Enumeration kann man per Low bzw. High bestimmen
  if Ampel = High(TAmpelZustand) then
    Ampel := Low(TAmpelZustand)
  else
    // Succ gibt das naechste Element einer Enumeration
    Ampel := Succ(Ampel);

  case Ampel of
    azRot:
      begin
        // Darstellung selber machen
      end;
    ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:48 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz