Zitat von
sirius:
@Muetze: So richtig kann ich deine Erklärung nicht nachvollziehen.
Deshalb werde ich nie Tutorials schreiben: ich kann nicht erklären.
Zitat von
sirius:
Folgendes funktioniert ja:
1. aus dem Record eine Klasse machen
Du bekommst die Instanz und dadurch wird nur der Instanz dieser Wert zugewiesen. Es wird aber kein Setter aufgerufen. Und genau das ist das Problem bei dem Record. Dein Beispiel braucht auch kein Setter, da du mit dem Getter die Instanz bekommst und darauf kann er frei schalten und walten - Delphi hat also einen direkten Ansprechpartner zum setzen der letzten Ebene (Data1).
Der Setter ist in deinem Beispiel sogar gefährlich: Im Normalfall legt sich TMyObject die Instanz von TMyData an und hält diese die Lebzeit lang. Von daher wäre es mehr als tödlich wenn jemand dir von aussen direkt eine andere Instanz oder Nil unterschiebt. Von daher sind solche Properties generell eigentlich nur-lesen Eigenschaften. Und bei Komponenten etc. wird explizit ein Setter definiert um darin mit z.B. Assign() die Werte der Instanz zu übernehmen - aber niemals die Instanz!
Zitat von
sirius:
2. ein dynmaischer Record:
Wie ich oben schon geschrieben hatte: wenn es ein Pointer auf den Record ist, dann hat keiner ein Problem. Auch hier kann Delphi direkt die Werte setzen. Auch hier wird im Normalfall kein Setter gebraucht, es reicht eine r/o property.
Für beide gilt: in beiden Fällen bekommst Delphi einen Zeiger auf die Zieldaten und nicht direkt die Daten in die der Nutzer schreiben möchte. Von daher kann Delphi dies erledigen, da die temporäre Variable (result vom Getter) immer nur eine Adresse enthält, nicht aber die direkten Daten, wie es bei einem direkten Record (Ausgangsfall) ist.