![]() |
Auto hält nicht an roter Ampel
Guten Abend Delphi-Freunde,
ich soll für die Schule eine Ampelschaltung programmieren, nur leider funktioniert eine Sache noch nicht und zwar, wie der Titel schon verrät, hält das Auto (shape Komponente) nicht bei rot.
Delphi-Quellcode:
procedure TForm1.Timer2Timer(Sender: TObject);
begin if (auto1.left = 120) and (rot.Visible = true) then begin auto1.left := 160; end else begin auto1.left := (auto1.left +3); if auto1.left = 720 then auto1.left := 0; end; end; das problem ist, das wenn es rot ist hält das shape (auto1) nicht an sonder fährt weiter und dann fährt es nicht bis zum punkt 720 sondern noch viel weiter... habe noch versucht erst abzufragen ob es rot ist und dann ob der wagen bei punkt 140 ist damit er dannach anhält. Ich hoffe ihr könnt mir helfen Mit freundlichen Grüßen snears |
AW: Auto hält nicht an roter Ampel
Versuch mal
Delphi-Quellcode:
if auto1.left >= 720 then
|
AW: Auto hält nicht an roter Ampel
Hallo,
vielleicht solltes du auf <= prüfen. Es kann ja sein, wenn Du die Position immer um 3 erhöhst, den Wert (120) nie genau triffst. Grüße Klaus |
AW: Auto hält nicht an roter Ampel
Also jetzt ist zumindest das Problem weg, dass es bis in die unendlichkeit fährt.
Aber es bleibt nicht stehen sondern fängt nun an von 160 an zu fahren :( auch wenn ich noch eine abfrage dazwischen schiebe funktioniert es nicht :shock::shock: |
AW: Auto hält nicht an roter Ampel
Es könnte auch sein, dass die Bedingung im if einmalig zutrifft aber das Auto dann bewegt wird, sodass der nächste Durchlauf wieder in den else-Zweig geht :stupid:
|
AW: Auto hält nicht an roter Ampel
ah okay ich habe das problem gefunden
Delphi-Quellcode:
einfach nur gucken... aber das fällt schon schwer :-D :lol:if (auto1.left <= 120) and (rot.Visible = true) then begin auto1.left := 120; end else begin auto1.left := (auto1.left +3); if auto1.left >= 720 then auto1.left := 0; end; |
AW: Auto hält nicht an roter Ampel
Da sich dein Auto nicht in Einerschritten bewegt, mußt du also auf Bereiche und keine genauen Werte prüfen, so daß dein Auto dieses auch trifft.
> oder < bringt nicht viel, wenn sich der Bereich mitten im Raum befindet. Tipp: Auf "= true" prüft man nicht.
Delphi-Quellcode:
Und wenn man das Ganze noch etwas umstellt, dann wird der Code kürzer und man spart sich das unnötige Setzen auf 120, wo dasAuto schon dort ist.
if rot.Visible and (auto1.left >= 120) and (auto1.left < 120 + 3) then
begin auto1.left := 120; end else begin auto1.left := auto1.left + 3; if auto1.left >= 720 then auto1.left := 0; end;
Delphi-Quellcode:
{ wenn nicht (rot und an Ampel), dann fahren }
if not (rot.Visible and (auto1.left >= 120) and (auto1.left < 120 + 3) then ... // bzw. { nur wenn nicht Rot oder vor Ampel oder hinter Ampel, dann fahren } { aka: nur wenn nicht Rot oder nicht an der Ampel, dann fahren } if not rot.Visible or (auto1.left < 120) or (auto1.left >= 120 + 3) then begin { ein Stückchen fahren } auto1.left := auto1.left + 3; { wenn aus dem Bild raus, dann auf Anfang } if auto1.left >= 720 then auto1.left := 0; end; |
AW: Auto hält nicht an roter Ampel
Zitat:
|
AW: Auto hält nicht an roter Ampel
Es kann tatsächlich zu Fehlern führen. Siehe
![]() |
AW: Auto hält nicht an roter Ampel
Zitat:
Caps |
AW: Auto hält nicht an roter Ampel
Ein Boolean ist 1 Byte groß und kann somit 256 Werte annehmen.
die Konstanten sind dabei so definiert: für den delphieigenen Boolean True = 1 False = 0 für die Windowstypen ByteBool (ShortInt), WordBool (SmallInt) und LongBool (Integer/LongInt) True = -1 False = 0 wobei es bei der Prüfung aber so lautet True <> 0 False = 0 Tja, nun fällt auch auf, warum es zu Problemen kommen kann
Delphi-Quellcode:
ergibt
if myBoolean = True then
Delphi-Quellcode:
,
if Byte(myBoolean) = 1 then
wärend
Delphi-Quellcode:
intern so
if myBoolean then
Delphi-Quellcode:
aussieht.
if Byte(myBoolean) <> 0 then
|
AW: Auto hält nicht an roter Ampel
Ja, das ist schon klar; was ich meine ist auch bloß, dass hier das Zweiwertigkeitsprinzip der Aussagenlogik in der Delphi-Aussagenlogik nicht mehr erfüllt ist, zumindest dann nicht, wenn es mehr Wahrheitswerte als true und false gibt, oder wenn man mit true und false nicht alle ("2") Fälle abdecken kann. Als Unwissender kann man darüber stolpern. Vor allem als Mathematiker.
|
AW: Auto hält nicht an roter Ampel
Zitat:
Eine Variable die auf einem Bit abgebildet werden müsste wird für TRUE je nach Gusto als $FFFFFFFF oder als 1 abgebildet, ein <> 0 dürfte in jedem Fall der Überprüfung standhalten. Interessanter finde ich dass folgende Konstrukte funktionieren...
Delphi-Quellcode:
const
true=0=1; var b:Boolean; begin b := true; if b then Showmessage('true') else Showmessage('False'); end; wenn man sich vorstellt ein Drittanbieter könne eine derartige Deklaration verwenden.... |
AW: Auto hält nicht an roter Ampel
Ok, das ist schon heftig :wink:.
Und es wird ein bisschen off-topic... Interessant finde ich, dass true offenbar kein reserviertes Wort ist. Die Frage ist: verwendet Delphi jetzt lokal immer Dein selbstdefiniertes true? Sollte es eigentlich, gel? Naja, für logische Ausdrücke kann man ja immerhin stets die Ausdrücke (1=1) für wahr und (0=1) für falsch verwenden, natürlich ohne cast... :-D Caps |
AW: Auto hält nicht an roter Ampel
True und False sind Konstanten.
Und innerhalb eines anderen Gültigkeitsbereich kann man Typen, Konstanten und Variablen lokal neu deklarieren. PS: Es gibt doch 2 Zustände?
Delphi-Quellcode:
und
False
Delphi-Quellcode:
aka =0 und <>0. :angle2:
not False
|
AW: Auto hält nicht an roter Ampel
Zitat:
Ja, aber hier (Delphi) kann gelten:
Code:
a := 2; // (a = not false) ist wahr
b := 1; // (b = not false) ist wahr c := (a = b); // c ist falsch, in der Aussagenlogik wäre c aber wahr (nur wenn a, b Wahrheitswerte sind), // weil immer gilt (not false = not false). // Weil es in der Aussagenlogik keine verschiedenen "not false" geben kann. |
AW: Auto hält nicht an roter Ampel
Zitat:
Code:
a := 2
Bool( a ) => not false ( a = b ) => false ( Bool( a ) = Bool( b ) ) => true |
AW: Auto hält nicht an roter Ampel
Klar, mit einem expliziten Cast funktioniert's natürlich.
Aber ohne Cast kriegt man Probleme, das ist eigentlich schon alles. |
AW: Auto hält nicht an roter Ampel
Wenn es schon ein Auto Objekt gibt, warum gibt es kein Ampel Objekt?
|
AW: Auto hält nicht an roter Ampel
Und vergiß das Straßenobjekt nicht. :)
es geht auch mit rein logischen Mitteln :stupid:
Delphi-Quellcode:
=
if a <> b then
Delphi-Quellcode:
if a xor b then
Delphi-Quellcode:
=
if a = b then
Delphi-Quellcode:
,
if (a and b) or (not a and not b) then
Delphi-Quellcode:
if not (a xor b) then
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 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 by Thomas Breitkreuz