![]() |
Fußgängerampel
hey leute,
für den info- unterricht sollen wir eine kreuzung progr., mit fußgängern, zwei, f ampeln, und zwei normalen ampeln. jetzt bin ich an der stelle das die fußgänger hinzukommen, die zwei einfache shapes sind. bei betätigen des jeweils richtigen buttons soll der fußgänger auch auf dieser seite rübergehen und dann wieder am ausgangspunkt auftauchen. mein bisweiliger quelltext sieht so aus:
Delphi-Quellcode:
hoffe es kennt jemand die antwort
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Buttons; type TForm1 = class(TForm) Shape12: TShape; 1.Brush.Color:=clmaroon; A2.Brush.Color:=clyellow; A3.Brush.Color:=clGreen; B1.Brush.Color:=clmaroon; B2.Brush.Color:=clyellow; B3.Brush.Color:=clGreen; zustand:='ampelgelb'; timer1.enabled:=true; end; end; procedure TForm1.Timer1Timer(Sender: TObject); begin if zustand='ampelgruen' then begin ampel1.brush.color:=clred; ampel2.brush.color:=clgreen; ampel3.brush.color:=clred; ampel4.brush.color:=clgreen; A1.Brush.Color:=clmaroon; A2.Brush.Color:=clolive; A3.Brush.Color:=cllime; B1.Brush.Color:=clmaroon; B2.Brush.Color:=clolive; B3.Brush.Color:=cllime; zustand:='ampelrot'; timer1.enabled:=false; end; if zustand='aampelrot' then begin A1.Brush.Color:=clred; A2.Brush.Color:=clolive; B1.Brush.Color:=clred; B2.Brush.Color:=clolive; ampel1.brush.color:=clmaroon; ampel2.brush.color:=cllime; ampel3.brush.color:=clmaroon; ampel4.brush.color:=cllime; zustand:='ampelrotgelb'; end; if zustand='ampelgelb' then begin A1.Brush.Color:=clred; A2.Brush.Color:=clolive; A3.Brush.Color:=clgreen; B1.Brush.Color:=clred; B2.Brush.Color:=clolive; B3.Brush.Color:=clgreen; ampel1.brush.color:=clmaroon; ampel2.brush.color:=cllime; ampel3.brush.color:=clmaroon; ampel4.brush.color:=cllime; zustand:='aampelrot'; end; if zustand='ampelrotgelb' then begin ampel1.brush.color:=clred; ampel2.brush.color:=clgreen; ampel3.brush.color:=clred; ampel4.brush.color:=clgreen; A1.Brush.Color:=clred; A2.Brush.Color:=clyellow; A3.Brush.Color:=clgreen; B1.Brush.Color:=clred; B2.Brush.Color:=clyellow; B3.Brush.Color:=clgreen; zustand:='ampelgruen'; end; end; procedure TForm1.IIClick(Sender: TObject); begin if zustand='ampelrot' then begin A1.Brush.Color:=clmaroon; A2.Brush.Color:=clyellow; A3.Brush.Color:=clGreen; B1.Brush.Color:=clmaroon; B2.Brush.Color:=clyellow; B3.Brush.Color:=clGreen; zustand:='ampelgelb'; timer1.enabled:=true; end; end; end. |
Re: Fußgängerampel
Zitat:
[edit] 42, what was the question? :mrgreen: SCNR^^ [/edit] |
Re: Fußgängerampel
An deiner Stelle würde ich den Code erstmal in den "Delphi-Code"-Tag schreiben und den Shapes vernünftige Namen geben, damit jeder mehr oder weniger weiß, was damit anzufangen ist.
|
Re: Fußgängerampel
Hi
Ich kenn die Antwort: Code in DelphiTags und einrücken ! Ich weiß nicht, wie oft hier schon der Hinweis auf das Einrücken von Codezeilen gegeben worden ist, vermutlich noch häufiger, wie das Thema Ampelschaltungen.... Geh doch mal in die Suche und gib Ampel ein... und... Da ist dann auch eventuell Code, ordentlich eingerückt und dokumentiert. Nur lesen mußt du selber, weil du das Ergebnis der Suche auf deine Vorgabe anpassen mußt. Gruß oldmax |
Re: Fußgängerampel
achso ja, die frage, war ich zu fix mit dem schreiben...
die fußgänger solln sich wie oben beschrieben bewegen, aber irgendwie krieg ich das net hin und die meisten shapes sind einfache streifen, die die benötigt werden sind beschriftet... f1 u f2 sind die fußgänger... ampel 1-4 sin fußgängerampellicheter (oder so) a 1-3 sind die lichter einer ampel b 1-3 die der anderen |
Re: Fußgängerampel
Hier mal meine Lösung für eine Ampel:
Delphi-Quellcode:
Eine Ampel ist ein Zustandsautomat. Also habe ich die möglichen Zustände mit einem Enumerationstypen definiert. Dann brauche ich nur noch entscheiden welcher Zustand als nächstes kommt, wenn sich die Ampel in einem bestimmten Zustand befindet. Da Enumerationstypen auch Ordinaltypen sind lässt sich dies am effektivsten mit einer case-Verzweigung lösen.
type
TAmpelPhase = ( apRot = 0, apRotGelb = 1, apGelb = 2, apGruen = 3); type TForm1 = class(TForm) Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private declarations } AktuelleAP: TAmpelPhase; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin AktuelleAP := apRot; end; procedure TForm1.Timer1Timer(Sender: TObject); begin case AktuelleAP of apRot: begin Caption := 'Rot'; AktuelleAP := apRotGelb; end; apRotGelb: begin Caption := 'RotGelb'; AktuelleAP := apGruen; end; apGelb: begin Caption := 'Gelb'; AktuelleAP := apRot; end; apGruen: begin Caption := 'Grün'; AktuelleAP := apGelb; end; end; end; |
Re: Fußgängerampel
Und editiere Deinen ersten Beitrag bitte noch einmal und schließe den Quellcode in Delphi-Tags ein:
Delphi-Quellcode:
, dann ist er besser zu lesen.
Code
Achja, sry: Willkommen in der DP :dp: |
Re: Fußgängerampel
öhm, ja, danke für die hilfe luckie, aber ich glaub nich das mein lehrer mir glaubt das ich den geschrieben hab :mrgreen:
, der hatte gesagt das das mit schleifen gemacht werden soll, werd ich nächstes mal dazuschreiben^_^ |
Re: Fußgängerampel
Hi
Velleicht läßt sich so helfen.. Stell dir die ußgängerampel einmal vor, was passiert da ? Die Autofahrer haben grün bis ein Fußgänger kommt und auf eine Taste drückt. Das ist ein Ereignis ! Nun setzt du das in einer Schleife um Also suchen wir eine geeignete Schleife Es gibt die For anfang to ende diese ist starr und arbeitet immer von Anfang bis Ende. Es gibt die Repeat until Abbruchbedingung. Das hört sich doch schon gut an und eine While do ( Wenn wahr dann tu immer das selbe) Auch das ist brauchbar Nun zur Ampel. Die Ampelsequenzen sollten dir bekannt sein. Ergo mußt du mit deinem Ereignis eben genau diese Sequenz nachbilden Ereignis kommt Fahrzeugampel auf gelb ->Pause -> Rot ->Pause -> Fußgänger Grün -> Pause ->Fußgänger Rot -> Pause -> Gelb und Rot für Fahrzeug -> Pause -> Grün führ Fahrzeug bis zum nächsten Ereignis. Das sind immer die gleichen 6 Schritte, also bietet sich hierfür eine For-Schleife an Die Zeit, die dein Ampelzyklus laufen soll, ist unbekannt, also nimmst du hierfür eine Repeat
Delphi-Quellcode:
Damit legst du den äußeren Rahmen fest.
Repeat
..... // Hier kommt deine Ampelsteuerung hinein until MyButtonStop.Click; // dies ist die Abbruchbedingung, sonst hast du eine Endlosschleife Um die Ampel auszulösen benötigst du ein Button und einen globalen Merker, um den Ampelzyklus zu starten Also wird die Variable
Delphi-Quellcode:
global deklarieert.
Ampelzyklus : Boolean;
In der Ereignisprocedure der Ampalanforerung (MyAmpelButton) setzt du diese Variable auf true; Nun gehst du in die Repeat Schleife und fügst den Ampelzyklus mit der Bedingung Ampelzyklus eine For Schleife ein.
Delphi-Quellcode:
Mußt du nun Bewegungen einsetzen, schreibst du das in die entsprechenden Schritte, bzw. in die Schleife an die richtige Stelle.
If Ampelzyklus then
Begin For i:=1 to 6 do Begin .... // hier legst du deine 6 Schritte fest .... // benutze [b]Case[/b] oder wenn du noch nicht soweit bist dann halt [b]if[/b] end; Ampelzyklus:=False; // Ampelzyklus zurücksetzen end; Mach dir Gedanken, wie du die Bewegung eines Objektes durchführen kannst. Dafür gibt es die Eigenschaften Top und Left. Wenn du die Werte dieser Eigenschaften veränderst, wandert das Objekt an die Stelle. Es gibt die Eigenschaft Color, die du beeinflussen kannst. Delphi ist da sehr hilfsbereit und erklärt dir viel in der Hilfe. Die mußt du nutzen, um eigene Gedanken in ein Programm zu fassen. Dir alles vorzuschreiben, das ist, wie du schon richtig geäußert hast, auffällig ud hilft dir auch nicht, zu verstehen, was eigentlich Programme sind. Nix anderes, wie Abarbeiten von Schleifen und ein unermüdliches Zusammentragen von Daten, Berechnungen, Vergleichen usw. sowie ein Reagieren auf Ereignisse, sei es Tastatur, Maus oder Sonstwas für Signale.... Wenn dir klar wird, wie du eine Aufgabe in Schitte zerlegst, hast du eigentlich schon das Ergebnis. Und beachte: Auch bewegungen sind Schritte.... Gruß oldmax |
Re: Fußgängerampel
danke oldmax, auf schleife hab ich gewartet^^
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:52 Uhr. |
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