Apfel: DELPHI

unit Ampel;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Rot_sh: TShape;
    Gelb_sh: TShape;
    Gruen_sh: TShape;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
if TForm1.button1click
   THEN
       if (Rot_sh.Brush.Color:=clred) And (gelb_sh.Brush.Color:=clsilver)
                                      And (gruen_sh.Brush.color:=clsilver)
          then gelb_sh.Brush.color:=clyellow;
end;

end.

des is delphi*g* und ich hab da son problem weil der immer eine fehlermeldung ausgibt, dass bei 'then ' 'not enough actual parameters' sind ich hab delphi erst grad nagefangen zu lernen inner schule und hab keine ahnung was das zu bedeuten hat, denn das hat mir der lehrer leider net erklärt. der meinte bloß: programmiert mal ein ampelprogramm mit einem button und jedesmal wenn man auf den button klickt sollen die drei shapes die farben in ampelreihenfolge ändern. jo und wir sollen irgendwie if-then-else oder case-of benutzen...die frage ist bloß wie....kann mir jemand helfen?

  1. procedure TForm1.Button1Click(Sender: TObject);
    begin
      if (Rot_sh.Brush.Color = clred) And (gelb_sh.Brush.Color = clsilver) And (gruen_sh.Brush.color = clsilver)
       then gelb_sh.Brush.color:=clyellow;
    end;

    Glaub ich :)

    cu RFZ

    1. Danke super nett!!! es klappt!!! dann werd ich mich  jetzt mal daran machen es zu verstehen zu versuchen und danach dann case of ausprobieren vielen dank!!
      cu apfel

      1. Hallo Apfel,

        dann werd ich mich  jetzt mal daran machen es zu verstehen zu versuchen

        Ja, das sind so die grundliegenden Konzepte, die in jeder Programmiersprache vorkommen (auch wenn Delphi in der Schreibweise natürlich wie immer etwas seltsam ist), die aber in der Schule nie gelehrt werden. Wahrscheinlich verstehen das die meisten Lehrer selbst nicht.

        Das Konzept der Variablen habt ihr ja sicher bereits besprochen. Variablen sind "Kisten", in die man irgend etwas "rein" legen kann (zuweisen), um es später wieder "raus" zu nehmen (zugreifen, auslesen).

        Wahrscheinlich kennst du auch bereits das Konzept der Variablen- und Datentypen. Die Kisten haben nämlich ganz bestimmte "Formen", so dass nur ein bestimmter Typ von Werten "rein" passt: In manchen Variablen kann man nur ganze Zahlen zwischenspeichern (integer/int), in anderen kann man immerhin schon Bruchzahlen speichern (real/float) und wieder andere können Zeichenketten, also Wörter oder Sätze aufnehmen (string). Andere wichtige Datentypen sind: Wahrheitswerte, also eins aus {"wahr","falsch"} (boolean/bool) und in deinem Fall taucht noch der Datentyp "Farbe" auf (TColor).

        Was dann die meisten Lehrer verschweigen, ist das Prinzip der Operatoren. Diese "Zauberzeichen" wie := und =, die du verwechselt hast, sind nämlich nicht einfach irgendwelche Füllzeichen, sondern man nennt sie Operatoren. Andere Operatoren wären Plus (+), Minus (-), mal (*), geteilt (/) oder Modulus (mod bzw. %). Ein Operator zeichnet sich durch folgendes aus:

        • Der Operator wird auf ein oder zwei (manchmal auch drei) Operanden Angewendet. In Delphi gibt es praktisch nur zweistellige Operatoren. Diese Operatoren werden (wie üblich) "infix" geschrieben, d.h. zwischen die beiden Operanden, auf die sie Angewendet werden. Beispiel:

        gelb_sh.Brush.color := clyellow;

        Hier steht der Operator (:=) zwischen seinen beiden Operanden.

        • Der Operator kann einen Rückgabewert haben, d.h. wenn du schreibst: "Operand Operator Operand", dann hat das ganze wieder einen Wert. Beispiel: In "3 + 2" wird der Operator "Plus" auf die Operanden 3 und 2 angewendet. Der Sinn an dem Plus-Operator ist, dass der *gesamte* Ausdrück "3 + 2" selbst einen Wert hat, nämlich 5. Nicht alle Operatoren haben allerdings Rückgabewerte.

        • Der Operator kann außerdem Nebenwirkungen haben. Beispiel:

        gelb_sh.Brush.color := clyellow;

        Diese Anweisung hat zwei Nebenwirkungen: Erstens wird der mittlere Kreis sofort nach der Ausführung dieser Anweisung gelbt. Zweitens wird der Wert der Variablen (eigentlich: Eigenschaft) "gelb_sh.Brush.color" auf "clYellow" gesetzt. Wenn du also beispielsweise nach dieser Anweisung den Wert von gelb_sh.Brush.color an rot_sh.Brush.color zweist, dann wird auch der obere Kreis gelb. Hier gilt aber auch: nicht alle Operatoren haben Nebenwirkungen.

        Konkret heißt das in deinem Fall:

        Du schreibst: "if Bedingung then  Anweisung;"

        Für "Bedingung" musst du jetzt etwas einsetzen, das entweder "wahr" oder "falsch" ist, also einen Bool'schen Wert. Du schreibst statt dessen aber: "Bedingung1 and Bedingung2 and Bedingung3". Das Schlüsselwort "and" ist ein Operator, genauso wie + und -. Dieser Operator erwartet zwei Bool'sche Werte und gibt einen Boolschen Wert zurück, ohne Nebenwirkungen. Dass er einen Boolschen Wert zurück gibt ist schon mal gut, denn genau das brauchst du ja für deine if-Klausel.

        Jetzt müssen aber auch noch die Einzelbedingungen "Bedingung1" bis "Bedingung3" Bool'sche Werte sein (d.h. sie müssen vom Typ "boolean" sein), denn sonst kann der and-Operator damit nichts anfangen. Für die erste Teilbedingung wolltest du zuerst schreiben:

        "rot_sh.Brush.Color := clred"

        Hier hast du allerdings das Problem, dass ':=' der Zuweisungsoperator ist. Dieser Zuweisungsoperator hat die Nebenwirkung, dass dem linken Operand der Wert des rechten Operanden zugewiesen wird. Einen Rückgabetyp hat der Zuweisungsoperator in Delphi allerdings nicht (im Gegensatz zu vielen anderen Programmiersprachen. Das ist oft sehr praktisch, hätte dich in diesem Fall aber nur noch mehr verwirrt, weil du dann keine Fehlermeldung bekommen hättest, das Programm aber fehlerhaft gelaufen wäre.)

        RFZ hat dich korrigiert, dass es richtigerweise heißen muss:

        "Rot_sh.Brush.Color = clred"

        Hier verwendest du nicht mehr den Zuweisungsoperator, sondern den Vergleichsoperator '='. Dieser Vergleichsoperator hat keine Nebenwirkungen, dafür aber einen Rückgabewert: Falls die beiden Operanden, auf die er angewendet wird, den gleichen Wert haben, so ist der Rückgabewert des Vergleichsoperators "wahr", andernfalls "falsch". In beiden Fällen wird also ein Bool'scher Wert zurückgegeben und das ist genau das, was du haben willst. Denn wenn du die anderen beiden Teilbedingungen entsprechend umformulierst, dann hast du drei Bool'sche Werte, mit denen die and-Operatoren etwas anfangen können. Der Rückgabewert der and-Operatoren ist dann wieder ein Bool'scher Wert und dieser Wert entscheidet, welcher Zweig der if-Klausel ausgeführt wird.

        Falls ich dich jetzt komplett verwirrt habe, kann ich dich trösten: Diese beiden Operatoren verwechsle ich auch immer wieder. Wenn du mal noch eine andere Programmiersprache lernst, wird es dir noch schlimmer gehen: Der Zuweisungsoperator wird nämlich meistens nicht wie in Delphi/Pascal als ':=' geschrieben, sondern als einfaches '=', so wie in Delphi der Vergleichsoperator. Damit man die beiden aber trotzdem auseinander halten kann, wird der Vergleichsoperator meistens als '==' geschrieben. Wenn ich vorübergehend von der einen Sprache in die andere wechsle, komme ich da jedes mal durcheinander.

        Viel Erfolg,
        Robert

        1. danke für die lange antwort!
          unser lehrer hat uns zwar noch nichts zu den variabeln und datentypen gesagt , aber ich hoffe, dass wird er noch tun...

  2. So wärs dann mit case, Ampelstellung ist einfach nen Integer (unter var Form1... definiert, und muss am anfang irgendeinen Wert bekommen :)):

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      case Ampelstellung of
      1: begin
          // Anweisungen für grün
          Ampelstellung := 2
         end;
      2: begin
          // Anweisungen für gelb
          Ampelstellung := 3
         end;
      3: begin
          // Anweisungen für rot
          Ampelstellung := 4
         end;
      4: begin
          // Anweisungen für rot-gelb
          Ampelstellung := 1
         end;
      end;
    end;

    Viel Spass!

    cu RFZ