Man kann das folgende machen:
Code: Alles auswählen
procedure Foo;
type
PRect = ^TRect;
begin
PRect(@SomeObj.Rect)^.Top := 42;
end;
Das gesagt. das funktioniert nur (wie PascalDragon schon erwähnt hat) wenn die property direkt ein Feld referenziert. Außerdem, wenn die property einen setter hat, kompiliert das zwar, ist aber letztendlich kaputter code, weil der setter umgangen wird (und damit potentiell error checking, seiteneffekte, etc).
Beispiel:
Code: Alles auswählen
TTest = class
FInternalMemory: Array of Array of Byte;
FSize: TPoint;
procedure SetSize(const AValue: TPoint);
...
property Size: TPoint read FSize write SetSize;
...
procedure TTest.SetSize(const AValue: TPoint);
begin
SetLength(FInternalMemory, AValue.X, AValue.Y);
FSize := AValue;
end;
Wenn man hier jetzt via pointern FSize ändert, würde die interne memory nicht gereallocated werden, und man wäre in einem kaputten state der über kurz oder lang wahrscheinlich in einer segfault endet. Damit lassen sich übringens auch read only properties beschreiben.
Also auch wenn es möglich ist solche schweinereien über pointer zu machen, wäre ich da ganz ganz vorsichtig. Wenn ein setter dahinter steht, oder schlimmer noch, die property read only ist, dann macht man definitiv etwas das die komponente eigentlich nicht erlauben will