Robert Bamler: DELPHI

Beitrag lesen

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