AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Einfache Ampelsimulation funktioniert nicht...
Thema durchsuchen
Ansicht
Themen-Optionen

Einfache Ampelsimulation funktioniert nicht...

Ein Thema von deepdragon · begonnen am 28. Mai 2007 · letzter Beitrag vom 10. Jun 2007
Antwort Antwort
Seite 3 von 3     123   
deepdragon

Registriert seit: 28. Mai 2007
22 Beiträge
 
Delphi 7 Personal
 
#21

Re: Einfache Ampelsimulation funktioniert nicht...

  Alt 2. Jun 2007, 20:25
Zitat von Gremlin:
Jo, scheint am Anfang ein wenig zu flimmern, wenn du neue Bilder lädst, aber es fällt fast nicht auf. Du könntest evetuell Shapes verwenden. Die Anwendung sieht ja schon mal ganz interessant aus.

Wann machst du die neue Möglichkeiten rein?
Wie meinst du das mit Shapes?? Das habe ich net verstanden...

Naja wir haben mit dem Projekt noch bis zum 15. Juni zeit... und da ich noch einige Klausuren schreibe, haben die erstmal vorrang... aber wenn ich die dann geschrieben habe, werde ich mitte bis ende nächster Woche weitermachen...^^ Naja wenns dann fertig ist, werde ich es euch noch mal zeigen... oder wenn ich noch mal Hilfe brauche^^

Bis dann Deepdragon^^
  Mit Zitat antworten Zitat
Gremlin

Registriert seit: 18. Apr 2006
Ort: Im Süden
177 Beiträge
 
Delphi 7 Enterprise
 
#22

Re: Einfache Ampelsimulation funktioniert nicht...

  Alt 2. Jun 2007, 20:39
Hallo deepdragon,

Shapes (von der Klasse TShape) sind einfache geometrische Figuren. Du musst dann keine Bilder mehr laden und kannst stattdessen die Ampel selbst darstellen (jeweils ein Shape für rot, gelb und grün). Um die Farbe zu setzen, kannst du die Property Brush.Color verwenden. Die Figur kann über Shape=stCircle gesetzt werden. Sollte nur als einfache Anregung gedacht sein.

Viel Erfolg.
Gruss Gremlin
  Mit Zitat antworten Zitat
deepdragon

Registriert seit: 28. Mai 2007
22 Beiträge
 
Delphi 7 Personal
 
#23

Re: Einfache Ampelsimulation funktioniert nicht...

  Alt 3. Jun 2007, 14:14
Zitat von Gremlin:
Hallo deepdragon,

Shapes (von der Klasse TShape) sind einfache geometrische Figuren. Du musst dann keine Bilder mehr laden und kannst stattdessen die Ampel selbst darstellen (jeweils ein Shape für rot, gelb und grün). Um die Farbe zu setzen, kannst du die Property Brush.Color verwenden. Die Figur kann über Shape=stCircle gesetzt werden. Sollte nur als einfache Anregung gedacht sein.

Viel Erfolg.
Vielen Dank

Ich hab das jetzt mit Shapes gemacht... Und es klappt ganz gut^^ Ich habe wieder einmal einen Fehler drin gehabt über den ich ne halbe Stunde gebrütet habe^^ Dann hab ich ihn aber gefunden und es hat alles funktioniert

Ihr könnt euch das fertige Shape Projekt noch mal angucken... Nur damit ich weiß, dass ich das mit den Shapes auch richtig verstanden habe und ich es auch so gemacht habe, wie ihr es gemeint habt...


Aber noch ne Frage... Ich will ja jetzt ein neues Formular einbinden... Das ist ja ganz einfach mit 'Form2.show' ... Aber die Frage ist jetzt, ob ich die Ampel wieder neu machen muss oder ich auf das erste Formular zurückgreifen kann? Also die Frage ist etwas kompliziert und wenn ihr sie nicht verstanden habt, macht das nichts^^ Aber ich will jetzt im zweiten Formular eine Ampel mit einer Fußgängerampel koppeln... Und auf der Fußgängerampel ist dann ein Button und wenn man den drückt, geht logischerweise die "Auto"-Ampel auf rot und dann die Fußgängerampel auf grün.. ...
Und muss ich da jetzt wieder den ganzen Quellcode aufschreiben?? Weil wenn ich daran denke, wenn ich erstmal die Kreuzung mache (obwohl ihr euch die net so spektakulär vorstellen müsst... ich werde nur eine einfache machen, auf der es keine Abbiegerspuren gibt... ), wird das ja noch komplizierter wenn ich dann so einen ellenlangen Quelltext hab^^

