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/)
-   -   Ampel mit visible=true/false (https://www.delphipraxis.net/62804-ampel-mit-visible%3Dtrue-false.html)

Jackel89 9. Feb 2006 18:37


Ampel mit visible=true/false
 
Liste der Anhänge anzeigen (Anzahl: 1)
hi erstmal! tut mir leid falls ich ins falsche forum schreibe oder eine total dumme frage stele - aber ich bin ein ziemlicher delphi-noob :wink: naja ich bin in der 11. Klasse und wir haben in Informatik grade mit delphi angefangen (haben vorher Turbo Pascal gemacht), jetzt sollen wir eine Ampel programmieren, die beim Klicken eines buttons einen "status" weitergeht, also grün -> gelb -> rot -> rot-gelb -> grün und so weiter. Das ganze soll mit visible:=true bzw. false und if, then, else gemacht werden!

Ich versuche das jetzt schon Stundenlang aber ich kriegs einfach nicht hin, vielleicht könnt ihr mir ja sagen wo in meinem Programm der Fehler ist.

Das ist die Prozedur die ich momentan gemacht hab - wenn ich das Programm starte, schaltet er aber nur zwischen grün und rot+gelb um :(

Delphi-Quellcode:
procedure TForm1.switchClick(Sender: TObject);
begin

if Form1.sh_red.visible=true and Form1.sh_yellow.visible=true and Form1.sh_green.visible=false
then begin Form1.sh_red.visible:=false; Form1.sh_yellow.visible:=false; Form1.sh_green.visible:=true; end else

IF Form1.sh_red.visible=false and Form1.sh_yellow.visible=true and Form1.sh_green.visible=false
then begin Form1.sh_red.visible:=true; Form1.sh_yellow.visible:=false; Form1.sh_green.visible:=false; end else

IF Form1.sh_red.visible=false and Form1.sh_yellow.visible=false and Form1.sh_green.visible=true
then begin Form1.sh_red.visible:=false; Form1.sh_yellow.visible:=true; Form1.sh_green.visible:=false; end else

IF Form1.sh_red.visible=true and Form1.sh_yellow.visible=false and Form1.sh_green.visible=false
then begin Form1.sh_red.visible:=true; Form1.sh_yellow.visible:=true; Form1.sh_green.visible:=false; end else

end;

Nils_13 9. Feb 2006 18:43

Re: Ampel mit visible=true/false
 
Hi,

herzlich willkommen in der dp :party: !

Müsst ihr das wirklich so machen ?

Das ist sehr umständlich, ich habe hier ein kleines Beispiel, ist aber nicht für die manuelle, sondern für die Automatische Schaltung, denke du kannst dir da das was du brauchst besorgen.
Für das Beispiel brauchst du 3 Shapes.
Delphi-Quellcode:
var
  Form1: TForm1;
  i: integer;

// ...

procedure TForm1.AmpelTimer(Sender: TObject);
begin
case i of
0:
begin
rot.brush.Color := clRed;
gelb.brush.Color := clOlive;
gruen.brush.Color := $00004000;
inc(i);
form1.refresh;
end;

1:
begin
rot.brush.Color := clred;
gelb.brush.Color := clYellow;
gruen.brush.Color := $00004000;
form1.refresh;
inc(i);
end;

2:
begin
rot.brush.Color := clMaroon;
gelb.brush.Color := clOlive;
gruen.brush.Color := cllime;
form1.refresh;
inc(i);
end;

3:
begin
rot.brush.Color := clMaroon;
gelb.brush.Color := clYellow;
gruen.brush.Color := $00004000;
form1.refresh;
i:=0;
end;

end;

end;

letsfetz 9. Feb 2006 19:03

Re: Ampel mit visible=true/false
 
Zitat:

Zitat von Nils_13
Müsst ihr das wirklich so machen ?

Das würde mich auch interessieren !

omata 9. Feb 2006 19:04

Re: Ampel mit visible=true/false
 
Hallo Jackel89,

oder nochmal anders...

Delphi-Quellcode:
  :
  private
    { Private-Deklarationen }
    AmpelStatus:byte;
    procedure Zeigen;
  :
procedure TForm.Zeigen;
begin
  Shape_rot.Visible:=(AmpelStatus in [1, 2]);
  Shape_gelb.Visible:=(AmpelStatus in [2, 4]);
  Shape_gruen.Visible:=(AmpelStatus = 3);
end;

procedure TForm.ButtonClick(Sender: TObject);
begin
  inc(AmpelStatus);
  if AmpelStatus = 5 then
    AmpelStatus:=1;
  Zeigen;
end;

procedure TForm.FormCreate(Sender: TObject);
begin
  AmpelStatus:=1;
  Zeigen;
end;

MfG
Thorsten

Jackel89 9. Feb 2006 19:05

Re: Ampel mit visible=true/false
 
jup danke erstmal :)

aber wir sollen das echt so machen :wink: hab ja schon alles durchsucht nach sonem programm aber absolut nichts mit visible:=true/false gefunden :(

Benedikt 9. Feb 2006 19:21

Re: Ampel mit visible=true/false
 
Hi,

dein Problem lässt sich gaaaanz einfach auch mit deinem Code lösen:
Du musst nur mal Klammern ( ) verwenden in deinen If-Abfragen...

Beispiel für deine erste Zeile:
Delphi-Quellcode:
if (Form1.sh_red.visible=true) and (Form1.sh_yellow.visible=true) and (Form1.sh_green.visible=false)
Ansonsten kann das Ganze nicht gehen da Delphi das nicht so interpretiert wie du es gedacht hast....


Außerdem würd ich den Code etwas besser strukturieren und einrücken, um ihn lesbarer zu machen.
Beispiel:

Delphi-Quellcode:
if (Form1.sh_red.visible=true) and (Form1.sh_yellow.visible=true) and (Form1.sh_green.visible=false) then
begin
   //Ampel von Rot/Gelb auf Grün
   Form1.sh_red.visible:=false;
   Form1.sh_yellow.visible:=false;
   Form1.sh_green.visible:=true;
end
else if ...
MfG Benedikt

ManuMF 9. Feb 2006 19:21

Re: Ampel mit visible=true/false
 
Hi Jackel89,

erst mal ein paar Tiips:
- If-Abfragen besser in Klammern
- If-Abfragen für einen Boolean-Wert (= true oder false) brauchen kein "= true", wenn auf true geprüft wird (siehe unten)
- neue Blöcke einrücken, erhöht Übersicht (siehe unten)
- das not ist so wie "= false", nur erkennt man es besser
- Die Prozedur switchClick "gehört" zu Form1. Das heißt, du musst in dieser Prozedur nicht jedes mal Form1. ... schreiben (siehe unten)

So, das habe ich getestet, und es funktioniert. Es gibt natürlich auch einfachere Methoden, aber da ihr es so machen sollt, habe ich mich daran gehalten ;-)

Delphi-Quellcode:
procedure TForm1.switchClick(Sender: TObject);
begin

  if (sh_green.Visible) then
  begin
    sh_green.Visible := false;
    sh_yellow.Visible := true;
  end
  else if (sh_yellow.Visible) and not (sh_red.Visible) then
  begin
    sh_yellow.Visible := false;
    sh_red.Visible := true;
  end
  else if (sh_red.Visible) and not (sh_yellow.Visible) then
  begin
    sh_yellow.Visible := true;
  end
  else if (sh_red.Visible) and (sh_yellow.Visible) then
  begin
    sh_red.Visible := false;
    sh_yellow.Visible := false;
    sh_green.Visible := true;
  end;
end;
Gruß,
ManuMF

[edit] Ist ja so ähnlich wie von Benedikt. Wo war aber der Kasten?[/edit]

Nils_13 9. Feb 2006 19:31

Re: Ampel mit visible=true/false
 
Wie umständlich, die Shapefarben schnell verändern und das wars doch schon.

ManuMF 9. Feb 2006 19:34

Re: Ampel mit visible=true/false
 
Zitat:

Zitat von Nils_13
Wie umständlich, die Shapefarben schnell verändern und das wars doch schon.

Zitat:

Zitat von Jackel89
aber wir sollen das echt so machen :wink:

:?

Es gibt andere Möglichkeiten, aber das ist offenbar nicht die Aufgabenstellung.

Gruß,
ManuMF

Jackel89 9. Feb 2006 19:35

Re: Ampel mit visible=true/false
 
oh man es lag echt nur an den klammern :wink:


ich werd das ganze denk ich nochmal überarbeiten und die anderen methoden ausprobieren!

vielen dank :-D

@Nils_13: joa hab mich auch gewundert warum wir das so machen sollen! naja vielleicht ja weil wir vorher schon mit Turbo Pascal gearbeitet haben und das dann mit den komplizierten, verschachtelten IF - THEN - ELSE Befehlen nochmal üben sollen... keine ahnung!


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:52 Uhr.
Seite 1 von 2  1 2      

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