Winni hat geschrieben: Sa 22. Jan 2022, 16:47
Der Compiler ist wieder einmal zu doof, die Adresse einer property zu finden:
Code: Alles auswählen
Error: Can't take the address of constant expressions
Das hat nichts mit “zu doof” zu tun, sondern es ist eine Design Entscheidung der Sprache, dass du nicht die Adresse einer Eigenschaft nehmen kannst. Es würde nämlich letztlich davon abhängen, ob die Eigenschaft auf ein Feld oder eine Funktion geht, denn nur bei ersterer könnte man zuverlässig eine Adresse nehmen (der Rückgabewert einer Funktion könnte komplette berechnet sein, den Wert also zu ändern würde nichts bringen, da er nur temporär ist). Da der Sinn von Eigenschaften ist, dass der Zugriff auf die darunterliegenden Daten möglichst transparent für den Nutzer erfolgt, ist es entsprechend nicht sinnvoll von Nutzern zu verlangen, dass sie darauf achten, da dies der Entwickler der Klasse mit der Eigenschaft jederzeit ändern kann. Dies würde dann dazu führen, dass dein Code nicht mehr kompiliert. Deswegen ist das einfach nicht erlaubt.
theo hat geschrieben: Sa 22. Jan 2022, 15:26
Es gibt dabei noch eine Merkwürdigkeit:
Wenn ich auf "insert" -> "Finde Deklaration von Insert" gehe, dann springt er auf TWinControl private:
Code: Alles auswählen
procedure Insert(AControl: TControl; Index: integer);
Nicht so gut, oder?
Lazarus 2.3.0 rmain-2_3-288-gd5fe15d448 FPC 3.2.2 x86_64-linux-gtk2
Das liegt wahrscheinlich daran, dass es
Insert für Strings und dynamische Arrays nicht als Prozedurendeklaration an sich gibt, das es ein Compilerintrinsic gibt. Das heißt, die einzige Deklaration von
Insert, die aus Sicht der CodeTools
wirklich existiert ist die von
TWinControl.Insert und zu der geht die Codenavigation dann. Das sollte wahrscheinlich als Bug gemeldet werden...
