Stop zwischen if Befehlen

Für Fragen von Einsteigern und Programmieranfängern...
Bramanti
Beiträge: 6
Registriert: So 11. Jan 2009, 12:18

Stop zwischen if Befehlen

Beitrag von Bramanti »

Hallo,
ja also ich bin ein vollständiger Anfänger was programmieren angeht, also entschuldigt meine vielleicht dämliche Frage.
Jedenfalls haben wir in der Schule mit Pascal bzw. mit Lazarus begonnen und sollten nun eine Ampel programmieren. Ich hab mir zu Hause das Porgramm geholt und wollte das selbe hier direkt nochmal machen nun hab ich folgednes Problem:
Das ist der Code der beim Button Click ausgeführt werden soll:

Code: Alles auswählen

if Shape1.brush.color=clred then
  begin
  Shape1.brush.color:=clwhite ;
  Shape2.brush.color:=clyellow  ;
  end;
  if Shape2.brush.color=clyellow then
  begin
  Shape2.brush.color:=clwhite  ;
  Shape3.brush.color:=clgreen ;
  end;
   if Shape3.brush.color=clgreen then
  begin
  SHape3.Brush.color:=clwhite ;
  Shape2.Brush.color:=clyellow;
  Shape1.brush.color:=clred;
  end;
  if
 
  ((Shape2.Brush.color=clyellow) and (Shape1.brush.color=clred))
 
then
Shape2.Brush.color:=clwhite;


mein Problem ist das alles auf einmal ausgeführt wird und nicht so wie ich das will die Ampel bei Knopfdruck erst auf gelb dann auf grün etc. schaltet. Nur verstehe ich nicht wieso, weil nach einer solchen Statusabfrage sollte doch einfach die dazugehörige Aktion gestartet werden und bei erneutem drücken das ganze nochmal abgefragt werden etc.
Ich hoffe ihr könnt mir weiterhelfen.
Zuletzt geändert von monta am So 11. Jan 2009, 13:01, insgesamt 1-mal geändert.
Grund: [code=laz][/code] gesetzt.

hanibal
Beiträge: 369
Registriert: Sa 3. Mär 2007, 16:03
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Bramsche (Emsland)

Re: Stop zwischen if Befehlen

Beitrag von hanibal »

das kann ja auch nicht funktionieren, weil das alles nacheinander ableuft, wenn z,b. Shape1.brush.color=clred ist dann wird Shape2.brush.color:=clyellow. aber danach wird abgefragt, ob shape 2 gelb ist, was es auch ist. also wird der nächste schritt gemacht, usw.

mach einfach mal

Code: Alles auswählen

if Shape1.brush.color=clred then
begin
Shape1.brush.color:=clwhite ;
Shape2.brush.color:=clyellow ;
end
else
if Shape2.brush.color=clyellow then
begin
Shape2.brush.color:=clwhite ;
Shape3.brush.color:=clgreen ;
end
else
if Shape3.brush.color=clgreen then
begin
[...]


das bewirkt, das immer wenn das jeweilige shape die farbe nicht hat, die nächste abfrage abgearbeitet wird, und nur dann.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Stop zwischen if Befehlen

Beitrag von Christian »

In welcher Schule bist du ?
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Bramanti
Beiträge: 6
Registriert: So 11. Jan 2009, 12:18

Re: Stop zwischen if Befehlen

Beitrag von Bramanti »

Christian hat geschrieben:In welcher Schule bist du ?

du hast ne pn

@hanibal vielen Dank

Bramanti
Beiträge: 6
Registriert: So 11. Jan 2009, 12:18

Re: Stop zwischen if Befehlen

Beitrag von Bramanti »

jetzt hab ich's so:

Code: Alles auswählen

if Shape1.brush.color=clred then
begin
Shape1.brush.color:=clwhite ;
Shape2.brush.color:=clyellow ;
end
else
if Shape2.brush.color=clyellow then
begin
Shape2.brush.color:=clwhite ;
Shape3.brush.color:=clgreen ;
end
else
if Shape3.brush.color=clgreen then
begin
Shape3.Brush.color:=clwhite ;
Shape2.brush.color:=clyellow ;
Shape1.brush.color:=clred ;
end
else
if ((Shape2.brush.color=clyellow) and (Shape1.brush.color=clred))
then
Shape2.brush.color:=clwhite ;


jedoch hab ich nun das Problem das die Ampel von gelb rot nicht auf rot sondern auf gelb springt. Wie kann ich den Fehler beheben?

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Stop zwischen if Befehlen

Beitrag von theo »

Willst du nicht lieber ein Status-Flag halten? Den Zustand über die Farben zu erkennen ist doch ein bisschen verwirrend oder?

Bramanti
Beiträge: 6
Registriert: So 11. Jan 2009, 12:18

