Zitat von
Ares:
Bei der Anweisung myObject.Data.Data1 := true; kommt es wie beschrieben zu dem Fehler "Der linken Seite kann nichts zugewiesen werden". Ich verstehe nicht warum.
Die Property ist doch klar mit write als schreibbar markiert. Warum kann Data1 also nichts zuweisen? Mir ist dieses Problem mit Records vorher noch nie aufgefallen, allerdings habe ich auch noch nie auf diesen speziellen Fall geachtet...
Delphi geht logisch vor. Wenn du folgenden Konstrukt hast, dann geht Delphi logisch so vor:
myObject.Data.Data1 := true;
1. myObject ermitteln - habe ich
2. Eigenschaft Data ermitteln - also Getter aufrufen. Also bekomme ich als Result vom Getter eine Kopie des Records.
3. Diese Kopie lokal (vergleichbar mit einer lokalen Variablen ablegen).
4. Den Wert des Elementes Data1 aus dieser lokalen Variable verarbeiten.
Der Compiler weiss hierbei aber, dass es sich um eine lokale Variable handelt und markiert sie intern als konstant. Erstens weil es eine Kopie ist (der Getter hat den Record im Result und nicht als Pointer auf, somit eine Kopie). Und zum anderen kannst du keinen Teil zuweisen. Du hast einen Setter definiert für den Record - aber halt für den Record und nicht für das eine Element des Records. Was müsste Delphi machen um deine Anweisung umzusetzen?
1. Record holen (Kopie durch Getter)
2. die lokale Kopie abändern (also Data1 zuweisen)
3. die komplette Kopie durch den Setter wieder zuweisen.
Grundlegend: Was soll denn mit den anderen Elementen im Record geschehen wenn du nur ein Element zuweist, aber du immer nur einen Teil veränderst?
Anders gefragt: Wenn du dir ein Packet kommen lässt und darin ist eine Tasse und ein Teller. Der Postbote bringt dir das Packet und du willst aber nur die Tasse haben und den Rest wieder zurück schicken - bzw. du willst nur die Tasse annehmen. Da zeigt dir der Postbote auch einen Vogel. Entweder du nimmst das Packet ganz an und packst es aus und dann erneut neu ein und gibst es als ganzes (Packet) wieder bei der Post ab. Dann kannst du es aber nicht mehr unfrei zurück senden sondern musst erneut bezahlen.
Zitat von
Ares:
Wie kann ich also Data.Data1 etwas zuweisen?
Gar nicht. Auslesen kein Problem, aber zuweisen: Problem. Entweder eine nur-lesen Property und eine Methode als Setter oder definierst den Inhalt des Records als einzelne Properties.