Naja aber danke schon mal bis hierher
Deepdragon
Angehängte Dateien
Dateityp: zip ampel_mit_shape_727.zip (355,3 KB, 19x aufgerufen)
  Mit Zitat antworten Zitat
Gremlin

Registriert seit: 18. Apr 2006
Ort: Im Süden
177 Beiträge
 
Delphi 7 Enterprise
 
#24

Re: Einfache Ampelsimulation funktioniert nicht...

  Alt 3. Jun 2007, 15:45
Ha das sieht ja schonmal ganz gut aus und ist sicher ausbaufähig

Ich würd mal die erste Seite lassen und ein komplett neues Formular machen. Dann hast du einerseits immer noch eine funktionierende erste Seite und du hast eine Vorlage für deine Ampel mit Fussgängerfunktion. Kopier einfach alle Komponenten des ersten Formulars auf dein 2. Formular und ergänze deine Ampel um eine Fussgängeranzeige und einem zusätzlichen Button. Dann brauchst du noch einen zusätzlichen Timer für die Fussgängerperiode.

Wenn du dann davor bist eine gesamte Ampelanlage simulieren zu wollen und deine erste Lösung anschaust, wirst du bemerken, das deine sichtbaren Komponenten an die Steuerung der Ampel direkt gebunden sind. Das kann man sicher so machen, nur wird es sehr schwierig diese Art von Code zu erweitern. Besser wäre es jetzt vielleicht für dich, wenn du dir eine Procedure überlegen würdest, die du zur Kontrolle der Anzeige benutzen kannst, zb. "AmpelAnzeigen" mit Parametern für die Angabe der anzuzeigenden Signale (rot, gelb, grün). Diese kannst du in deiner Steuerung (Timer) aufrufen.
Da du aber nicht mehr die Shapes als Information über deinen Ampelstatus verwenden solltest, musst du dir dafür etwas anderes überlegen, zb. könntest du alle Ampelzustände (grün, gelb, rot, rotgelb) als Reihe betrachten, die nacheinander alle Zustände durchschaltet.

Versuch dich jetzt aber mal zuerst in der Fussgängererweiterung und arbeite dich dann Schritt für Schritt an bessere Lösungen für deine Probleme heran
Gruss Gremlin
  Mit Zitat antworten Zitat
deepdragon

Registriert seit: 28. Mai 2007
22 Beiträge
 
Delphi 7 Personal
 
#25

Re: Einfache Ampelsimulation funktioniert nicht...

  Alt 3. Jun 2007, 20:38
So... also ich hab jetzt das zweite Formular gemacht...
Wundert euch nicht, es funktioniert noch nicht vollständig und es sieht auch noch nicht gut aus... Ich habe erstmal nur das Hauptprogramm gemacht, und nicht auf die Optik geachtet... also damit meine ich sachen wie Überschrift und Anleitungstext... Ihr müsst einfach nur auf Erweiterte Simulation klicken und dann öffnet sich das zweite Formular... Ich muss den Text im ersten noch ändern, weil dort ja steht, dass im 2. Formular die Kreuzung kommt, was aber nicht der Fall ist... Aber das ist wie gesagt erstmal zweitrangig... die optikfehler merze ich dann aus, wenn das prg. läuft... und da ist ein erheblicher fehler drin... nämlich wenn fußgänger ampel auf grün ist und die Autoampel auf rot, springt die Fußgängerampel nach drei Sekunden nicht mehr auf rot und somit läuft der letzte Teil des Quelltextes erst gar nicht ab... Ich habe schon seit zwei Stunden dran gesessen und weiß echt nicht mehr, was ich falsch gemacht habe...

Hier ist der komplette Quelltext:

Delphi-Quellcode:
procedure TForm1.BAmpelOClick(Sender: TObject);
begin
  BAmpelO.Caption := 'Signal kommt!';
  BAmpelU.Caption := 'Signal kommt!';
  Timer1.Enabled := true;
end;