Re: Stop zwischen if Befehlen

Beitrag von Bramanti »

theo hat geschrieben:Willst du nicht lieber ein Status-Flag halten? Den Zustand über die Farben zu erkennen ist doch ein bisschen verwirrend oder?

leider weiß ich nichteinmal was ein Status Flag überhaupt ist :oops:

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Stop zwischen if Befehlen

Beitrag von theo »

Bramanti hat geschrieben:
theo hat geschrieben:Willst du nicht lieber ein Status-Flag halten? Den Zustand über die Farben zu erkennen ist doch ein bisschen verwirrend oder?

leider weiß ich nichteinmal was ein Status Flag überhaupt ist :oops:


Statt die Farben zu vergleichen, könntest du eine Variable halten, welche den Status speichert.
Das kann im einfachsten Fall ein integer sein, welcher dann 0,1 oder 2 ist (rot, gelb, grün).

Dein Problem kommt ja daher, das Shape2 bei Rot UND Grün Gelb gelb wird, und sich darüber der Zustand nicht eindeutig erkennen lässt.

Bramanti
Beiträge: 6
Registriert: So 11. Jan 2009, 12:18

Re: Stop zwischen if Befehlen

Beitrag von Bramanti »

theo hat geschrieben:
Bramanti hat geschrieben:
theo hat geschrieben:Willst du nicht lieber ein Status-Flag halten? Den Zustand über die Farben zu erkennen ist doch ein bisschen verwirrend oder?

leider weiß ich nichteinmal was ein Status Flag überhaupt ist :oops:


Statt die Farben zu vergleichen, könntest du eine Variable halten, welche den Status speichert.
Das kann im einfachsten Fall ein integer sein, welcher dann 0,1 oder 2 ist (rot, gelb, grün).

Dein Problem kommt ja daher, das Shape2 bei Rot UND Grün Gelb gelb wird, und sich darüber der Zustand nicht eindeutig erkennen lässt.

hab ich nach Einführung der Variablen nicht das selbe Problem?
Und es wird bei Grün ja nicht nur gelb sondern gelb rot und die zwei unterschiedlichen Zustände habe ich ja mit and gekennzeichnet. Und müsste es wenn es die zwei unterschiedlichen Zustände nicht erkennt nicht grün werden?

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Stop zwischen if Befehlen

Beitrag von theo »

Bramanti hat geschrieben:hab ich nach Einführung der Variablen nicht das selbe Problem?
Und es wird bei Grün ja nicht nur gelb sondern gelb rot und die zwei unterschiedlichen Zustände habe ich ja mit and gekennzeichnet. Und müsste es wenn es die zwei unterschiedlichen Zustände nicht erkennt nicht grün werden?


Es wird einfach übersichtlicher.
Dein letzter "Fall"

end
else
if ((Shape2.brush.color=clyellow) and (Shape1.brush.color=clred))

Kommt ja gar nie zum Zuge, weil immer eine der vorherigen Bedingungen zutrifft, oder?
Dort müsstest du das else nicht voranstellen.

Aber ich finde das ganze zu undurchsichtig. Deshalb der Vorschlag.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Stop zwischen if Befehlen

Beitrag von theo »

Ich hab dir mal ein Beispiel gemacht, wie man das einigermassen sauber lösen könnte, damit keine unnötigen Probleme entstehen.
Wenn du noch Zwischenzustände brauchst (azGelbRot etc), baust du die nach dem selben Muster ein.

Code: Alles auswählen

unit Unit1; 
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  ExtCtrls;
 