procedure TForm1.BAmpelUClick(Sender: TObject);
begin
  BAmpelU.Caption := 'Signal kommt!';
  BAmpelO.Caption := 'Signal kommt!';
  Timer1.Enabled := true;
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
  if ARL.Visible and ARR.Visible then
   begin
     FRL.Visible := false;
     FRR.Visible := false;
     FGRL.Visible := true;
     FGRR.Visible := true;
     Timer3.Enabled := true;
   end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin

   if not ARL.Visible and not ARR.Visible and not AGL.Visible and not AGR.Visible and not AGRL.Visible and not AGRR.Visible then
    begin
      ARL.Visible := false;
      ARR.Visible := false;
      AGL.Visible := false;
      AGR.Visible := false;
      AGRL.Visible := true;
      AGRR.Visible := true;
      Timer1.Interval := 4000;
    end

   else if AGRL.Visible and AGRR.Visible and not AGL.Visible and not AGR.Visible then
    begin
      AGRL.Visible := false;
      AGRR.Visible := false;
      ARL.Visible := false;
      ARR.Visible := false;
      AGL.Visible := true;
      AGR.Visible := true;
      Timer1.Interval := 1000;
    end

   else if AGL.Visible and AGR.Visible and not ARL.Visible and not ARR.Visible then
    begin
      AGL.Visible := false;
      AGR.Visible := false;
      AGRL.Visible := false;
      AGRR.Visible := false;
      ARL.Visible := true;
      ARR.Visible := true;
      Timer1.Interval := 4000;
    end;

Timer2.Enabled := true;
end;

procedure TForm1.Timer3Timer(Sender: TObject);
begin
     Timer3.Interval := 3000;
     BAmpelO.Caption := 'Drücken';
     BAmpelU.Caption := 'Drücken';
     Timer4.Enabled := true;
end;

procedure TForm1.Timer4Timer(Sender: TObject);
begin
  if ARL.Visible and ARR.Visible then
   begin
    FRL.Visible := true;
    FRR.Visible := true;
    FGRL.Visible := false;
    FGRR.Visible := false;
    Timer5.Enabled := true;
   end;
end;

procedure TForm1.Timer5Timer(Sender: TObject);
begin

if FRL.Visible and FRR.Visible then
    begin
      if not AGL.Visible and not AGR.Visible and not AGRL.Visible and not AGRR.Visible then
        begin
          ARL.Visible := true;
          ARR.Visible := true;
          AGL.Visible := true;
          AGR.Visible := true;
          AGRL.Visible := false;
          AGRR.Visible := false;
          Timer3.Interval := 1000;
        end

      else if ARL.Visible and ARR.Visible and AGL.Visible and AGR.Visible then
         begin
          ARL.Visible := false;
          ARR.Visible := false;
          AGL.Visible := false;
          AGR.Visible := false;
          AGRL.Visible := true;
          AGRR.Visible := true;
          Timer3.Interval := 4000;
         end
    end;
end;

end.
Die Datei hab ich auch noch beigefügt, damit ihr mal seht, was ich meine... Und tut mir leid, aber der Quelltext ist ziemlich krass...^^ Ich hab 5 Timer verwendet^^ hehe

Naja und die Bezeichnungen sollte ich euch vielleicht noch kurz erklären:
ARL heißt AmpelRotLinks... mit Ampel meine ich die beiden AutoAmpeln... Mit Rot eben die Farbe und mit Links, dass es die auf der linken Seite des Zebrastreifens ist... ARR heißt dann logischerweise AmpelRotRechts...
FRL heißt FußgängerampelRotLinks... also steht das F für Fußgängerampel und R wieder für Rot und L für Links, also auf der linken Seite des Zebrastreifens...
G = Gelb
GR = Grün
R = Rot
A = Autoampel
F = Fußgängerampel
L = Links
R = Rechts

Es ist für einen außenstehenden echt sehr kompliziert, aber ich weiß ganz genau, was mit was gemeint ist... ich komme nicht durcheinander... Aber da muss eben ein Fehler drin sein
Angehängte Dateien
Dateityp: exe pampelsimulation_123.exe (514,5 KB, 10x aufgerufen)
  Mit Zitat antworten Zitat
deepdragon

Registriert seit: 28. Mai 2007
22 Beiträge
 
Delphi 7 Personal
 
#26

Re: Einfache Ampelsimulation funktioniert nicht...

  Alt 7. Jun 2007, 14:01
Hi...

kann mir denn keiner helfen? das ist natürlich schade... ich habe das programm jetzt noch mal etwas verändert... aber es funktioniert immer noch nicht... Ich habe diesmal die ganze Source mit angehängt... Vielleicht könnt ihr mir so leichter helfen... ich komme wirklich nicht drauf, was ich falsch gemacht haben könnte...
Angehängte Dateien
Dateityp: zip ampel-projekt_168.zip (465,4 KB, 4x aufgerufen)
  Mit Zitat antworten Zitat
waldforest

Registriert seit: 8. Mai 2005
366 Beiträge
 
Delphi XE3 Enterprise
 
#27

Re: Einfache Ampelsimulation funktioniert nicht...

  Alt 7. Jun 2007, 18:56
Hallo,
das Teil sah doch schon super aus
, es fehlte meiner Meinung nach nur ne Kleinigkeit.

Mit den ganzen Timern kommt man schon mal durcheinander. Ein Tipp.
wenn man etwas einschaltet, hilft es manchmal dieses auch wieder aus zu schalten. (mir gehts manchmal genau so, vor lauter Bäumen sieht man den Wald nicht mehr.

Ich hoffe, mir gings nicht genau so und habe noch etwas vergessen.


mfg waldforest
Angehängte Dateien
Dateityp: zip ampel-simulation_445.zip (469,6 KB, 2x aufgerufen)
  Mit Zitat antworten Zitat
waldforest

Registriert seit: 8. Mai 2005
366 Beiträge
 
Delphi XE3 Enterprise
 
#28

Re: Einfache Ampelsimulation funktioniert nicht...

  Alt 7. Jun 2007, 19:05
Siehest, und schon ist es mir auch passiert, hab den Timer 5 nicht ausgeschaltet und schon käme es zu einer brutalen kollision zwischen Fußgänger und Autofahrer.
Angehängte Dateien
Dateityp: zip ampel-simulation_177.zip (469,7 KB, 19x aufgerufen)
  Mit Zitat antworten Zitat
deepdragon

Registriert seit: 28. Mai 2007
22 Beiträge
 
Delphi 7 Personal
 
#29

Re: Einfache Ampelsimulation funktioniert nicht...

  Alt 8. Jun 2007, 17:13
Zitat von waldforest:
Siehest, und schon ist es mir auch passiert, hab den Timer 5 nicht ausgeschaltet und schon käme es zu einer brutalen kollision zwischen Fußgänger und Autofahrer.
mensch, das ist ja echt geil^^ naja auf die dumme idee, die schalter auch wieder ausstellen zu müssen, hätte ich natürlich auch kommen können....
aber echt vielen dank... So... und bevor ich mich jetzt an die einfache Kreuzung wage, habe ich noch eine Frage:
Euch ist sicher aufgefallen, dass in der Ampelsimulation mit der Fußgängerampel die Shape-Formen nicht ganz die alten abdecken... und das sieht nicht so professionell aus... Gibts da nicht einen Weg das ganze abdeckend darzustellen? Weil wenn dann noch ein kleiner Rand von dem unteren ausgeschalteten "Ampellicht" hinter dem leuchtenden Ampellicht zu sehen ist, sieht das nicht grad schön aus... naja aber das wäre nur rein optisch gesehen... schlimm ist es jetzt auch nicht, sieht aber nicht so schön aus

Vielen Dank,
Deepdragon
  Mit Zitat antworten Zitat
oldmax

Registriert seit: 27. Apr 2006
Ort: Gieboldehausen
167 Beiträge
 
#30

Re: Einfache Ampelsimulation funktioniert nicht...

  Alt 10. Jun 2007, 06:58
Hi
Bisher hast du schon eine Menge Programmcode bekommen und auch selbst geschrieben, doch ich glaube, genauso wichtig ist ein Hinweis auf die „Problemlösung“. Ein Programm ohne Probleme gibt es nicht und daher werden auch die Programmierer so gut bezahlt. ( meistens jedenfalls..)
Also, gut ist, das du dich nicht mit der Einzelampel zufrieden gibst. Gut ist, das du erkannt hast, das 1 Anpel schon viel Code ist, eine Kreuzung scheinbar das vielfache... doch ich möchte dir mal eine einfache Lösung vorstellen, die du relativ einfach umsetzen und ausbauen kannst.
Betrachten wir einmal eine Ampel in ihrer Funktion stellen wir fest, es sind immer die gleichen Abläufe in Schritten, die Ampelphasen. Listen wir diese einmal auf und beginnen mit Rot
1 : Rot sagen wir mal 20 sek (20 000ms)
2: RotGelb setzen wir z.B. auf 5 sek (5 000ms)
3: Grün muss kürze wie Rot sein daher 15 sek (20 000ms)
4: Gelb da nehmen wir mal 4 sek (4 000ms)
5: Rot -> wieder 1
Wie setzt nun ein Programmierer diese Schritte um, sind doch fast alle Schritte unterschiedlich lang...
Ein Timer wird bekanntlich durch die Intervallzeit getriggert, also nehmen wir ein Array
Zeiten : Array[1..4] of Integer;
und tragen dort die ms für die einzelnen Schrittzeiten ein.
Zeiten[1]:=20000;
Zeiten[2]:=5000;
Zeiten[3]:=15000;
Zeiten[4]:=4000;
Nun brauchen wir noch einen Zähler, der bis 4 zählt und dann wieder von vorn begint. Das ist in der Regel mit einer Interger-Variablen realisierbar

In der Timer-Ereignisroutine schreiben wir folgenden Code:

Delphi-Quellcode:
......
    Zaehler :=Zaehler+1; // alternativ Inc(Zaehler)
    If Zaehler=5 then Zaehler:=1;
    Timer.Intervall:=Zeiten[Zaehler]; // Zuweisung der Zeit für die Anpelphase
    Case Zaehler of 1: Show_Rot;
                             2: Show_Rotgelb;
                             3: Show_Gruen;
                             4. Show_Gelb;
    end;
Mit diesem Code hast du erst mal die Ampelsequenzen festgelegt. Was steckt aber hinter Show_Irgendwas ? Nun, das sind Proceduren, die nichts anderes tun, als die einzelnen Ampelphasen anzuzeigen und die mußt du programmieren und das machen wir einmal gaaaanz einfach.
Du ziehst dir ein Panel auf das Formular. In dieses Panel setzt du drei Shapes mit der Eigenschaft stCircle und gestaltest nun so ein Abbild einer Ampel. Bei den Shapes findest du die Eigenschaft Color unter Brush. Also setzt du z.B. das oberste Shape auf ClRed und die anderen zwei auf clBlack.. Nun clickst du das Panel an und mit Copy & Paste setzt du dir 4 von diesen Ampelbildern in deine Form. Anschließend setzt du die Farben der Shapes entsprechend der Ampelphasen. Dann benennst du die Panels entsprechend der Phase so wie Pn_Rot, Pn_Gelb, Pn_Gruen und Pn_RotGelb. Pn_ steht dabei für Panel.
Dann legst du alle 4 Panels direkt aufeinander.
Und nun kommen wir nun zu den Proceduren....
Delphi-Quellcode:
Procedure TmyForm,Show_Rot;
Begin
  Pn_Gruen.Visible:=False;
  Pn_RotGelb.Visible:=False;
  Pn_Gelb.Visible:=False;
  Pn_Rot.Visible:=True; // dieses Panel ist als einziges sichtbar
End;
TmyForm steht für deine Form. Daher mußt du die Procedure und auch die anderen drei unter Private vorher deklarieren, ohne TmyForm. Einfach gehts auch hier mit C&P (man ist ja schreibfaul) und der entsprechenden Umbenennung und Anpassung der Visible-Eigenschaft.
um eine ausgeschaltete Ampel mit gelben Blinklicht zu versehen, würd ich einen zweiten Timer aktivieren und den Countertimer ausblenden.
die zweite Timerprocedure wäre dann ganz einfach:

Pn_Gelb.Visible:=NotPn_Gelb.Visible; In deinem Schalter setzt du alle Ampelbilder auf Visible.False bevor du die Timer aktivierst bzw.deaktivierst.
Wenn du nun genau so an deine Kreuzung gehst, dir Gedanken machst, wieviele Schritte du brauchst und wann du welches Ampelbild wo sehen willst, ist es einfach, diesen Code entsprechend zu erweitern. Anschließend kannst du dir ja mal Gedanken machen, ob es vielleicht ausreicht, nur das aktuell sichtbare Ampelbild beim Phasenwechsel auszublenden, denn alle anderen sind ja bereits ausgeblendet.
Ich hoffe, dir einen einfachen Weg gezeigt zu haben, der relativ wenig Programmierarbeit erforderlich macht und auch übersichtlich ist. Der Weg, über ein Ampelobjekt zu gehen, ist hier in etwa angedeutet, dies jedoch zu erklären, würde diesen Tread sprengen. Er ist so schon lang genug.
Gruß oldmax
Noch ist mein Rechner mir zu Diensten.... ansonsten habe ich die Macht ihn zu vernichten !
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 20:23 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