type
 
  TAmpelZustand=(azGruen,azGelb,azRot);
 
  { TForm1 }
 
  TForm1 = class(TForm)
    LichtRot: TShape;
    LichtGelb: TShape;
    LichtGruen: TShape;
    Timer1: TTimer;
    procedure FormShow(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { private declarations }
    fAmpelZustand:TAmpelZustand;
  public
    { public declarations }
    procedure SetzeAmpelFarben;
  end;
 
 
 
var
  Form1: TForm1;
 
implementation
 
{ TForm1 }
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if fAmpelzustand=High(TAmpelZustand) then
      fAmpelZustand:=Low(TAmpelZustand) else
      fAmpelZustand:=Succ(fAmpelZustand);
  SetzeAmpelFarben;
end;
 
procedure TForm1.FormShow(Sender: TObject);
begin
  SetzeAmpelFarben;
end;
 
procedure TForm1.SetzeAmpelFarben;
begin
  case fAmpelzustand of
  azGruen:
    begin
      LichtRot.Brush.Color:=clBlack;
      LichtGelb.Brush.Color:=clBlack;
      LichtGruen.Brush.Color:=clGreen;
    end;
  azGelb:
    begin
      LichtRot.Brush.Color:=clBlack;
      LichtGelb.Brush.Color:=clYellow;
      LichtGruen.Brush.Color:=clBlack;
    end;
  azRot:
    begin
      LichtRot.Brush.Color:=clRed;
      LichtGelb.Brush.Color:=clBlack;
      LichtGruen.Brush.Color:=clBlack;
    end;
   end;
end;
 
initialization
  {$I unit1.lrs}
 
end.

Bramanti
Beiträge: 6
Registriert: So 11. Jan 2009, 12:18

Re: Stop zwischen if Befehlen

Beitrag von Bramanti »

also ich habs jetzt so gemacht

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
 
if (Shape1.brush.color=clred) and (Shape2.brush.color=clwhite)
then
begin
Shape1.brush.color:=clwhite ;
Shape2.brush.color:=clyellow ;
end
else
if (Shape2.brush.color=clyellow) and (Shape1.brush.color=clwhite)
then
begin
Shape2.brush.color:=clwhite ;
Shape3.brush.color:=clgreen ;
end
else
if Shape3.brush.color=clgreen then
begin
Shape3.Brush.color:=clwhite ;
Shape2.brush.color:=clyellow ;
Shape1.brush.color:=clred ;
end
else
if ((Shape2.brush.color=clyellow) and (Shape1.brush.color=clred))
then
Shape2.brush.color:=clwhite ;
 
 
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if (Shape1.brush.color=clred) and (Shape2.brush.color=clwhite)
then
begin
Shape1.brush.color:=clwhite ;
Shape2.brush.color:=clyellow ;
end
else
if (Shape2.brush.color=clyellow) and (Shape1.brush.color=clwhite)
then
begin
Shape2.brush.color:=clwhite ;
Shape3.brush.color:=clgreen ;
end
else
if Shape3.brush.color=clgreen then
begin
Shape3.Brush.color:=clwhite ;
Shape2.brush.color:=clyellow ;
Shape1.brush.color:=clred ;
end
else
if ((Shape2.brush.color=clyellow) and (Shape1.brush.color=clred))
then
Shape2.brush.color:=clwhite ;
end;


weil ich bei deinem Vorschlag ein paar Befehle nicht kannte.
Wie kann ich denn den Timer für einzelne Shapes synchronisieren?

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Stop zwischen if Befehlen

Beitrag von theo »

Bramanti hat geschrieben:weil ich bei deinem Vorschlag ein paar Befehle nicht kannte.

Dann frag doch oder schau nach: http://www.delphibasics.co.uk/
Du hast nun zweimal denselben Code. Da macht man eine Funktion draus.
Ausserdem ist es immer noch kompliziert. Was verstehst du denn an meinem Vorschlag nicht?

Bramanti hat geschrieben:Wie kann ich denn den Timer für einzelne Shapes synchronisieren?

Bei jedem Zustand den Timer Interval setzen.

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Stop zwischen if Befehlen

Beitrag von MAC »

Ich bin zwar ein "noob" und wusste nochnedmal was nen shape ist :))))))))
Aber ich würde es folgendermaßen empfelen:



Code: Alles auswählen

var
  nr : integer;
begin
nr := nr + 1;
if nr >= 3 then nr := 0 ;
if nr = 0 then
   begin
   Shape1.brush.color := clred;
   Shape2.brush.color := clwhite;
   Shape3.brush.color := clwhite;
   end;
 
if nr = 1 then
   begin
   Shape1.brush.color := clwhite;
   Shape2.brush.color := clyellow;
   Shape3.brush.color := clwhite;
   end;
 
if nr = 2 then
   begin
   Shape1.brush.color := clwhite;
   Shape2.brush.color := clwhite;
   Shape3.brush.color := clgreen;
   end;
 
end;


so sieht das jetzt einfach und übersichtlich aus.
Zugegeben ich müsste nur immer das letzte shape weis machen und ned alle aber egal.
Wenn du willst das die ampel

rot
rot gelb
grün
gelb

ist musst du es eben mir 3 variablen machen...

Code: Alles auswählen

Signatur := nil;

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Stop zwischen if Befehlen

Beitrag von pluto »

@Bramanti
Wo ist denn jetzt dein Problem ? Theos Code ist doch GUT... Besser geht es doch gar nicht mehr. Wir könnten dir auch ein Code zuverfügung stellen, den du wahrscheinlich gar nicht verstehen würdest.
Der Case Befehl ist recht einfach. Eine Variante vom IF. Nur in diesen Fall angebrachter weil es wesentlich übersichtlicher ist.
Es gibt viele Wege das Problem zu lösen. Ich würde z.b. daraus gleich eine kleine Komponente machen *G*. Wobei ich glaube es gibt da schon eine LED Komponente. Evlt. kannst du sie ja erweitern.
MFG
Michael Springwald

Antworten